Files
evotraders/docs/current-architecture.excalidraw
cillin 16b54d5ccc feat(agent): complete EvoAgent integration for all 6 agent roles
Migrate all agent roles from Legacy to EvoAgent architecture:
- fundamentals_analyst, technical_analyst, sentiment_analyst, valuation_analyst
- risk_manager, portfolio_manager

Key changes:
- EvoAgent now supports Portfolio Manager compatibility methods (_make_decision,
  get_decisions, get_portfolio_state, load_portfolio_state, update_portfolio)
- Add UnifiedAgentFactory for centralized agent creation
- ToolGuard with batch approval API and WebSocket broadcast
- Legacy agents marked deprecated (AnalystAgent, RiskAgent, PMAgent)
- Remove backend/agents/compat.py migration shim
- Add run_id alongside workspace_id for semantic clarity
- Complete integration test coverage (13 tests)
- All smoke tests passing for 6 agent roles

Constraint: Must maintain backward compatibility with existing run configs
Constraint: Memory support must work with EvoAgent (no fallback to Legacy)
Rejected: Separate PM implementation for EvoAgent | unified approach cleaner
Confidence: high
Scope-risk: broad
Directive: EVO_AGENT_IDS env var still respected but defaults to all roles
Not-tested: Kubernetes sandbox mode for skill execution
2026-04-02 00:55:08 +08:00

1239 lines
31 KiB
Plaintext

{
"type": "excalidraw",
"version": 2,
"source": "https://excalidraw.com",
"elements": [
{
"id": "frontend-box",
"type": "rectangle",
"x": 80,
"y": 80,
"width": 220,
"height": 90,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#ffd43b",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": { "type": 3 },
"seed": 1,
"version": 1,
"versionNonce": 1,
"isDeleted": false,
"boundElements": [
{ "id": "a-front-runtime", "type": "arrow" },
{ "id": "a-front-agent", "type": "arrow" },
{ "id": "a-front-trading", "type": "arrow" },
{ "id": "a-front-news", "type": "arrow" },
{ "id": "a-front-ws", "type": "arrow" }
],
"updated": 1,
"link": null,
"locked": false
},
{
"id": "frontend-text",
"type": "text",
"x": 110,
"y": 104,
"width": 160,
"height": 42,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 2,
"version": 1,
"versionNonce": 2,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"text": "Frontend\\nReact + Vite + Zustand",
"fontSize": 20,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "Frontend\nReact + Vite + Zustand",
"lineHeight": 1.2
},
{
"id": "agent-box",
"type": "rectangle",
"x": 390,
"y": 40,
"width": 260,
"height": 90,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#a5d8ff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": { "type": 3 },
"seed": 3,
"version": 1,
"versionNonce": 3,
"isDeleted": false,
"boundElements": [
{ "id": "a-agent-runs", "type": "arrow" }
],
"updated": 1,
"link": null,
"locked": false
},
{
"id": "agent-text",
"type": "text",
"x": 425,
"y": 64,
"width": 190,
"height": 42,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 4,
"version": 1,
"versionNonce": 4,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"text": "agent_service :8000\\ncontrol plane / skills / files",
"fontSize": 18,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "agent_service :8000\ncontrol plane / skills / files",
"lineHeight": 1.2
},
{
"id": "runtime-box",
"type": "rectangle",
"x": 390,
"y": 170,
"width": 260,
"height": 90,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#a5d8ff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": { "type": 3 },
"seed": 5,
"version": 1,
"versionNonce": 5,
"isDeleted": false,
"boundElements": [
{ "id": "a-runtime-gateway", "type": "arrow" },
{ "id": "a-runtime-runs", "type": "arrow" }
],
"updated": 1,
"link": null,
"locked": false
},
{
"id": "runtime-text",
"type": "text",
"x": 420,
"y": 194,
"width": 200,
"height": 42,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 6,
"version": 1,
"versionNonce": 6,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"text": "runtime_service :8003\\nstart / stop / history / logs",
"fontSize": 18,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "runtime_service :8003\nstart / stop / history / logs",
"lineHeight": 1.2
},
{
"id": "trading-box",
"type": "rectangle",
"x": 390,
"y": 300,
"width": 260,
"height": 90,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#b2f2bb",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": { "type": 3 },
"seed": 7,
"version": 1,
"versionNonce": 7,
"isDeleted": false,
"boundElements": [
{ "id": "a-trading-market", "type": "arrow" }
],
"updated": 1,
"link": null,
"locked": false
},
{
"id": "trading-text",
"type": "text",
"x": 425,
"y": 324,
"width": 190,
"height": 42,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 8,
"version": 1,
"versionNonce": 8,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"text": "trading_service :8001\\nprices / financials / market APIs",
"fontSize": 18,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "trading_service :8001\nprices / financials / market APIs",
"lineHeight": 1.2
},
{
"id": "news-box",
"type": "rectangle",
"x": 390,
"y": 430,
"width": 260,
"height": 90,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#b2f2bb",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": { "type": 3 },
"seed": 9,
"version": 1,
"versionNonce": 9,
"isDeleted": false,
"boundElements": [
{ "id": "a-news-market", "type": "arrow" }
],
"updated": 1,
"link": null,
"locked": false
},
{
"id": "news-text",
"type": "text",
"x": 428,
"y": 454,
"width": 184,
"height": 42,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 10,
"version": 1,
"versionNonce": 10,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"text": "news_service :8002\\nnews / story / explain APIs",
"fontSize": 18,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "news_service :8002\nnews / story / explain APIs",
"lineHeight": 1.2
},
{
"id": "gateway-box",
"type": "rectangle",
"x": 760,
"y": 170,
"width": 300,
"height": 120,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#ffc9c9",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": { "type": 3 },
"seed": 11,
"version": 1,
"versionNonce": 11,
"isDeleted": false,
"boundElements": [
{ "id": "a-gateway-market", "type": "arrow" },
{ "id": "a-gateway-storage", "type": "arrow" },
{ "id": "a-gateway-pipeline", "type": "arrow" },
{ "id": "a-gateway-openclaw", "type": "arrow" }
],
"updated": 1,
"link": null,
"locked": false
},
{
"id": "gateway-text",
"type": "text",
"x": 810,
"y": 204,
"width": 200,
"height": 52,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 12,
"version": 1,
"versionNonce": 12,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"text": "Gateway :8765\\nbackend.main\\nWebSocket + runtime orchestration",
"fontSize": 18,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "Gateway :8765\nbackend.main\nWebSocket + runtime orchestration",
"lineHeight": 1.2
},
{
"id": "pipeline-box",
"type": "rectangle",
"x": 1150,
"y": 80,
"width": 260,
"height": 100,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#ffe8cc",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": { "type": 3 },
"seed": 13,
"version": 1,
"versionNonce": 13,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false
},
{
"id": "pipeline-text",
"type": "text",
"x": 1180,
"y": 108,
"width": 200,
"height": 42,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 14,
"version": 1,
"versionNonce": 14,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"text": "TradingPipeline\\nanalysts + risk + PM",
"fontSize": 20,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "TradingPipeline\nanalysts + risk + PM",
"lineHeight": 1.2
},
{
"id": "market-box",
"type": "rectangle",
"x": 1150,
"y": 230,
"width": 260,
"height": 100,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#ffe8cc",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": { "type": 3 },
"seed": 15,
"version": 1,
"versionNonce": 15,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false
},
{
"id": "market-text",
"type": "text",
"x": 1190,
"y": 258,
"width": 180,
"height": 42,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 16,
"version": 1,
"versionNonce": 16,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"text": "MarketService\\nprovider router / polling",
"fontSize": 20,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "MarketService\nprovider router / polling",
"lineHeight": 1.2
},
{
"id": "storage-box",
"type": "rectangle",
"x": 1150,
"y": 380,
"width": 260,
"height": 100,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#ffe8cc",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": { "type": 3 },
"seed": 17,
"version": 1,
"versionNonce": 17,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false
},
{
"id": "storage-text",
"type": "text",
"x": 1180,
"y": 408,
"width": 200,
"height": 42,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 18,
"version": 1,
"versionNonce": 18,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"text": "StorageService\\ndashboard + state exports",
"fontSize": 20,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "StorageService\ndashboard + state exports",
"lineHeight": 1.2
},
{
"id": "runs-box",
"type": "rectangle",
"x": 760,
"y": 410,
"width": 300,
"height": 140,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#d0ebff",
"fillStyle": "hachure",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": { "type": 3 },
"seed": 19,
"version": 1,
"versionNonce": 19,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false
},
{
"id": "runs-text",
"type": "text",
"x": 795,
"y": 446,
"width": 230,
"height": 68,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 20,
"version": 1,
"versionNonce": 20,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"text": "runs/<run_id>/\\nBOOTSTRAP.md\\nstate/runtime_state.json\\nteam_dashboard/*.json",
"fontSize": 18,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "runs/<run_id>/\nBOOTSTRAP.md\nstate/runtime_state.json\nteam_dashboard/*.json",
"lineHeight": 1.2
},
{
"id": "openclaw-box",
"type": "rectangle",
"x": 1150,
"y": 530,
"width": 260,
"height": 100,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#fff3bf",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": { "type": 3 },
"seed": 21,
"version": 1,
"versionNonce": 21,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false
},
{
"id": "openclaw-text",
"type": "text",
"x": 1180,
"y": 558,
"width": 200,
"height": 42,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 22,
"version": 1,
"versionNonce": 22,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"text": "OpenClaw WS :18789\\noptional REST :8004",
"fontSize": 20,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "OpenClaw WS :18789\noptional REST :8004",
"lineHeight": 1.2
},
{
"id": "legacy-box",
"type": "rectangle",
"x": 80,
"y": 350,
"width": 220,
"height": 190,
"angle": 0,
"strokeColor": "#868e96",
"backgroundColor": "#f1f3f5",
"fillStyle": "cross-hatch",
"strokeWidth": 2,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": { "type": 3 },
"seed": 23,
"version": 1,
"versionNonce": 23,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false
},
{
"id": "legacy-text",
"type": "text",
"x": 105,
"y": 392,
"width": 170,
"height": 106,
"angle": 0,
"strokeColor": "#495057",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 24,
"version": 1,
"versionNonce": 24,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"text": "Legacy / compatibility\\nworkspaces/\\nlive/\\nbacktest/\\nproduction/\\nnot source of truth",
"fontSize": 18,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "Legacy / compatibility\nworkspaces/\nlive/\nbacktest/\nproduction/\nnot source of truth",
"lineHeight": 1.2
},
{
"id": "a-front-runtime",
"type": "arrow",
"x": 300,
"y": 125,
"width": 90,
"height": 90,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 25,
"version": 1,
"versionNonce": 25,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"points": [[0, 0], [90, 90]],
"lastCommittedPoint": null,
"startBinding": { "elementId": "frontend-box", "focus": 0.1, "gap": 0 },
"endBinding": { "elementId": "runtime-box", "focus": -0.8, "gap": 0 },
"startArrowhead": null,
"endArrowhead": "triangle"
},
{
"id": "a-front-agent",
"type": "arrow",
"x": 300,
"y": 105,
"width": 90,
"height": 0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 26,
"version": 1,
"versionNonce": 26,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"points": [[0, 0], [90, 0]],
"lastCommittedPoint": null,
"startBinding": { "elementId": "frontend-box", "focus": -0.45, "gap": 0 },
"endBinding": { "elementId": "agent-box", "focus": 0, "gap": 0 },
"startArrowhead": null,
"endArrowhead": "triangle"
},
{
"id": "a-front-trading",
"type": "arrow",
"x": 300,
"y": 140,
"width": 90,
"height": 205,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 27,
"version": 1,
"versionNonce": 27,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"points": [[0, 0], [90, 205]],
"lastCommittedPoint": null,
"startBinding": { "elementId": "frontend-box", "focus": 0.35, "gap": 0 },
"endBinding": { "elementId": "trading-box", "focus": -0.85, "gap": 0 },
"startArrowhead": null,
"endArrowhead": "triangle"
},
{
"id": "a-front-news",
"type": "arrow",
"x": 300,
"y": 145,
"width": 90,
"height": 330,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 28,
"version": 1,
"versionNonce": 28,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"points": [[0, 0], [90, 330]],
"lastCommittedPoint": null,
"startBinding": { "elementId": "frontend-box", "focus": 0.45, "gap": 0 },
"endBinding": { "elementId": "news-box", "focus": -0.85, "gap": 0 },
"startArrowhead": null,
"endArrowhead": "triangle"
},
{
"id": "a-front-ws",
"type": "arrow",
"x": 300,
"y": 122,
"width": 460,
"height": 98,
"angle": 0,
"strokeColor": "#c2255c",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 3,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 29,
"version": 1,
"versionNonce": 29,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"points": [[0, 0], [460, 98]],
"lastCommittedPoint": null,
"startBinding": { "elementId": "frontend-box", "focus": 0.05, "gap": 0 },
"endBinding": { "elementId": "gateway-box", "focus": -0.45, "gap": 0 },
"startArrowhead": null,
"endArrowhead": "triangle"
},
{
"id": "a-runtime-gateway",
"type": "arrow",
"x": 650,
"y": 215,
"width": 110,
"height": 0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 30,
"version": 1,
"versionNonce": 30,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"points": [[0, 0], [110, 0]],
"lastCommittedPoint": null,
"startBinding": { "elementId": "runtime-box", "focus": 0, "gap": 0 },
"endBinding": { "elementId": "gateway-box", "focus": 0, "gap": 0 },
"startArrowhead": null,
"endArrowhead": "triangle"
},
{
"id": "a-runtime-runs",
"type": "arrow",
"x": 575,
"y": 260,
"width": 265,
"height": 150,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 31,
"version": 1,
"versionNonce": 31,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"points": [[0, 0], [265, 150]],
"lastCommittedPoint": null,
"startBinding": { "elementId": "runtime-box", "focus": 0.3, "gap": 0 },
"endBinding": { "elementId": "runs-box", "focus": -0.8, "gap": 0 },
"startArrowhead": null,
"endArrowhead": "triangle"
},
{
"id": "a-agent-runs",
"type": "arrow",
"x": 530,
"y": 130,
"width": 315,
"height": 280,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "dashed",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 32,
"version": 1,
"versionNonce": 32,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"points": [[0, 0], [315, 280]],
"lastCommittedPoint": null,
"startBinding": { "elementId": "agent-box", "focus": 0.1, "gap": 0 },
"endBinding": { "elementId": "runs-box", "focus": -0.9, "gap": 0 },
"startArrowhead": null,
"endArrowhead": "triangle"
},
{
"id": "a-gateway-pipeline",
"type": "arrow",
"x": 960,
"y": 170,
"width": 190,
"height": 40,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 33,
"version": 1,
"versionNonce": 33,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"points": [[0, 40], [190, 0]],
"lastCommittedPoint": null,
"startBinding": { "elementId": "gateway-box", "focus": -0.65, "gap": 0 },
"endBinding": { "elementId": "pipeline-box", "focus": 0.3, "gap": 0 },
"startArrowhead": null,
"endArrowhead": "triangle"
},
{
"id": "a-gateway-market",
"type": "arrow",
"x": 1060,
"y": 230,
"width": 90,
"height": 40,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 34,
"version": 1,
"versionNonce": 34,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"points": [[0, 0], [90, 40]],
"lastCommittedPoint": null,
"startBinding": { "elementId": "gateway-box", "focus": 0.05, "gap": 0 },
"endBinding": { "elementId": "market-box", "focus": -0.3, "gap": 0 },
"startArrowhead": null,
"endArrowhead": "triangle"
},
{
"id": "a-gateway-storage",
"type": "arrow",
"x": 1020,
"y": 290,
"width": 130,
"height": 90,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 35,
"version": 1,
"versionNonce": 35,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"points": [[0, 0], [130, 90]],
"lastCommittedPoint": null,
"startBinding": { "elementId": "gateway-box", "focus": 0.55, "gap": 0 },
"endBinding": { "elementId": "storage-box", "focus": -0.5, "gap": 0 },
"startArrowhead": null,
"endArrowhead": "triangle"
},
{
"id": "a-gateway-openclaw",
"type": "arrow",
"x": 1005,
"y": 290,
"width": 145,
"height": 240,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "dashed",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 36,
"version": 1,
"versionNonce": 36,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"points": [[0, 0], [145, 240]],
"lastCommittedPoint": null,
"startBinding": { "elementId": "gateway-box", "focus": 0.7, "gap": 0 },
"endBinding": { "elementId": "openclaw-box", "focus": -0.8, "gap": 0 },
"startArrowhead": null,
"endArrowhead": "triangle"
},
{
"id": "a-trading-market",
"type": "arrow",
"x": 650,
"y": 345,
"width": 500,
"height": 0,
"angle": 0,
"strokeColor": "#2b8a3e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 37,
"version": 1,
"versionNonce": 37,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"points": [[0, 0], [500, -65]],
"lastCommittedPoint": null,
"startBinding": { "elementId": "trading-box", "focus": 0.1, "gap": 0 },
"endBinding": { "elementId": "market-box", "focus": 0.25, "gap": 0 },
"startArrowhead": null,
"endArrowhead": "triangle"
},
{
"id": "a-news-market",
"type": "arrow",
"x": 650,
"y": 475,
"width": 500,
"height": 195,
"angle": 0,
"strokeColor": "#2b8a3e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 38,
"version": 1,
"versionNonce": 38,
"isDeleted": false,
"boundElements": [],
"updated": 1,
"link": null,
"locked": false,
"points": [[0, 0], [500, -195]],
"lastCommittedPoint": null,
"startBinding": { "elementId": "news-box", "focus": 0.1, "gap": 0 },
"endBinding": { "elementId": "market-box", "focus": 0.6, "gap": 0 },
"startArrowhead": null,
"endArrowhead": "triangle"
}
],
"appState": {
"viewBackgroundColor": "#ffffff",
"gridSize": 20
},
"files": {}
}