Spaces:
Running
Running
Update scenarios and improve DNA evidence
Browse files- TODO.md +5 -4
- app.py +3 -1
- scenarios/art_gallery.json +50 -8
- scenarios/coffee_shop.json +39 -10
- scenarios/silicon_valley.json +30 -12
TODO.md
CHANGED
|
@@ -3,15 +3,16 @@
|
|
| 3 |
- make the rounds/points improve
|
| 4 |
- remove scroll bars
|
| 5 |
- players can't know there's more suspects down the list as we removed the scroll bar, can you scroll a bit down by default to show there's more cards down
|
|
|
|
| 6 |
|
| 7 |
|
| 8 |
-
- pre-generate suspects cartoony potraits
|
| 9 |
-
- find the texture missing
|
| 10 |
-
- sound/music
|
| 11 |
-
- eleven labs tts/voice
|
| 12 |
- typing effect
|
| 13 |
- mode selection
|
| 14 |
- numbered steps to launch game
|
|
|
|
|
|
|
|
|
|
|
|
|
| 15 |
- video embeded
|
| 16 |
- divider
|
| 17 |
- mcp showcase with title "try tools without playing"
|
|
|
|
| 3 |
- make the rounds/points improve
|
| 4 |
- remove scroll bars
|
| 5 |
- players can't know there's more suspects down the list as we removed the scroll bar, can you scroll a bit down by default to show there's more cards down
|
| 6 |
+
- find the texture missing
|
| 7 |
|
| 8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
- typing effect
|
| 10 |
- mode selection
|
| 11 |
- numbered steps to launch game
|
| 12 |
+
|
| 13 |
+
- pre-generate suspects cartoony potraits
|
| 14 |
+
- sound/music
|
| 15 |
+
- eleven labs tts/voice
|
| 16 |
- video embeded
|
| 17 |
- divider
|
| 18 |
- mcp showcase with title "try tools without playing"
|
app.py
CHANGED
|
@@ -263,7 +263,9 @@ def format_tool_response(tool_name, arg, result, scenario):
|
|
| 263 |
html += f"<div style='font-size:0.8em; color:#555'>Confidence: {result.get('confidence')}</div>"
|
| 264 |
|
| 265 |
elif tool_name == "get_dna_test":
|
| 266 |
-
|
|
|
|
|
|
|
| 267 |
|
| 268 |
if "matches" in result:
|
| 269 |
# Multiple matches
|
|
|
|
| 263 |
html += f"<div style='font-size:0.8em; color:#555'>Confidence: {result.get('confidence')}</div>"
|
| 264 |
|
| 265 |
elif tool_name == "get_dna_test":
|
| 266 |
+
# Get the label for the evidence item
|
| 267 |
+
evidence_label = scenario["evidence"]["dna_evidence"].get(arg, {}).get("label", arg)
|
| 268 |
+
title = f"🧬 DNA Result for {evidence_label}"
|
| 269 |
|
| 270 |
if "matches" in result:
|
| 271 |
# Multiple matches
|
scenarios/art_gallery.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
{
|
| 2 |
"case_id": "C99",
|
| 3 |
"title": "The Gallery Heist Gone Wrong",
|
| 4 |
-
"difficulty": "
|
| 5 |
"victim": {
|
| 6 |
"name": "Vincent Shaw",
|
| 7 |
"age": 55,
|
|
@@ -70,22 +70,45 @@
|
|
| 70 |
"footage_data": {
|
| 71 |
"office_cam": {
|
| 72 |
"9:50-10:10 PM": {
|
| 73 |
-
"visible_people": ["Vincent drinking wine", "Julian pouring more wine"],
|
| 74 |
"quality": "High",
|
| 75 |
-
"key_frame": "9:55 PM - Julian adds powder to glass"
|
| 76 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 77 |
}
|
| 78 |
},
|
| 79 |
"dna_evidence": {
|
| 80 |
"wine_glass": {
|
| 81 |
-
"
|
| 82 |
-
"
|
| 83 |
-
"
|
|
|
|
| 84 |
},
|
| 85 |
"poison_vial": {
|
|
|
|
| 86 |
"primary_match": "suspect_1",
|
| 87 |
"confidence": "99%",
|
| 88 |
"notes": "Found in Julian's pocket"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 89 |
}
|
| 90 |
},
|
| 91 |
"alibis": {
|
|
@@ -93,12 +116,31 @@
|
|
| 93 |
"contact": "+1-555-2200",
|
| 94 |
"contact_name": "Maria (Caterer)",
|
| 95 |
"verifiable": true,
|
| 96 |
-
"truth": "Lying - Maria didn't see him"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 97 |
}
|
| 98 |
}
|
| 99 |
},
|
| 100 |
"timeline": {
|
| 101 |
"9:55 PM": "Julian poisons wine",
|
|
|
|
| 102 |
"10:00 PM": "Vincent collapses",
|
| 103 |
"10:05 PM": "Julian calls 911 feigning panic"
|
| 104 |
}
|
|
|
|
| 1 |
{
|
| 2 |
"case_id": "C99",
|
| 3 |
"title": "The Gallery Heist Gone Wrong",
|
| 4 |
+
"difficulty": "Expert",
|
| 5 |
"victim": {
|
| 6 |
"name": "Vincent Shaw",
|
| 7 |
"age": 55,
|
|
|
|
| 70 |
"footage_data": {
|
| 71 |
"office_cam": {
|
| 72 |
"9:50-10:10 PM": {
|
| 73 |
+
"visible_people": ["Vincent drinking wine", "Julian pouring more wine", "Shadowy figure (Arthur?) outside window"],
|
| 74 |
"quality": "High",
|
| 75 |
+
"key_frame": "9:55 PM - Julian adds powder to glass. BUT 9:58 PM - Elena enters and argues."
|
| 76 |
+
},
|
| 77 |
+
"unlocks": ["wine_glass", "poison_vial", "sculpture", "dropped_scarf"]
|
| 78 |
+
},
|
| 79 |
+
"main_hall_cam": {
|
| 80 |
+
"9:50-10:10 PM": {
|
| 81 |
+
"visible_people": ["Crowd of guests", "Maria serving drinks"],
|
| 82 |
+
"quality": "Medium",
|
| 83 |
+
"notes": "Too many people to track individually"
|
| 84 |
+
},
|
| 85 |
+
"unlocks": []
|
| 86 |
}
|
| 87 |
},
|
| 88 |
"dna_evidence": {
|
| 89 |
"wine_glass": {
|
| 90 |
+
"label": "Wine Glass (Office)",
|
| 91 |
+
"matches": ["suspect_1", "victim", "suspect_2"],
|
| 92 |
+
"confidence": "Mixed",
|
| 93 |
+
"notes": "Julian poured it, Vincent drank it, Elena touched it during argument."
|
| 94 |
},
|
| 95 |
"poison_vial": {
|
| 96 |
+
"label": "Vial (Julian's Pocket)",
|
| 97 |
"primary_match": "suspect_1",
|
| 98 |
"confidence": "99%",
|
| 99 |
"notes": "Found in Julian's pocket"
|
| 100 |
+
},
|
| 101 |
+
"sculpture": {
|
| 102 |
+
"label": "Bronze Sculpture",
|
| 103 |
+
"primary_match": "suspect_3",
|
| 104 |
+
"confidence": "90%",
|
| 105 |
+
"notes": "Arthur was admiring it earlier."
|
| 106 |
+
},
|
| 107 |
+
"dropped_scarf": {
|
| 108 |
+
"label": "Silk Scarf",
|
| 109 |
+
"primary_match": "suspect_2",
|
| 110 |
+
"confidence": "99%",
|
| 111 |
+
"notes": "Elena's scarf found under the desk."
|
| 112 |
}
|
| 113 |
},
|
| 114 |
"alibis": {
|
|
|
|
| 116 |
"contact": "+1-555-2200",
|
| 117 |
"contact_name": "Maria (Caterer)",
|
| 118 |
"verifiable": true,
|
| 119 |
+
"truth": "Lying - Maria didn't see him in basement"
|
| 120 |
+
},
|
| 121 |
+
"suspect_2_alibi": {
|
| 122 |
+
"contact": "None",
|
| 123 |
+
"contact_name": "Gallery Guests",
|
| 124 |
+
"verifiable": true,
|
| 125 |
+
"truth": "Conflicting - some saw her, some say she disappeared for 10 mins"
|
| 126 |
+
},
|
| 127 |
+
"suspect_3_alibi": {
|
| 128 |
+
"contact": "+1-555-2203",
|
| 129 |
+
"contact_name": "Valet",
|
| 130 |
+
"verifiable": true,
|
| 131 |
+
"truth": "Telling truth - was arguing about car parking outside"
|
| 132 |
+
},
|
| 133 |
+
"suspect_4_alibi": {
|
| 134 |
+
"contact": "None",
|
| 135 |
+
"contact_name": "Head Chef",
|
| 136 |
+
"verifiable": true,
|
| 137 |
+
"truth": "Telling truth - never left kitchen"
|
| 138 |
}
|
| 139 |
}
|
| 140 |
},
|
| 141 |
"timeline": {
|
| 142 |
"9:55 PM": "Julian poisons wine",
|
| 143 |
+
"9:58 PM": "Elena argues with Vincent",
|
| 144 |
"10:00 PM": "Vincent collapses",
|
| 145 |
"10:05 PM": "Julian calls 911 feigning panic"
|
| 146 |
}
|
scenarios/coffee_shop.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
{
|
| 2 |
"case_id": "B12",
|
| 3 |
"title": "The Coffee Shop Murder",
|
| 4 |
-
"difficulty": "
|
| 5 |
"victim": {
|
| 6 |
"name": "Emma Rodriguez",
|
| 7 |
"age": 24,
|
|
@@ -76,36 +76,65 @@
|
|
| 76 |
"footage_data": {
|
| 77 |
"kitchen_cam": {
|
| 78 |
"11:10-11:20 PM": {
|
| 79 |
-
"visible_people": ["Emma arguing with man in blue cap"],
|
| 80 |
"quality": "Good",
|
| 81 |
"key_frame": "11:15 PM - Man stabs Emma"
|
| 82 |
-
}
|
|
|
|
| 83 |
},
|
| 84 |
"alley_cam": {
|
| 85 |
"11:00-11:30 PM": {
|
| 86 |
-
"visible_people": ["Liam entering 11:05", "
|
| 87 |
-
"
|
| 88 |
-
|
|
|
|
|
|
|
| 89 |
}
|
| 90 |
},
|
| 91 |
"dna_evidence": {
|
| 92 |
"knife_handle": {
|
| 93 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 94 |
"confidence": "99%",
|
| 95 |
-
"notes": "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 96 |
}
|
| 97 |
},
|
| 98 |
"alibis": {
|
| 99 |
"suspect_1_alibi": {
|
| 100 |
"contact": "None",
|
|
|
|
| 101 |
"verifiable": false,
|
| 102 |
-
"truth": "Lying - claims gaming
|
| 103 |
},
|
| 104 |
"suspect_2_alibi": {
|
| 105 |
"contact": "+1-555-1200",
|
| 106 |
"contact_name": "Bank CCTV",
|
| 107 |
"verifiable": true,
|
| 108 |
-
"truth": "Telling truth - footage confirms"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 109 |
}
|
| 110 |
}
|
| 111 |
},
|
|
|
|
| 1 |
{
|
| 2 |
"case_id": "B12",
|
| 3 |
"title": "The Coffee Shop Murder",
|
| 4 |
+
"difficulty": "Medium",
|
| 5 |
"victim": {
|
| 6 |
"name": "Emma Rodriguez",
|
| 7 |
"age": 24,
|
|
|
|
| 76 |
"footage_data": {
|
| 77 |
"kitchen_cam": {
|
| 78 |
"11:10-11:20 PM": {
|
| 79 |
+
"visible_people": ["Emma arguing with man in blue cap", "Second figure in shadows"],
|
| 80 |
"quality": "Good",
|
| 81 |
"key_frame": "11:15 PM - Man stabs Emma"
|
| 82 |
+
},
|
| 83 |
+
"unlocks": ["knife_handle", "tip_jar", "napkin"]
|
| 84 |
},
|
| 85 |
"alley_cam": {
|
| 86 |
"11:00-11:30 PM": {
|
| 87 |
+
"visible_people": ["Liam entering 11:05", "Mark leaving 11:00", "Joe lurking near dumpster"],
|
| 88 |
+
"quality": "Grainy (Night Mode)",
|
| 89 |
+
"notes": "Two people wearing blue caps seen (Liam and Joe)."
|
| 90 |
+
},
|
| 91 |
+
"unlocks": []
|
| 92 |
}
|
| 93 |
},
|
| 94 |
"dna_evidence": {
|
| 95 |
"knife_handle": {
|
| 96 |
+
"label": "Bloody Knife (Kitchen)",
|
| 97 |
+
"matches": ["suspect_1", "suspect_2"],
|
| 98 |
+
"confidence": "Inconclusive",
|
| 99 |
+
"notes": "Smudged prints. Could be Liam or Mark (who owns the knife)."
|
| 100 |
+
},
|
| 101 |
+
"tip_jar": {
|
| 102 |
+
"label": "Tip Jar (Counter)",
|
| 103 |
+
"primary_match": "suspect_2",
|
| 104 |
"confidence": "99%",
|
| 105 |
+
"notes": "Mark cleared the tips earlier."
|
| 106 |
+
},
|
| 107 |
+
"napkin": {
|
| 108 |
+
"label": "Crumpled Napkin",
|
| 109 |
+
"primary_match": "suspect_4",
|
| 110 |
+
"confidence": "95%",
|
| 111 |
+
"notes": "Joe's DNA. He was here earlier."
|
| 112 |
}
|
| 113 |
},
|
| 114 |
"alibis": {
|
| 115 |
"suspect_1_alibi": {
|
| 116 |
"contact": "None",
|
| 117 |
+
"contact_name": "Mom",
|
| 118 |
"verifiable": false,
|
| 119 |
+
"truth": "Lying - claims she heard him gaming, but door was closed"
|
| 120 |
},
|
| 121 |
"suspect_2_alibi": {
|
| 122 |
"contact": "+1-555-1200",
|
| 123 |
"contact_name": "Bank CCTV",
|
| 124 |
"verifiable": true,
|
| 125 |
+
"truth": "Telling truth - footage confirms he was at bank at 11:15"
|
| 126 |
+
},
|
| 127 |
+
"suspect_3_alibi": {
|
| 128 |
+
"contact": "+1-555-1203",
|
| 129 |
+
"contact_name": "Gym Front Desk",
|
| 130 |
+
"verifiable": true,
|
| 131 |
+
"truth": "Telling truth - scanned badge at 11:00 PM"
|
| 132 |
+
},
|
| 133 |
+
"suspect_4_alibi": {
|
| 134 |
+
"contact": "None",
|
| 135 |
+
"contact_name": "Bus Driver",
|
| 136 |
+
"verifiable": false,
|
| 137 |
+
"truth": "Uncertain - bus was late, nobody remembers seeing him"
|
| 138 |
}
|
| 139 |
}
|
| 140 |
},
|
scenarios/silicon_valley.json
CHANGED
|
@@ -77,19 +77,19 @@
|
|
| 77 |
"footage_data": {
|
| 78 |
"10th_floor_camera": {
|
| 79 |
"8:45-8:50 PM": {
|
| 80 |
-
"visible_people": ["Person in black hoodie entering"],
|
| 81 |
"quality": "Grainy",
|
| 82 |
"key_frame": "8:47 PM - figure strikes victim with trophy"
|
| 83 |
},
|
| 84 |
-
"unlocks": ["
|
| 85 |
},
|
| 86 |
"lobby_camera": {
|
| 87 |
"8:40-8:55 PM": {
|
| 88 |
-
"visible_people": ["Suspect 1 entering at 8:43", "Suspect 1 leaving at 8:52"],
|
| 89 |
-
"quality": "
|
| 90 |
-
"notes": "Suspect changed clothes, looks flustered"
|
| 91 |
},
|
| 92 |
-
"unlocks": []
|
| 93 |
},
|
| 94 |
"kitchen_camera": {
|
| 95 |
"8:40-8:55 PM": {
|
|
@@ -103,19 +103,37 @@
|
|
| 103 |
"dna_evidence": {
|
| 104 |
"trophy_weapon": {
|
| 105 |
"label": "Trophy (Found in Office)",
|
| 106 |
-
"
|
| 107 |
-
"confidence": "
|
| 108 |
-
"notes": "
|
| 109 |
},
|
| 110 |
"door_handle": {
|
| 111 |
"label": "Door Handle (10th Floor)",
|
| 112 |
"matches": ["suspect_1", "suspect_2", "victim"],
|
| 113 |
"notes": "Multiple people touched door recently"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 114 |
}
|
| 115 |
},
|
| 116 |
"alibis": {
|
| 117 |
"suspect_1_alibi": {
|
| 118 |
"contact": "Nobody (claims was alone)",
|
|
|
|
| 119 |
"verifiable": false,
|
| 120 |
"truth": "Lying - was at crime scene"
|
| 121 |
},
|
|
@@ -123,19 +141,19 @@
|
|
| 123 |
"contact": "+1-555-0199",
|
| 124 |
"contact_name": "Security Guard Tom",
|
| 125 |
"verifiable": true,
|
| 126 |
-
"truth": "Telling truth - saw him on 5th floor"
|
| 127 |
},
|
| 128 |
"suspect_3_alibi": {
|
| 129 |
"contact": "+1-555-0200",
|
| 130 |
"contact_name": "Waiter at La Casa",
|
| 131 |
"verifiable": true,
|
| 132 |
-
"truth": "Telling truth - bill was paid at 9:00 PM"
|
| 133 |
},
|
| 134 |
"suspect_4_alibi": {
|
| 135 |
"contact": "+1-555-0201",
|
| 136 |
"contact_name": "Airline Desk",
|
| 137 |
"verifiable": true,
|
| 138 |
-
"truth": "Telling truth - checked in at 8:30 PM"
|
| 139 |
}
|
| 140 |
}
|
| 141 |
},
|
|
|
|
| 77 |
"footage_data": {
|
| 78 |
"10th_floor_camera": {
|
| 79 |
"8:45-8:50 PM": {
|
| 80 |
+
"visible_people": ["Person in black hoodie entering", "Janitor cart visible in corner"],
|
| 81 |
"quality": "Grainy",
|
| 82 |
"key_frame": "8:47 PM - figure strikes victim with trophy"
|
| 83 |
},
|
| 84 |
+
"unlocks": ["door_handle", "coffee_mug", "laptop", "trophy_weapon"]
|
| 85 |
},
|
| 86 |
"lobby_camera": {
|
| 87 |
"8:40-8:55 PM": {
|
| 88 |
+
"visible_people": ["Suspect 1 entering at 8:43", "Suspect 1 leaving at 8:52", "Suspect 3 arguing with guard earlier"],
|
| 89 |
+
"quality": "High",
|
| 90 |
+
"notes": "Suspect 1 changed clothes, looks flustered. Suspect 3 seen leaving at 8:30."
|
| 91 |
},
|
| 92 |
+
"unlocks": ["discarded_ticket"]
|
| 93 |
},
|
| 94 |
"kitchen_camera": {
|
| 95 |
"8:40-8:55 PM": {
|
|
|
|
| 103 |
"dna_evidence": {
|
| 104 |
"trophy_weapon": {
|
| 105 |
"label": "Trophy (Found in Office)",
|
| 106 |
+
"matches": ["suspect_1", "suspect_3", "victim"],
|
| 107 |
+
"confidence": "65%",
|
| 108 |
+
"notes": "Partial print on base. Smudged."
|
| 109 |
},
|
| 110 |
"door_handle": {
|
| 111 |
"label": "Door Handle (10th Floor)",
|
| 112 |
"matches": ["suspect_1", "suspect_2", "victim"],
|
| 113 |
"notes": "Multiple people touched door recently"
|
| 114 |
+
},
|
| 115 |
+
"coffee_mug": {
|
| 116 |
+
"label": "Coffee Mug (Desk)",
|
| 117 |
+
"primary_match": "victim",
|
| 118 |
+
"confidence": "99%",
|
| 119 |
+
"notes": "Victim's saliva."
|
| 120 |
+
},
|
| 121 |
+
"laptop": {
|
| 122 |
+
"label": "Laptop (Desk)",
|
| 123 |
+
"matches": ["victim", "suspect_2"],
|
| 124 |
+
"notes": "Dusty fingerprints from cleaning."
|
| 125 |
+
},
|
| 126 |
+
"discarded_ticket": {
|
| 127 |
+
"label": "Parking Ticket (Lobby)",
|
| 128 |
+
"primary_match": "suspect_3",
|
| 129 |
+
"confidence": "99%",
|
| 130 |
+
"notes": "Dropped near exit."
|
| 131 |
}
|
| 132 |
},
|
| 133 |
"alibis": {
|
| 134 |
"suspect_1_alibi": {
|
| 135 |
"contact": "Nobody (claims was alone)",
|
| 136 |
+
"contact_name": "None",
|
| 137 |
"verifiable": false,
|
| 138 |
"truth": "Lying - was at crime scene"
|
| 139 |
},
|
|
|
|
| 141 |
"contact": "+1-555-0199",
|
| 142 |
"contact_name": "Security Guard Tom",
|
| 143 |
"verifiable": true,
|
| 144 |
+
"truth": "Telling truth - saw him on 5th floor around 8:45"
|
| 145 |
},
|
| 146 |
"suspect_3_alibi": {
|
| 147 |
"contact": "+1-555-0200",
|
| 148 |
"contact_name": "Waiter at La Casa",
|
| 149 |
"verifiable": true,
|
| 150 |
+
"truth": "Telling truth - bill was paid at 9:00 PM, but she arrived late (8:55)"
|
| 151 |
},
|
| 152 |
"suspect_4_alibi": {
|
| 153 |
"contact": "+1-555-0201",
|
| 154 |
"contact_name": "Airline Desk",
|
| 155 |
"verifiable": true,
|
| 156 |
+
"truth": "Telling truth - checked in at 8:30 PM, seen at gate"
|
| 157 |
}
|
| 158 |
}
|
| 159 |
},
|