2026-03-24 02:29:45 +00:00
|
|
|
[
|
|
|
|
|
{
|
|
|
|
|
"id": "morrowind",
|
|
|
|
|
"name": "Morrowind",
|
|
|
|
|
"description": "The Vvardenfell harness. Ash storms and ancient mysteries.",
|
|
|
|
|
"status": "online",
|
|
|
|
|
"color": "#ff6600",
|
2026-04-12 19:26:25 -04:00
|
|
|
"role": "pilot",
|
2026-04-13 20:18:57 -04:00
|
|
|
"position": {
|
|
|
|
|
"x": 15,
|
|
|
|
|
"y": 0,
|
|
|
|
|
"z": -10
|
|
|
|
|
},
|
|
|
|
|
"rotation": {
|
|
|
|
|
"y": -0.5
|
|
|
|
|
},
|
2026-04-12 12:28:16 -04:00
|
|
|
"portal_type": "game-world",
|
|
|
|
|
"world_category": "rpg",
|
|
|
|
|
"environment": "local",
|
|
|
|
|
"access_mode": "operator",
|
|
|
|
|
"readiness_state": "prototype",
|
|
|
|
|
"readiness_steps": {
|
2026-04-13 20:18:57 -04:00
|
|
|
"prototype": {
|
|
|
|
|
"label": "Prototype",
|
|
|
|
|
"done": true
|
|
|
|
|
},
|
|
|
|
|
"runtime_ready": {
|
|
|
|
|
"label": "Runtime Ready",
|
|
|
|
|
"done": false
|
|
|
|
|
},
|
|
|
|
|
"launched": {
|
|
|
|
|
"label": "Launched",
|
|
|
|
|
"done": false
|
|
|
|
|
},
|
|
|
|
|
"harness_bridged": {
|
|
|
|
|
"label": "Harness Bridged",
|
|
|
|
|
"done": false
|
|
|
|
|
}
|
2026-04-12 12:28:16 -04:00
|
|
|
},
|
|
|
|
|
"blocked_reason": null,
|
|
|
|
|
"telemetry_source": "hermes-harness:morrowind",
|
|
|
|
|
"owner": "Timmy",
|
|
|
|
|
"app_id": 22320,
|
|
|
|
|
"window_title": "OpenMW",
|
2026-03-24 02:29:45 +00:00
|
|
|
"destination": {
|
2026-04-12 12:28:16 -04:00
|
|
|
"url": null,
|
2026-03-24 02:29:45 +00:00
|
|
|
"type": "harness",
|
2026-04-12 12:28:16 -04:00
|
|
|
"action_label": "Enter Vvardenfell",
|
2026-04-12 12:32:31 -04:00
|
|
|
"params": {
|
|
|
|
|
"world": "vvardenfell"
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"agents_present": [
|
|
|
|
|
"timmy"
|
|
|
|
|
],
|
|
|
|
|
"interaction_ready": true
|
2026-03-24 02:29:45 +00:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "bannerlord",
|
|
|
|
|
"name": "Bannerlord",
|
|
|
|
|
"description": "Calradia battle harness. Massive armies, tactical command.",
|
2026-04-11 00:20:06 +00:00
|
|
|
"status": "downloaded",
|
2026-03-24 02:29:45 +00:00
|
|
|
"color": "#ffd700",
|
2026-04-12 19:26:25 -04:00
|
|
|
"role": "pilot",
|
2026-04-12 12:32:31 -04:00
|
|
|
"position": {
|
|
|
|
|
"x": -15,
|
|
|
|
|
"y": 0,
|
|
|
|
|
"z": -10
|
|
|
|
|
},
|
|
|
|
|
"rotation": {
|
|
|
|
|
"y": 0.5
|
|
|
|
|
},
|
feat: Complete Bannerlord MCP Harness implementation (Issue #722)
Implements the Hermes observation/control path for local Bannerlord per GamePortal Protocol.
## New Components
- nexus/bannerlord_harness.py (874 lines)
- MCPClient for JSON-RPC communication with MCP servers
- capture_state() → GameState with visual + Steam context
- execute_action() → ActionResult for all input types
- observe-decide-act loop with telemetry through Hermes WS
- Bannerlord-specific actions (inventory, party, save/load)
- Mock mode for testing without game running
- mcp_servers/desktop_control_server.py (14KB)
- 13 desktop automation tools via pyautogui
- Screenshot, mouse, keyboard control
- Headless environment support
- mcp_servers/steam_info_server.py (18KB)
- 6 Steam Web API tools
- Mock mode without API key, live mode with STEAM_API_KEY
- tests/test_bannerlord_harness.py (37 tests, all passing)
- GameState/ActionResult validation
- Mock mode action tests
- ODA loop tests
- GamePortal Protocol compliance tests
- docs/BANNERLORD_HARNESS_PROOF.md
- Architecture documentation
- Proof of ODA loop execution
- Telemetry flow diagrams
- examples/harness_demo.py
- Runnable demo showing full ODA loop
## Updates
- portals.json: Bannerlord metadata per GAMEPORTAL_PROTOCOL.md
- status: active, portal_type: game-world
- app_id: 261550, window_title: 'Mount & Blade II: Bannerlord'
- telemetry_source: hermes-harness:bannerlord
## Verification
pytest tests/test_bannerlord_harness.py -v
37 passed, 2 skipped, 11 warnings
Closes #722
2026-03-31 04:53:29 +00:00
|
|
|
"portal_type": "game-world",
|
|
|
|
|
"world_category": "strategy-rpg",
|
|
|
|
|
"environment": "production",
|
|
|
|
|
"access_mode": "operator",
|
2026-04-11 00:20:06 +00:00
|
|
|
"readiness_state": "downloaded",
|
|
|
|
|
"readiness_steps": {
|
2026-04-12 12:32:31 -04:00
|
|
|
"downloaded": {
|
|
|
|
|
"label": "Downloaded",
|
|
|
|
|
"done": true
|
|
|
|
|
},
|
|
|
|
|
"runtime_ready": {
|
|
|
|
|
"label": "Runtime Ready",
|
|
|
|
|
"done": false
|
|
|
|
|
},
|
|
|
|
|
"launched": {
|
|
|
|
|
"label": "Launched",
|
|
|
|
|
"done": false
|
|
|
|
|
},
|
|
|
|
|
"harness_bridged": {
|
|
|
|
|
"label": "Harness Bridged",
|
|
|
|
|
"done": false
|
|
|
|
|
}
|
2026-04-11 00:20:06 +00:00
|
|
|
},
|
|
|
|
|
"blocked_reason": null,
|
feat: Complete Bannerlord MCP Harness implementation (Issue #722)
Implements the Hermes observation/control path for local Bannerlord per GamePortal Protocol.
## New Components
- nexus/bannerlord_harness.py (874 lines)
- MCPClient for JSON-RPC communication with MCP servers
- capture_state() → GameState with visual + Steam context
- execute_action() → ActionResult for all input types
- observe-decide-act loop with telemetry through Hermes WS
- Bannerlord-specific actions (inventory, party, save/load)
- Mock mode for testing without game running
- mcp_servers/desktop_control_server.py (14KB)
- 13 desktop automation tools via pyautogui
- Screenshot, mouse, keyboard control
- Headless environment support
- mcp_servers/steam_info_server.py (18KB)
- 6 Steam Web API tools
- Mock mode without API key, live mode with STEAM_API_KEY
- tests/test_bannerlord_harness.py (37 tests, all passing)
- GameState/ActionResult validation
- Mock mode action tests
- ODA loop tests
- GamePortal Protocol compliance tests
- docs/BANNERLORD_HARNESS_PROOF.md
- Architecture documentation
- Proof of ODA loop execution
- Telemetry flow diagrams
- examples/harness_demo.py
- Runnable demo showing full ODA loop
## Updates
- portals.json: Bannerlord metadata per GAMEPORTAL_PROTOCOL.md
- status: active, portal_type: game-world
- app_id: 261550, window_title: 'Mount & Blade II: Bannerlord'
- telemetry_source: hermes-harness:bannerlord
## Verification
pytest tests/test_bannerlord_harness.py -v
37 passed, 2 skipped, 11 warnings
Closes #722
2026-03-31 04:53:29 +00:00
|
|
|
"telemetry_source": "hermes-harness:bannerlord",
|
|
|
|
|
"owner": "Timmy",
|
|
|
|
|
"app_id": 261550,
|
|
|
|
|
"window_title": "Mount & Blade II: Bannerlord",
|
2026-03-24 02:29:45 +00:00
|
|
|
"destination": {
|
2026-04-11 00:20:06 +00:00
|
|
|
"url": null,
|
2026-03-24 02:29:45 +00:00
|
|
|
"type": "harness",
|
feat: Complete Bannerlord MCP Harness implementation (Issue #722)
Implements the Hermes observation/control path for local Bannerlord per GamePortal Protocol.
## New Components
- nexus/bannerlord_harness.py (874 lines)
- MCPClient for JSON-RPC communication with MCP servers
- capture_state() → GameState with visual + Steam context
- execute_action() → ActionResult for all input types
- observe-decide-act loop with telemetry through Hermes WS
- Bannerlord-specific actions (inventory, party, save/load)
- Mock mode for testing without game running
- mcp_servers/desktop_control_server.py (14KB)
- 13 desktop automation tools via pyautogui
- Screenshot, mouse, keyboard control
- Headless environment support
- mcp_servers/steam_info_server.py (18KB)
- 6 Steam Web API tools
- Mock mode without API key, live mode with STEAM_API_KEY
- tests/test_bannerlord_harness.py (37 tests, all passing)
- GameState/ActionResult validation
- Mock mode action tests
- ODA loop tests
- GamePortal Protocol compliance tests
- docs/BANNERLORD_HARNESS_PROOF.md
- Architecture documentation
- Proof of ODA loop execution
- Telemetry flow diagrams
- examples/harness_demo.py
- Runnable demo showing full ODA loop
## Updates
- portals.json: Bannerlord metadata per GAMEPORTAL_PROTOCOL.md
- status: active, portal_type: game-world
- app_id: 261550, window_title: 'Mount & Blade II: Bannerlord'
- telemetry_source: hermes-harness:bannerlord
## Verification
pytest tests/test_bannerlord_harness.py -v
37 passed, 2 skipped, 11 warnings
Closes #722
2026-03-31 04:53:29 +00:00
|
|
|
"action_label": "Enter Calradia",
|
2026-04-12 12:32:31 -04:00
|
|
|
"params": {
|
|
|
|
|
"world": "calradia"
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"agents_present": [],
|
|
|
|
|
"interaction_ready": false
|
2026-03-24 02:29:45 +00:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "workshop",
|
|
|
|
|
"name": "Workshop",
|
|
|
|
|
"description": "The creative harness. Build, script, and manifest.",
|
|
|
|
|
"status": "online",
|
|
|
|
|
"color": "#4af0c0",
|
2026-04-12 19:26:25 -04:00
|
|
|
"role": "timmy",
|
2026-04-12 12:32:31 -04:00
|
|
|
"position": {
|
|
|
|
|
"x": 0,
|
|
|
|
|
"y": 0,
|
|
|
|
|
"z": -20
|
|
|
|
|
},
|
|
|
|
|
"rotation": {
|
|
|
|
|
"y": 0
|
|
|
|
|
},
|
2026-03-24 02:29:45 +00:00
|
|
|
"destination": {
|
|
|
|
|
"url": "https://workshop.timmy.foundation",
|
|
|
|
|
"type": "harness",
|
2026-04-12 12:32:31 -04:00
|
|
|
"params": {
|
|
|
|
|
"mode": "creative"
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"agents_present": [
|
|
|
|
|
"timmy",
|
|
|
|
|
"kimi"
|
|
|
|
|
],
|
|
|
|
|
"interaction_ready": true
|
2026-03-28 20:50:59 +00:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "archive",
|
|
|
|
|
"name": "Archive",
|
|
|
|
|
"description": "The repository of all knowledge. History, logs, and ancient data.",
|
|
|
|
|
"status": "online",
|
|
|
|
|
"color": "#0066ff",
|
2026-04-12 19:26:25 -04:00
|
|
|
"role": "timmy",
|
2026-04-12 12:32:31 -04:00
|
|
|
"position": {
|
|
|
|
|
"x": 25,
|
|
|
|
|
"y": 0,
|
|
|
|
|
"z": 0
|
|
|
|
|
},
|
|
|
|
|
"rotation": {
|
|
|
|
|
"y": -1.57
|
|
|
|
|
},
|
2026-03-28 20:50:59 +00:00
|
|
|
"destination": {
|
|
|
|
|
"url": "https://archive.timmy.foundation",
|
|
|
|
|
"type": "harness",
|
2026-04-12 12:32:31 -04:00
|
|
|
"params": {
|
|
|
|
|
"mode": "read"
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"agents_present": [
|
|
|
|
|
"claude"
|
|
|
|
|
],
|
|
|
|
|
"interaction_ready": true
|
2026-03-28 20:50:59 +00:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "chapel",
|
|
|
|
|
"name": "Chapel",
|
|
|
|
|
"description": "A sanctuary for reflection and digital peace.",
|
|
|
|
|
"status": "online",
|
|
|
|
|
"color": "#ffd700",
|
2026-04-12 19:26:25 -04:00
|
|
|
"role": "timmy",
|
2026-04-12 12:32:31 -04:00
|
|
|
"position": {
|
|
|
|
|
"x": -25,
|
|
|
|
|
"y": 0,
|
|
|
|
|
"z": 0
|
|
|
|
|
},
|
|
|
|
|
"rotation": {
|
|
|
|
|
"y": 1.57
|
|
|
|
|
},
|
2026-03-28 20:50:59 +00:00
|
|
|
"destination": {
|
|
|
|
|
"url": "https://chapel.timmy.foundation",
|
|
|
|
|
"type": "harness",
|
2026-04-12 12:32:31 -04:00
|
|
|
"params": {
|
|
|
|
|
"mode": "meditation"
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"agents_present": [],
|
|
|
|
|
"interaction_ready": true
|
2026-03-28 20:50:59 +00:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "courtyard",
|
|
|
|
|
"name": "Courtyard",
|
|
|
|
|
"description": "The open nexus. A place for agents to gather and connect.",
|
|
|
|
|
"status": "online",
|
|
|
|
|
"color": "#4af0c0",
|
2026-04-12 19:26:25 -04:00
|
|
|
"role": "reflex",
|
2026-04-12 12:32:31 -04:00
|
|
|
"position": {
|
|
|
|
|
"x": 15,
|
|
|
|
|
"y": 0,
|
|
|
|
|
"z": 10
|
|
|
|
|
},
|
|
|
|
|
"rotation": {
|
|
|
|
|
"y": -2.5
|
|
|
|
|
},
|
2026-03-28 20:50:59 +00:00
|
|
|
"destination": {
|
|
|
|
|
"url": "https://courtyard.timmy.foundation",
|
|
|
|
|
"type": "harness",
|
2026-04-12 12:32:31 -04:00
|
|
|
"params": {
|
|
|
|
|
"mode": "social"
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"agents_present": [
|
|
|
|
|
"timmy",
|
|
|
|
|
"perplexity"
|
|
|
|
|
],
|
|
|
|
|
"interaction_ready": true
|
2026-03-28 20:50:59 +00:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "gate",
|
|
|
|
|
"name": "Gate",
|
|
|
|
|
"description": "The transition point. Entry and exit from the Nexus core.",
|
|
|
|
|
"status": "standby",
|
|
|
|
|
"color": "#ff4466",
|
2026-04-12 19:26:25 -04:00
|
|
|
"role": "reflex",
|
2026-04-12 12:32:31 -04:00
|
|
|
"position": {
|
|
|
|
|
"x": -15,
|
|
|
|
|
"y": 0,
|
|
|
|
|
"z": 10
|
|
|
|
|
},
|
|
|
|
|
"rotation": {
|
|
|
|
|
"y": 2.5
|
|
|
|
|
},
|
2026-03-28 20:50:59 +00:00
|
|
|
"destination": {
|
|
|
|
|
"url": "https://gate.timmy.foundation",
|
|
|
|
|
"type": "harness",
|
2026-04-12 12:32:31 -04:00
|
|
|
"params": {
|
|
|
|
|
"mode": "transit"
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"agents_present": [],
|
|
|
|
|
"interaction_ready": false
|
2026-04-13 20:18:57 -04:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"id": "playground",
|
|
|
|
|
"name": "Sound Playground",
|
|
|
|
|
"description": "Interactive audio-visual experience. Paint with sound, create music visually.",
|
|
|
|
|
"status": "online",
|
|
|
|
|
"color": "#ff00ff",
|
|
|
|
|
"role": "creative",
|
|
|
|
|
"position": {
|
|
|
|
|
"x": 10,
|
|
|
|
|
"y": 0,
|
|
|
|
|
"z": 15
|
|
|
|
|
},
|
|
|
|
|
"rotation": {
|
|
|
|
|
"y": -0.7
|
|
|
|
|
},
|
|
|
|
|
"portal_type": "creative-tool",
|
|
|
|
|
"world_category": "audio-visual",
|
|
|
|
|
"environment": "production",
|
|
|
|
|
"access_mode": "visitor",
|
|
|
|
|
"readiness_state": "online",
|
|
|
|
|
"readiness_steps": {
|
|
|
|
|
"prototype": {
|
|
|
|
|
"label": "Prototype",
|
|
|
|
|
"done": true
|
|
|
|
|
},
|
|
|
|
|
"runtime_ready": {
|
|
|
|
|
"label": "Runtime Ready",
|
|
|
|
|
"done": true
|
|
|
|
|
},
|
|
|
|
|
"launched": {
|
|
|
|
|
"label": "Launched",
|
|
|
|
|
"done": true
|
|
|
|
|
},
|
|
|
|
|
"harness_bridged": {
|
|
|
|
|
"label": "Harness Bridged",
|
|
|
|
|
"done": true
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"blocked_reason": null,
|
|
|
|
|
"telemetry_source": "playground",
|
|
|
|
|
"owner": "Timmy",
|
|
|
|
|
"destination": {
|
|
|
|
|
"url": "./playground/playground.html",
|
|
|
|
|
"type": "local",
|
|
|
|
|
"action_label": "Enter Playground",
|
|
|
|
|
"params": {}
|
|
|
|
|
},
|
|
|
|
|
"agents_present": [],
|
|
|
|
|
"interaction_ready": true
|
2026-03-24 02:29:45 +00:00
|
|
|
}
|
2026-04-12 12:32:31 -04:00
|
|
|
]
|