1
0
* polish: streamline nav, extract inline styles, improve tablet UX

- Restructure desktop nav from 8+ flat links + overflow dropdown into
  5 grouped dropdowns (Core, Agents, Intel, System, More) matching
  the mobile menu structure to reduce decision fatigue
- Extract all inline styles from mission_control.html and base.html
  notification elements into mission-control.css with semantic classes
- Replace JS-built innerHTML with secure DOM construction in
  notification loader and chat history
- Add CONNECTING state to connection indicator (amber) instead of
  showing OFFLINE before WebSocket connects
- Add tablet breakpoint (1024px) with larger touch targets for
  Apple Pencil / stylus use and safe-area padding for iPad toolbar
- Add active-link highlighting in desktop dropdown menus
- Rename "Mission Control" page title to "System Overview" to
  disambiguate from the chat home page
- Add "Home — Timmy Time" page title to index.html

https://claude.ai/code/session_015uPUoKyYa8M2UAcyk5Gt6h

* fix(security): move auth-gate credentials to environment variables

Hardcoded username, password, and HMAC secret in auth-gate.py replaced
with os.environ lookups. Startup now refuses to run if any variable is
unset. Added AUTH_GATE_SECRET/USER/PASS to .env.example.

https://claude.ai/code/session_015uPUoKyYa8M2UAcyk5Gt6h

* refactor(tooling): migrate from black+isort+bandit to ruff

Replace three separate linting/formatting tools with a single ruff
invocation. Updates tox.ini (lint, format, pre-push, pre-commit envs),
.pre-commit-config.yaml, and CI workflow. Fixes all ruff errors
including unused imports, missing raise-from, and undefined names.
Ruff config maps existing bandit skips to equivalent S-rules.

https://claude.ai/code/session_015uPUoKyYa8M2UAcyk5Gt6h

---------

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Alexander Whitestone
2026-03-11 12:23:35 -04:00
committed by GitHub
parent 708c8a2477
commit 9d78eb31d1
149 changed files with 884 additions and 962 deletions

View File

@@ -19,9 +19,9 @@ All methods return effects that can be logged, audited, and replayed.
import uuid
from abc import ABC, abstractmethod
from dataclasses import dataclass, field
from datetime import datetime, timezone
from datetime import UTC, datetime
from enum import Enum, auto
from typing import Any, Optional
from typing import Any
class PerceptionType(Enum):
@@ -74,7 +74,7 @@ class AgentIdentity:
id: str
name: str
version: str
created_at: str = field(default_factory=lambda: datetime.now(timezone.utc).isoformat())
created_at: str = field(default_factory=lambda: datetime.now(UTC).isoformat())
@classmethod
def generate(cls, name: str, version: str = "1.0.0") -> "AgentIdentity":
@@ -96,7 +96,7 @@ class Perception:
type: PerceptionType
data: Any # Content depends on type
timestamp: str = field(default_factory=lambda: datetime.now(timezone.utc).isoformat())
timestamp: str = field(default_factory=lambda: datetime.now(UTC).isoformat())
source: str = "unknown" # e.g., "camera_1", "microphone", "user_input"
metadata: dict = field(default_factory=dict)
@@ -129,9 +129,9 @@ class Action:
type: ActionType
payload: Any # Action-specific data
timestamp: str = field(default_factory=lambda: datetime.now(timezone.utc).isoformat())
timestamp: str = field(default_factory=lambda: datetime.now(UTC).isoformat())
confidence: float = 1.0 # 0-1, agent's certainty
deadline: Optional[str] = None # When action must complete
deadline: str | None = None # When action must complete
@classmethod
def respond(cls, text: str, confidence: float = 1.0) -> "Action":
@@ -163,14 +163,14 @@ class Memory:
content: Any
created_at: str
access_count: int = 0
last_accessed: Optional[str] = None
last_accessed: str | None = None
importance: float = 0.5 # 0-1, for pruning decisions
tags: list[str] = field(default_factory=list)
def touch(self) -> None:
"""Mark memory as accessed."""
self.access_count += 1
self.last_accessed = datetime.now(timezone.utc).isoformat()
self.last_accessed = datetime.now(UTC).isoformat()
@dataclass
@@ -180,7 +180,7 @@ class Communication:
sender: str
recipient: str
content: Any
timestamp: str = field(default_factory=lambda: datetime.now(timezone.utc).isoformat())
timestamp: str = field(default_factory=lambda: datetime.now(UTC).isoformat())
protocol: str = "direct" # e.g., "http", "websocket", "speech"
encrypted: bool = False
@@ -321,10 +321,9 @@ class TimAgent(ABC):
"state": self._state.copy(),
}
def shutdown(self) -> None:
def shutdown(self) -> None: # noqa: B027
"""Graceful shutdown. Persist state, close connections."""
# Override in subclass for cleanup
pass
class AgentEffect:
@@ -338,7 +337,7 @@ class AgentEffect:
- Training: Learn from agent experiences
"""
def __init__(self, log_path: Optional[str] = None) -> None:
def __init__(self, log_path: str | None = None) -> None:
self._effects: list[dict] = []
self._log_path = log_path
@@ -350,7 +349,7 @@ class AgentEffect:
"perception_type": perception.type.name,
"source": perception.source,
"memory_id": memory_id,
"timestamp": datetime.now(timezone.utc).isoformat(),
"timestamp": datetime.now(UTC).isoformat(),
}
)
@@ -361,7 +360,7 @@ class AgentEffect:
"type": "reason",
"query": query,
"action_type": action_type.name,
"timestamp": datetime.now(timezone.utc).isoformat(),
"timestamp": datetime.now(UTC).isoformat(),
}
)
@@ -373,7 +372,7 @@ class AgentEffect:
"action_type": action.type.name,
"confidence": action.confidence,
"result_type": type(result).__name__,
"timestamp": datetime.now(timezone.utc).isoformat(),
"timestamp": datetime.now(UTC).isoformat(),
}
)