forked from bots-garden/ori
| ✨ Workspace panel, selectors, previews, desktop app, sandbox template, resizable file tree, light/dark theme | 1 | { |
| 2 | "name": "Ori Architecture", | |
| 3 | "width": 1220, | |
| 4 | "height": 640, | |
| 5 | "nodes": [ | |
| 6 | { | |
| 7 | "id": "browser", | |
| 8 | "x": 20, | |
| 9 | "y": 20, | |
| 10 | "w": 220, | |
| 11 | "h": 110, | |
| 12 | "label": "Browser\\nReact SPA", | |
| 13 | "kind": "box" | |
| 14 | }, | |
| 15 | { | |
| 16 | "id": "ui-components", | |
| 17 | "x": 20, | |
| 18 | "y": 150, | |
| 19 | "w": 220, | |
| 20 | "h": 150, | |
| 21 | "label": "UI Components\\n· Agent Panel\\n· Workspace Panel\\n· File Tree\\n· Monaco Editor\\n· Terminal (xterm.js)", | |
| 22 | "kind": "accent" | |
| 23 | }, | |
| 24 | { | |
| 25 | "id": "httpserver", | |
| 26 | "x": 370, | |
| 27 | "y": 20, | |
| 28 | "w": 280, | |
| 29 | "h": 90, | |
| 30 | "label": "httpserver\\nServes SPA + /ws", | |
| 31 | "kind": "dark" | |
| 32 | }, | |
| 33 | { | |
| 34 | "id": "bridge", | |
| 35 | "x": 370, | |
| 36 | "y": 140, | |
| 37 | "w": 280, | |
| 38 | "h": 130, | |
| 39 | "label": "bridge\\n· WebSocket ⇄ ACP\\n· Event broadcast\\n· Permission routing\\n· History replay", | |
| 40 | "kind": "dark" | |
| 41 | }, | |
| 42 | { | |
| 43 | "id": "agent", | |
| 44 | "x": 370, | |
| 45 | "y": 300, | |
| 46 | "w": 135, | |
| 47 | "h": 90, | |
| 48 | "label": "agent\\nACP session\\nlifecycle", | |
| 49 | "kind": "dark" | |
| 50 | }, | |
| 51 | { | |
| 52 | "id": "files", | |
| 53 | "x": 515, | |
| 54 | "y": 300, | |
| 55 | "w": 135, | |
| 56 | "h": 90, | |
| 57 | "label": "files\\nWorkspace\\nfile API", | |
| 58 | "kind": "dark" | |
| 59 | }, | |
| 60 | { | |
| 61 | "id": "terminal", | |
| 62 | "x": 370, | |
| 63 | "y": 410, | |
| 64 | "w": 135, | |
| 65 | "h": 90, | |
| 66 | "label": "terminal\\nPTY per\\nconnection", | |
| 67 | "kind": "dark" | |
| 68 | }, | |
| 69 | { | |
| 70 | "id": "mockagent", | |
| 71 | "x": 515, | |
| 72 | "y": 410, | |
| 73 | "w": 135, | |
| 74 | "h": 90, | |
| 75 | "label": "mockagent\\nDemo agent\\n(testing)", | |
| 76 | "kind": "accent" | |
| 77 | }, | |
| 78 | { | |
| 79 | "id": "acp-agent", | |
| 80 | "x": 800, | |
| 81 | "y": 230, | |
| 82 | "w": 400, | |
| 83 | "h": 130, | |
| 84 | "label": "ACP Agent\\n(claude-code-acp / Gemini CLI)\\n\\nJSON-RPC over stdio\\nsession_update · permission_request", | |
| 85 | "kind": "intent" | |
| 86 | }, | |
| 87 | { | |
| 88 | "id": "note", | |
| 89 | "x": 20, | |
| 90 | "y": 560, | |
| 91 | "w": 1180, | |
| 92 | "h": 60, | |
| 93 | "label": "Go backend bridges browser WebSockets to ACP stdio, broadcasting agent updates to all connected browsers while routing permissions back to the waiting call.", | |
| 94 | "kind": "note" | |
| 95 | } | |
| 96 | ], | |
| 97 | "edges": [ | |
| 98 | { "from": "browser", "to": "httpserver", "label": "1. load SPA" }, | |
| 99 | { | |
| 100 | "from": "browser", | |
| 101 | "to": "bridge", | |
| 102 | "label": "2. WebSocket\\n/ws", | |
| 103 | "fromSide": "right", | |
| 104 | "fromAt": 100, | |
| 105 | "toSide": "left", | |
| 106 | "toAt": 180 | |
| 107 | }, | |
| 108 | { | |
| 109 | "from": "ui-components", | |
| 110 | "to": "bridge", | |
| 111 | "label": "3. prompt +\\npermission\\nresponses", | |
| 112 | "fromSide": "right", | |
| 113 | "fromAt": 225, | |
| 114 | "toSide": "left", | |
| 115 | "toAt": 225 | |
| 116 | }, | |
| 117 | { | |
| 118 | "from": "bridge", | |
| 119 | "to": "ui-components", | |
| 120 | "label": "4. session_update\\nevents (replay)", | |
| 121 | "dashed": true, | |
| 122 | "waypoints": [{ "x": 310, "y": 230 }, { "x": 280, "y": 230 }] | |
| 123 | }, | |
| 124 | { | |
| 125 | "from": "bridge", | |
| 126 | "to": "agent", | |
| 127 | "label": "5. ACP\\nlifecycle", | |
| 128 | "fromSide": "bottom", | |
| 129 | "fromAt": 450, | |
| 130 | "toSide": "top", | |
| 131 | "toAt": 437 | |
| 132 | }, | |
| 133 | { | |
| 134 | "from": "agent", | |
| 135 | "to": "acp-agent", | |
| 136 | "label": "6. stdio\\nJSON-RPC", | |
| 137 | "fromSide": "right", | |
| 138 | "fromAt": 345, | |
| 139 | "toSide": "left", | |
| 140 | "toAt": 295 | |
| 141 | }, | |
| 142 | { | |
| 143 | "from": "acp-agent", | |
| 144 | "to": "bridge", | |
| 145 | "label": "7. updates +\\npermissions", | |
| 146 | "dashed": true, | |
| 147 | "waypoints": [{ "x": 720, "y": 200 }, { "x": 650, "y": 200 }] | |
| 148 | }, | |
| 149 | { | |
| 150 | "from": "ui-components", | |
| 151 | "to": "files", | |
| 152 | "label": "file ops", | |
| 153 | "fromSide": "right", | |
| 154 | "fromAt": 280, | |
| 155 | "toSide": "left", | |
| 156 | "toAt": 345, | |
| 157 | "dashed": true | |
| 158 | }, | |
| 159 | { | |
| 160 | "from": "ui-components", | |
| 161 | "to": "terminal", | |
| 162 | "label": "shell I/O", | |
| 163 | "fromSide": "bottom", | |
| 164 | "fromAt": 130, | |
| 165 | "toSide": "left", | |
| 166 | "toAt": 455, | |
| 167 | "dashed": true | |
| 168 | } | |
| 169 | ] | |
| 170 | } |