feat(n7web): add pet NFC workflow and glass UI

This commit is contained in:
Miayui
2026-09-14 15:16:02 +08:00
parent 812e67422d
commit aa6f59d3a6
20 changed files with 2724 additions and 102 deletions
+57 -2
View File
@@ -60,8 +60,8 @@ def test_unified_console_exposes_device_id_based_nfc_authorization() -> None:
assert '.v2-nfc-command-list' in styles
assert '.v2-nfc-command-option' in styles
assert '.v2-nfc-select-all' in styles
assert 'self-extension.js?v=gscu-tcp-44' in html
assert 'self-extension.css?v=gscu-tcp-43' in html
assert 'self-extension.js?v=pet-acrylic-48' in html
assert 'self-extension.css?v=pet-acrylic-48' in html
def test_unified_console_exposes_gscu_tcp_configuration_and_actions() -> None:
@@ -121,14 +121,69 @@ def test_server_exposes_nfc_snapshot_through_same_origin_extension_api() -> None
server = (ROOT / "src" / "cognitive_agent" / "server.py").read_text(encoding="utf-8")
assert 'nfc = NfcReaderService()' in server
assert 'pets = PetCardService(' in server
assert 'path == "/api/extension/nfc/status"' in server
assert 'path == "/api/extension/pets"' in server
assert '"pet_cards": self.pets.snapshot()' in server
assert 'path == "/api/extension/peripherals"' in server
assert '"nfc": self.nfc.snapshot()' in server
assert 'SeatDemoHandler.nfc.start()' in server
assert 'SeatDemoHandler.pets.start()' in server
assert 'SeatDemoHandler.pets.close()' in server
assert 'SeatDemoHandler.nfc.close()' in server
assert "frame-src 'self' http://*:3001" in server
def test_homepage_exposes_durable_editable_pet_cards_and_nfc_only_binding() -> None:
script = source("self-extension.js")
styles = source("self-extension.css")
service = (ROOT / "src" / "cognitive_agent" / "application" / "pet_cards.py").read_text(
encoding="utf-8"
)
mqtt = (
ROOT / "src" / "cognitive_agent" / "infrastructure" / "can" / "mqtt_transport.py"
).read_text(encoding="utf-8")
assert 'class="v2-pet-card-region"' in script
assert 'data-pet-field="pet_name"' in script
assert 'data-pet-field="action"' in script
assert '<output>${card.nfc_id ?' in script
assert 'data-pet-open-nfc' not in script
assert 'data-nfc-pet-select' in script
assert 'data-nfc-bind-pet' in script
assert 'bind-current-nfc' in script
assert 'api(`pets/${encodeURIComponent(cardId)}`' in script
assert 'burst_count' in script
assert 'burst_window_ms' in script
assert 'label: "已发送 3 帧"' in script
assert 'MQTT PET CARD' not in script
assert 'data-pet-publish-note' not in script
assert '宠物名 <code>' not in script
assert '宠物动作 <code>' not in script
assert '卡片 ID <code>' not in script
assert 'n7/pet' in script
assert 'if (nextRevision < petCardSnapshot.revision) return false' in script
assert '.v2-pet-card-region' in styles
assert '.v2-pet-card-list' in styles
assert '.v2-nfc-pet-binding' in styles
assert 'grid-template-columns: minmax(0, 1fr);' in styles
assert 'scrollbar-gutter: stable' in styles
assert 'backdrop-filter: blur(18px) saturate(1.35)' in styles
assert 'height: 58px' in styles
assert 'class PetCardService' in service
assert 'PET_MQTT_TOPIC = "n7/pet"' in service
assert 'def bind_current_nfc' in service
assert '"pet_name": str(card["pet_name"])' in service
assert '"nfc_id": nfc_id' in service
assert '"action": str(card["action"])' in service
assert 'PET_BURST_COUNT = 3' in service
assert 'PET_BURST_WINDOW_S = 1.0' in service
assert '"burst_complete"' in service
assert 'MQTT_PET_TOPIC = "n7/pet"' in mqtt
assert 'def publish_pet_message' in mqtt
def test_main_parsed_control_panel_renders_validated_infrared_operations() -> None:
console = source("console-v2.js")
styles = source("console-v2.css")