forked from Rockachopa/Timmy-time-dashboard
Migrate from Hatchling to Poetry for dependency management, fixing the Docker build failure caused by .dockerignore excluding README.md that Hatchling needed for metadata. Poetry export strategy bypasses this entirely. Creative extras removed from main build (separate service). Docker changes: - Multi-stage builds with poetry export → pip install - BuildKit cache mounts for faster rebuilds - All 3 Dockerfiles updated (root, dashboard, agent) Bug fixes from tester audit: - TaskStatus/TaskPriority case-insensitive enum parsing - scrollChat() upgraded to requestAnimationFrame, removed duplicate - Desktop/mobile nav items synced in base.html - HTMX pointed to direct htmx.min.js URL - Removed unused highlight.js and bootstrap.bundle.min.js - Registered missing escalation/external task handlers in app.py Co-authored-by: Alexander Payne <apayne@MM.local> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
135 lines
6.6 KiB
HTML
135 lines
6.6 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en" data-bs-theme="dark">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover, interactive-widget=resizes-content" />
|
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
|
<meta name="theme-color" content="#080412" />
|
|
<title>{% block title %}Timmy Time — Mission Control{% endblock %}</title>
|
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;700&display=swap" rel="stylesheet" />
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous" />
|
|
<link rel="stylesheet" href="/static/style.css?v=4" />
|
|
{% block extra_styles %}{% endblock %}
|
|
<script src="https://unpkg.com/htmx.org@2.0.3/dist/htmx.min.js" crossorigin="anonymous"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/marked@15.0.7/marked.min.js"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/dompurify@3.2.4/dist/purify.min.js"></script>
|
|
</head>
|
|
<body>
|
|
<header class="mc-header">
|
|
<div class="mc-header-left">
|
|
<a href="/" class="mc-title">TIMMY TIME</a>
|
|
<span class="mc-subtitle">MISSION CONTROL</span>
|
|
</div>
|
|
|
|
<!-- Desktop nav -->
|
|
<div class="mc-header-right mc-desktop-nav">
|
|
<a href="/tasks" class="mc-test-link">TASKS</a>
|
|
<a href="/briefing" class="mc-test-link">BRIEFING</a>
|
|
<a href="/thinking" class="mc-test-link" style="color:#c084fc;">THINKING</a>
|
|
<a href="/swarm/mission-control" class="mc-test-link">MISSION CONTROL</a>
|
|
<a href="/swarm/live" class="mc-test-link">SWARM</a>
|
|
<a href="/spark/ui" class="mc-test-link">SPARK</a>
|
|
<a href="/marketplace/ui" class="mc-test-link">MARKET</a>
|
|
<a href="/tools" class="mc-test-link">TOOLS</a>
|
|
<a href="/swarm/events" class="mc-test-link">EVENTS</a>
|
|
<a href="/bugs" class="mc-test-link" style="color:#ff6b6b;">BUGS</a>
|
|
<a href="/lightning/ledger" class="mc-test-link">LEDGER</a>
|
|
<a href="/memory" class="mc-test-link">MEMORY</a>
|
|
<a href="/router/status" class="mc-test-link">ROUTER</a>
|
|
<a href="/grok/status" class="mc-test-link" style="color:#00ff88;">GROK</a>
|
|
<a href="/self-modify/queue" class="mc-test-link">UPGRADES</a>
|
|
<a href="/self-coding" class="mc-test-link">SELF-CODING</a>
|
|
<a href="/hands" class="mc-test-link">HANDS</a>
|
|
<a href="/work-orders/queue" class="mc-test-link">WORK ORDERS</a>
|
|
<a href="/creative/ui" class="mc-test-link">CREATIVE</a>
|
|
<a href="/voice/button" class="mc-test-link">VOICE</a>
|
|
<a href="/mobile" class="mc-test-link" title="Mobile-optimized view">MOBILE</a>
|
|
<a href="/mobile/local" class="mc-test-link" title="Local AI on iPhone">LOCAL AI</a>
|
|
<button id="enable-notifications" class="mc-test-link" style="background:none;cursor:pointer;" title="Enable notifications">🔔</button>
|
|
<span class="mc-time" id="clock"></span>
|
|
</div>
|
|
|
|
<!-- Mobile hamburger -->
|
|
<button class="mc-hamburger" id="hamburger-btn" aria-label="Menu">
|
|
<span></span><span></span><span></span>
|
|
</button>
|
|
</header>
|
|
|
|
<!-- Mobile slide-out menu -->
|
|
<div class="mc-mobile-overlay" id="mobile-overlay"></div>
|
|
<nav class="mc-mobile-menu" id="mobile-menu">
|
|
<div class="mc-mobile-menu-header">
|
|
<span class="mc-mobile-menu-title">NAVIGATE</span>
|
|
<span class="mc-time" id="clock-mobile"></span>
|
|
</div>
|
|
<a href="/" class="mc-mobile-link">HOME</a>
|
|
<a href="/tasks" class="mc-mobile-link">TASKS</a>
|
|
<a href="/briefing" class="mc-mobile-link">BRIEFING</a>
|
|
<a href="/thinking" class="mc-mobile-link">THINKING</a>
|
|
<a href="/swarm/mission-control" class="mc-mobile-link">MISSION CONTROL</a>
|
|
<a href="/swarm/live" class="mc-mobile-link">SWARM</a>
|
|
<a href="/spark/ui" class="mc-mobile-link">SPARK</a>
|
|
<a href="/marketplace/ui" class="mc-mobile-link">MARKET</a>
|
|
<a href="/tools" class="mc-mobile-link">TOOLS</a>
|
|
<a href="/swarm/events" class="mc-mobile-link">EVENTS</a>
|
|
<a href="/bugs" class="mc-mobile-link">BUGS</a>
|
|
<a href="/lightning/ledger" class="mc-mobile-link">LEDGER</a>
|
|
<a href="/memory" class="mc-mobile-link">MEMORY</a>
|
|
<a href="/router/status" class="mc-mobile-link">ROUTER</a>
|
|
<a href="/grok/status" class="mc-mobile-link">GROK</a>
|
|
<a href="/self-modify/queue" class="mc-mobile-link">UPGRADES</a>
|
|
<a href="/self-coding" class="mc-mobile-link">SELF-CODING</a>
|
|
<a href="/hands" class="mc-mobile-link">HANDS</a>
|
|
<a href="/work-orders/queue" class="mc-mobile-link">WORK ORDERS</a>
|
|
<a href="/creative/ui" class="mc-mobile-link">CREATIVE</a>
|
|
<a href="/voice/button" class="mc-mobile-link">VOICE</a>
|
|
<a href="/mobile" class="mc-mobile-link">MOBILE</a>
|
|
<a href="/mobile/local" class="mc-mobile-link">LOCAL AI</a>
|
|
<div class="mc-mobile-menu-footer">
|
|
<button id="enable-notifications-mobile" class="mc-mobile-link" style="background:none;border:none;cursor:pointer;width:100%;text-align:left;font:inherit;color:inherit;padding:inherit;">🔔 NOTIFICATIONS</button>
|
|
</div>
|
|
</nav>
|
|
|
|
<main class="mc-main">
|
|
{% block content %}{% endblock %}
|
|
</main>
|
|
|
|
<script>
|
|
// Clock
|
|
function updateClock() {
|
|
const t = new Date().toLocaleTimeString('en-US', { hour12: false });
|
|
const el = document.getElementById('clock');
|
|
const el2 = document.getElementById('clock-mobile');
|
|
if (el) el.textContent = t;
|
|
if (el2) el2.textContent = t;
|
|
}
|
|
setInterval(updateClock, 1000);
|
|
updateClock();
|
|
|
|
// Mobile menu
|
|
const hamburger = document.getElementById('hamburger-btn');
|
|
const overlay = document.getElementById('mobile-overlay');
|
|
const menu = document.getElementById('mobile-menu');
|
|
function toggleMenu() {
|
|
const open = menu.classList.toggle('open');
|
|
overlay.classList.toggle('open', open);
|
|
hamburger.classList.toggle('open', open);
|
|
document.body.style.overflow = open ? 'hidden' : '';
|
|
}
|
|
hamburger.addEventListener('click', toggleMenu);
|
|
overlay.addEventListener('click', toggleMenu);
|
|
|
|
// Highlight current page in mobile menu
|
|
document.querySelectorAll('.mc-mobile-link').forEach(function(a) {
|
|
if (a.getAttribute('href') === window.location.pathname) {
|
|
a.classList.add('active');
|
|
}
|
|
});
|
|
</script>
|
|
<script src="/static/notifications.js"></script>
|
|
</body>
|
|
</html>
|