rdc 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. rdc-0.1.0/.ai/browser-context-design.md +58 -0
  2. rdc-0.1.0/.ai/context.md +123 -0
  3. rdc-0.1.0/.ai/learnings.md +67 -0
  4. rdc-0.1.0/.ai/worker-design.md +62 -0
  5. rdc-0.1.0/.cursorrules +726 -0
  6. rdc-0.1.0/.github/workflows/publish.yml +78 -0
  7. rdc-0.1.0/.gitignore +39 -0
  8. rdc-0.1.0/AGENTS.md +732 -0
  9. rdc-0.1.0/CLAUDE.md +817 -0
  10. rdc-0.1.0/GEMINI.md +732 -0
  11. rdc-0.1.0/LICENSE +21 -0
  12. rdc-0.1.0/PKG-INFO +298 -0
  13. rdc-0.1.0/README.md +231 -0
  14. rdc-0.1.0/SETUP.md +47 -0
  15. rdc-0.1.0/TODO.md +37 -0
  16. rdc-0.1.0/design_knowledge_system.md +293 -0
  17. rdc-0.1.0/design_orchestrator.md +727 -0
  18. rdc-0.1.0/design_persistent_memory_and_voice.md +373 -0
  19. rdc-0.1.0/docs/VISUAL_STREAMING_COMPLETE.md +252 -0
  20. rdc-0.1.0/docs/ai-agent-guide.md +236 -0
  21. rdc-0.1.0/docs/architecture/data-layer.md +236 -0
  22. rdc-0.1.0/docs/architecture/phone-calling.md +186 -0
  23. rdc-0.1.0/docs/architecture/security-audit-findings.md +62 -0
  24. rdc-0.1.0/docs/architecture/security-audit.md +425 -0
  25. rdc-0.1.0/docs/architecture/state-machine.md +230 -0
  26. rdc-0.1.0/docs/configuration.md +197 -0
  27. rdc-0.1.0/docs/frontend-live-spec.md +426 -0
  28. rdc-0.1.0/docs/human-guide.md +334 -0
  29. rdc-0.1.0/docs/mcp-setup.md +143 -0
  30. rdc-0.1.0/docs/one-loop-dev-cycle.md +146 -0
  31. rdc-0.1.0/docs/remote-desktop-agent-plan.md +63 -0
  32. rdc-0.1.0/docs/visual-streaming-quickstart.md +75 -0
  33. rdc-0.1.0/docs/visual-streaming.md +379 -0
  34. rdc-0.1.0/frontend/.gitignore +24 -0
  35. rdc-0.1.0/frontend/README.md +73 -0
  36. rdc-0.1.0/frontend/components.json +23 -0
  37. rdc-0.1.0/frontend/eslint.config.js +23 -0
  38. rdc-0.1.0/frontend/index.html +12 -0
  39. rdc-0.1.0/frontend/package-lock.json +9594 -0
  40. rdc-0.1.0/frontend/package.json +54 -0
  41. rdc-0.1.0/frontend/pnpm-lock.yaml +7429 -0
  42. rdc-0.1.0/frontend/public/rrweb.min.js +19 -0
  43. rdc-0.1.0/frontend/src/App.tsx +156 -0
  44. rdc-0.1.0/frontend/src/components/collection-picker.tsx +96 -0
  45. rdc-0.1.0/frontend/src/components/global-text-input.tsx +341 -0
  46. rdc-0.1.0/frontend/src/components/project-bar.tsx +517 -0
  47. rdc-0.1.0/frontend/src/components/toast.tsx +29 -0
  48. rdc-0.1.0/frontend/src/components/ui/badge.tsx +48 -0
  49. rdc-0.1.0/frontend/src/components/ui/button.tsx +64 -0
  50. rdc-0.1.0/frontend/src/components/ui/card.tsx +92 -0
  51. rdc-0.1.0/frontend/src/components/ui/input.tsx +21 -0
  52. rdc-0.1.0/frontend/src/components/ui/scroll-area.tsx +58 -0
  53. rdc-0.1.0/frontend/src/components/ui/separator.tsx +28 -0
  54. rdc-0.1.0/frontend/src/components/ui/tabs.tsx +89 -0
  55. rdc-0.1.0/frontend/src/components/ui/textarea.tsx +18 -0
  56. rdc-0.1.0/frontend/src/components/ui/tooltip.tsx +55 -0
  57. rdc-0.1.0/frontend/src/features/activity/activity-feed.tsx +86 -0
  58. rdc-0.1.0/frontend/src/features/agent/agent-run-panel.tsx +295 -0
  59. rdc-0.1.0/frontend/src/features/auth/pair-approve.tsx +102 -0
  60. rdc-0.1.0/frontend/src/features/browser/browser-panel.tsx +564 -0
  61. rdc-0.1.0/frontend/src/features/browser/floating-agent-panel.tsx +225 -0
  62. rdc-0.1.0/frontend/src/features/browser/pinchtab-panel.tsx +523 -0
  63. rdc-0.1.0/frontend/src/features/browser/recording-player.tsx +340 -0
  64. rdc-0.1.0/frontend/src/features/browser/unified-browser-panel.tsx +759 -0
  65. rdc-0.1.0/frontend/src/features/chat/chat-fab.tsx +123 -0
  66. rdc-0.1.0/frontend/src/features/chat/chat-panel.tsx +99 -0
  67. rdc-0.1.0/frontend/src/features/chat/chat-renderer.tsx +117 -0
  68. rdc-0.1.0/frontend/src/features/command-bar/command-bar.tsx +133 -0
  69. rdc-0.1.0/frontend/src/features/logs/logs-panel.tsx +162 -0
  70. rdc-0.1.0/frontend/src/features/mobile/activity-sheet.tsx +76 -0
  71. rdc-0.1.0/frontend/src/features/mobile/add-project-sheet.tsx +251 -0
  72. rdc-0.1.0/frontend/src/features/mobile/attention-card.tsx +36 -0
  73. rdc-0.1.0/frontend/src/features/mobile/browser-card.tsx +232 -0
  74. rdc-0.1.0/frontend/src/features/mobile/chat-card.tsx +236 -0
  75. rdc-0.1.0/frontend/src/features/mobile/contexts-card.tsx +161 -0
  76. rdc-0.1.0/frontend/src/features/mobile/create-task-sheet.tsx +10 -0
  77. rdc-0.1.0/frontend/src/features/mobile/dictation-card.tsx +158 -0
  78. rdc-0.1.0/frontend/src/features/mobile/hamburger-sheet.tsx +137 -0
  79. rdc-0.1.0/frontend/src/features/mobile/mobile-command-bar.tsx +167 -0
  80. rdc-0.1.0/frontend/src/features/mobile/paired-devices-sheet.tsx +120 -0
  81. rdc-0.1.0/frontend/src/features/mobile/pinchtab-card.tsx +71 -0
  82. rdc-0.1.0/frontend/src/features/mobile/pinchtab-overlay.tsx +219 -0
  83. rdc-0.1.0/frontend/src/features/mobile/process-log-overlay.tsx +79 -0
  84. rdc-0.1.0/frontend/src/features/mobile/processes-card.tsx +229 -0
  85. rdc-0.1.0/frontend/src/features/mobile/project-card.tsx +77 -0
  86. rdc-0.1.0/frontend/src/features/mobile/project-sheet.tsx +115 -0
  87. rdc-0.1.0/frontend/src/features/mobile/sheet.tsx +94 -0
  88. rdc-0.1.0/frontend/src/features/mobile/task-output-overlay.tsx +126 -0
  89. rdc-0.1.0/frontend/src/features/mobile/tasks-card.tsx +349 -0
  90. rdc-0.1.0/frontend/src/features/mobile/terminal-overlay.tsx +310 -0
  91. rdc-0.1.0/frontend/src/features/mobile/terminals-card.tsx +198 -0
  92. rdc-0.1.0/frontend/src/features/modals/browser-preview.tsx +169 -0
  93. rdc-0.1.0/frontend/src/features/modals/collections-manager.tsx +216 -0
  94. rdc-0.1.0/frontend/src/features/modals/context-viewer.tsx +168 -0
  95. rdc-0.1.0/frontend/src/features/modals/pair-device.tsx +106 -0
  96. rdc-0.1.0/frontend/src/features/modals/port-assignments.tsx +179 -0
  97. rdc-0.1.0/frontend/src/features/modals/project-settings.tsx +778 -0
  98. rdc-0.1.0/frontend/src/features/modals/screenshots.tsx +159 -0
  99. rdc-0.1.0/frontend/src/features/modals/system-settings.tsx +1530 -0
  100. rdc-0.1.0/frontend/src/features/output/output-panel.tsx +121 -0
  101. rdc-0.1.0/frontend/src/features/processes/add-action-form.tsx +176 -0
  102. rdc-0.1.0/frontend/src/features/processes/process-list.tsx +210 -0
  103. rdc-0.1.0/frontend/src/features/right-tabs/right-tabs.tsx +1093 -0
  104. rdc-0.1.0/frontend/src/features/stats/stats-grid.tsx +28 -0
  105. rdc-0.1.0/frontend/src/features/tasks/create-task-form.tsx +351 -0
  106. rdc-0.1.0/frontend/src/features/tasks/task-list.tsx +122 -0
  107. rdc-0.1.0/frontend/src/features/tasks/task-panel.tsx +564 -0
  108. rdc-0.1.0/frontend/src/features/terminal/bottom-panel.tsx +337 -0
  109. rdc-0.1.0/frontend/src/features/terminal/embedded-terminal.tsx +538 -0
  110. rdc-0.1.0/frontend/src/features/terminal/terminal-view.tsx +710 -0
  111. rdc-0.1.0/frontend/src/hooks/use-browser-agent.ts +269 -0
  112. rdc-0.1.0/frontend/src/hooks/use-mount-effect.ts +12 -0
  113. rdc-0.1.0/frontend/src/hooks/use-orchestrator.ts +542 -0
  114. rdc-0.1.0/frontend/src/hooks/use-voice.ts +245 -0
  115. rdc-0.1.0/frontend/src/index.css +561 -0
  116. rdc-0.1.0/frontend/src/layouts/desktop.tsx +319 -0
  117. rdc-0.1.0/frontend/src/layouts/kiosk.tsx +855 -0
  118. rdc-0.1.0/frontend/src/layouts/mobile.tsx +467 -0
  119. rdc-0.1.0/frontend/src/lib/agent-presets.ts +58 -0
  120. rdc-0.1.0/frontend/src/lib/api.ts +74 -0
  121. rdc-0.1.0/frontend/src/lib/chat-catalog.ts +112 -0
  122. rdc-0.1.0/frontend/src/lib/chat-components.tsx +140 -0
  123. rdc-0.1.0/frontend/src/lib/client-id.ts +25 -0
  124. rdc-0.1.0/frontend/src/lib/utils.ts +14 -0
  125. rdc-0.1.0/frontend/src/lib/ws.ts +113 -0
  126. rdc-0.1.0/frontend/src/main.tsx +28 -0
  127. rdc-0.1.0/frontend/src/stores/agent-run-store.ts +84 -0
  128. rdc-0.1.0/frontend/src/stores/auth-store.ts +29 -0
  129. rdc-0.1.0/frontend/src/stores/browser-store.ts +117 -0
  130. rdc-0.1.0/frontend/src/stores/dictation-store.ts +51 -0
  131. rdc-0.1.0/frontend/src/stores/logs-store.ts +338 -0
  132. rdc-0.1.0/frontend/src/stores/pinchtab-store.ts +215 -0
  133. rdc-0.1.0/frontend/src/stores/process-store.ts +128 -0
  134. rdc-0.1.0/frontend/src/stores/project-store.ts +139 -0
  135. rdc-0.1.0/frontend/src/stores/state-store.ts +264 -0
  136. rdc-0.1.0/frontend/src/stores/terminal-presets-store.ts +68 -0
  137. rdc-0.1.0/frontend/src/stores/terminal-store.ts +95 -0
  138. rdc-0.1.0/frontend/src/stores/ui-store.ts +139 -0
  139. rdc-0.1.0/frontend/src/types/index.ts +126 -0
  140. rdc-0.1.0/frontend/tsconfig.app.json +32 -0
  141. rdc-0.1.0/frontend/tsconfig.json +13 -0
  142. rdc-0.1.0/frontend/tsconfig.node.json +26 -0
  143. rdc-0.1.0/frontend/vite.config.ts +80 -0
  144. rdc-0.1.0/install.sh +267 -0
  145. rdc-0.1.0/mcp-config.json +9 -0
  146. rdc-0.1.0/pyproject.toml +99 -0
  147. rdc-0.1.0/rdc.yaml +10 -0
  148. rdc-0.1.0/rdc.yml +6 -0
  149. rdc-0.1.0/src/gwd/__init__.py +69 -0
  150. rdc-0.1.0/src/gwd/__main__.py +70 -0
  151. rdc-0.1.0/src/gwd/classify.py +63 -0
  152. rdc-0.1.0/src/gwd/client.py +46 -0
  153. rdc-0.1.0/src/gwd/executor.py +165 -0
  154. rdc-0.1.0/src/gwd/orchestrator.py +224 -0
  155. rdc-0.1.0/src/gwd/planner.py +191 -0
  156. rdc-0.1.0/src/gwd/prompts.py +100 -0
  157. rdc-0.1.0/src/gwd/tools.py +363 -0
  158. rdc-0.1.0/src/gwd/types.py +98 -0
  159. rdc-0.1.0/src/gwd/verifier.py +158 -0
  160. rdc-0.1.0/src/remote_dev_ctrl/__init__.py +3 -0
  161. rdc-0.1.0/src/remote_dev_ctrl/cli.py +1629 -0
  162. rdc-0.1.0/src/remote_dev_ctrl/llm.py +464 -0
  163. rdc-0.1.0/src/remote_dev_ctrl/mcp/__init__.py +8 -0
  164. rdc-0.1.0/src/remote_dev_ctrl/mcp/server.py +361 -0
  165. rdc-0.1.0/src/remote_dev_ctrl/scaffold.py +1058 -0
  166. rdc-0.1.0/src/remote_dev_ctrl/server/__init__.py +1 -0
  167. rdc-0.1.0/src/remote_dev_ctrl/server/actions.py +178 -0
  168. rdc-0.1.0/src/remote_dev_ctrl/server/agents/__init__.py +9 -0
  169. rdc-0.1.0/src/remote_dev_ctrl/server/agents/gwd_provider.py +117 -0
  170. rdc-0.1.0/src/remote_dev_ctrl/server/agents/manager.py +385 -0
  171. rdc-0.1.0/src/remote_dev_ctrl/server/agents/provider.py +89 -0
  172. rdc-0.1.0/src/remote_dev_ctrl/server/agents/terminal_provider.py +170 -0
  173. rdc-0.1.0/src/remote_dev_ctrl/server/agents/tools.py +615 -0
  174. rdc-0.1.0/src/remote_dev_ctrl/server/agents/web_provider.py +342 -0
  175. rdc-0.1.0/src/remote_dev_ctrl/server/app.py +8130 -0
  176. rdc-0.1.0/src/remote_dev_ctrl/server/audit.py +372 -0
  177. rdc-0.1.0/src/remote_dev_ctrl/server/auth.py +359 -0
  178. rdc-0.1.0/src/remote_dev_ctrl/server/browser.py +1518 -0
  179. rdc-0.1.0/src/remote_dev_ctrl/server/browser_use.py +189 -0
  180. rdc-0.1.0/src/remote_dev_ctrl/server/caddy.py +384 -0
  181. rdc-0.1.0/src/remote_dev_ctrl/server/channels/__init__.py +1 -0
  182. rdc-0.1.0/src/remote_dev_ctrl/server/channels/phone.py +796 -0
  183. rdc-0.1.0/src/remote_dev_ctrl/server/channels/telegram.py +877 -0
  184. rdc-0.1.0/src/remote_dev_ctrl/server/chrome.py +246 -0
  185. rdc-0.1.0/src/remote_dev_ctrl/server/collections_page.py +174 -0
  186. rdc-0.1.0/src/remote_dev_ctrl/server/config.py +363 -0
  187. rdc-0.1.0/src/remote_dev_ctrl/server/context_synthesizer.py +138 -0
  188. rdc-0.1.0/src/remote_dev_ctrl/server/conversation.py +268 -0
  189. rdc-0.1.0/src/remote_dev_ctrl/server/dashboard.py +1679 -0
  190. rdc-0.1.0/src/remote_dev_ctrl/server/db/__init__.py +87 -0
  191. rdc-0.1.0/src/remote_dev_ctrl/server/db/connection.py +107 -0
  192. rdc-0.1.0/src/remote_dev_ctrl/server/db/migrate.py +592 -0
  193. rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/logs/20260210000001_create_schema.sql +62 -0
  194. rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/rdc/20260210000001_create_schema.sql +81 -0
  195. rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/rdc/20260210000002_add_project_description.sql +7 -0
  196. rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/rdc/20260210000003_runtime_state_tables.sql +53 -0
  197. rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/rdc/20260212000004_add_collections.sql +21 -0
  198. rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/rdc/20260213000005_add_agent_sessions.sql +18 -0
  199. rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/rdc/20260222000006_browser_nullable_process_id.sql +48 -0
  200. rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/rdc/20260222000007_add_recordings.sql +21 -0
  201. rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/rdc/20260305000008_add_recipes.sql +17 -0
  202. rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/rdc/20260312000009_add_project_tags.sql +5 -0
  203. rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/rdc/20260316000010_add_actions.sql +6 -0
  204. rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/tasks/20260210000001_create_schema.sql +48 -0
  205. rdc-0.1.0/src/remote_dev_ctrl/server/db/models.py +365 -0
  206. rdc-0.1.0/src/remote_dev_ctrl/server/db/repositories.py +1616 -0
  207. rdc-0.1.0/src/remote_dev_ctrl/server/debug_page.py +689 -0
  208. rdc-0.1.0/src/remote_dev_ctrl/server/event_store.py +346 -0
  209. rdc-0.1.0/src/remote_dev_ctrl/server/events/__init__.py +5 -0
  210. rdc-0.1.0/src/remote_dev_ctrl/server/events/bus.py +144 -0
  211. rdc-0.1.0/src/remote_dev_ctrl/server/intent.py +2665 -0
  212. rdc-0.1.0/src/remote_dev_ctrl/server/middleware.py +354 -0
  213. rdc-0.1.0/src/remote_dev_ctrl/server/orchestrator.py +297 -0
  214. rdc-0.1.0/src/remote_dev_ctrl/server/pinchtab.py +393 -0
  215. rdc-0.1.0/src/remote_dev_ctrl/server/ports.py +188 -0
  216. rdc-0.1.0/src/remote_dev_ctrl/server/process_discovery.py +521 -0
  217. rdc-0.1.0/src/remote_dev_ctrl/server/processes.py +951 -0
  218. rdc-0.1.0/src/remote_dev_ctrl/server/pty_relay.py +505 -0
  219. rdc-0.1.0/src/remote_dev_ctrl/server/queue/__init__.py +9 -0
  220. rdc-0.1.0/src/remote_dev_ctrl/server/recipes.py +153 -0
  221. rdc-0.1.0/src/remote_dev_ctrl/server/recording.py +203 -0
  222. rdc-0.1.0/src/remote_dev_ctrl/server/scrubber.py +200 -0
  223. rdc-0.1.0/src/remote_dev_ctrl/server/state_machine.py +983 -0
  224. rdc-0.1.0/src/remote_dev_ctrl/server/static/rrweb.min.js +19 -0
  225. rdc-0.1.0/src/remote_dev_ctrl/server/static/shared.css +698 -0
  226. rdc-0.1.0/src/remote_dev_ctrl/server/static/vendor/tailwind.js +65 -0
  227. rdc-0.1.0/src/remote_dev_ctrl/server/static/vendor/xstate.js +2 -0
  228. rdc-0.1.0/src/remote_dev_ctrl/server/static/vendor/xterm-addon-fit.js +2 -0
  229. rdc-0.1.0/src/remote_dev_ctrl/server/static/vendor/xterm-addon-unicode11.js +8 -0
  230. rdc-0.1.0/src/remote_dev_ctrl/server/static/vendor/xterm-addon-web-links.js +2 -0
  231. rdc-0.1.0/src/remote_dev_ctrl/server/static/vendor/xterm.css +209 -0
  232. rdc-0.1.0/src/remote_dev_ctrl/server/static/vendor/xterm.js +2 -0
  233. rdc-0.1.0/src/remote_dev_ctrl/server/streaming.py +191 -0
  234. rdc-0.1.0/src/remote_dev_ctrl/server/terminal.py +1200 -0
  235. rdc-0.1.0/src/remote_dev_ctrl/server/tts.py +310 -0
  236. rdc-0.1.0/src/remote_dev_ctrl/server/vault.py +229 -0
  237. rdc-0.1.0/src/remote_dev_ctrl/server/vnc.py +527 -0
  238. rdc-0.1.0/src/remote_dev_ctrl/server/voice_agent.py +169 -0
  239. rdc-0.1.0/src/remote_dev_ctrl/server/worker.py +880 -0
  240. rdc-0.1.0/tests/test_visual_streaming.py +172 -0
  241. rdc-0.1.0/uv.lock +3708 -0
@@ -0,0 +1,58 @@
1
+ # Browser Context & Preview System
2
+
3
+ ## Overview
4
+
5
+ RDC provides shared browser sessions between the developer and AI agents, with context capture (screenshot + accessibility tree) for feeding visual information to agents.
6
+
7
+ ## Architecture
8
+
9
+ ```
10
+ Dashboard (iframe viewer)
11
+ ↓ session_id
12
+ RDC Server (FastAPI)
13
+ ├── BrowserManager (browser.py)
14
+ │ ├── create_session(target_url)
15
+ │ ├── capture_context(session_id)
16
+ │ └── stop_session(session_id)
17
+ ↓ CDP (WebSocket)
18
+ Browserless Docker Container
19
+ (ghcr.io/browserless/chromium)
20
+ ```
21
+
22
+ ## Components
23
+
24
+ ### Browser Sessions
25
+ - Browserless Docker containers with headless Chromium
26
+ - CDP (Chrome DevTools Protocol) for programmatic access
27
+ - Live viewer embeddable in dashboard iframe
28
+ - Session state persisted in SQLite (`browser_sessions` table)
29
+
30
+ ### Context Capture
31
+ - Screenshot + accessibility tree + page metadata
32
+ - Stored in `~/.rdc/contexts/`
33
+ - Attachable to tasks for agent consumption
34
+ - API: `POST /context/capture`, `GET /context`, `GET /context/{id}/screenshot`
35
+
36
+ ### rrweb Session Recording
37
+ - Records DOM mutations for session replay
38
+ - CDP binding for low-latency event push
39
+ - Periodic buffer drain as fallback
40
+ - Chunked JSON storage in `~/.rdc/recordings/{rec_id}/chunk_{n}.json`
41
+
42
+ ### PinchTab Integration
43
+ - Connect to existing browser tabs (no Docker needed)
44
+ - Uses PinchTab browser extension for CDP access
45
+ - Same context capture capabilities
46
+
47
+ ## Dashboard Integration
48
+
49
+ - **Browser tab**: Start/stop sessions, view in iframe, capture context
50
+ - **Attachments tab**: Browse captured contexts, share with agents
51
+ - **PinchTab tab**: Connect to existing browser tabs
52
+
53
+ ## MCP Tools
54
+
55
+ Agents can capture and read browser context via MCP:
56
+ - `capture_browser_context` — screenshot + a11y tree
57
+ - `get_browser_context` — read previously captured context
58
+ - `browser_eval` — evaluate JavaScript in the browser
@@ -0,0 +1,123 @@
1
+ # RDC (Remote Dev Ctrl) - Development Context
2
+
3
+ Last Updated: 2026-03-12
4
+
5
+ ## Project Overview
6
+
7
+ RDC is a command center for AI-assisted development. FastAPI server + React dashboard + CLI for managing projects, terminals, tasks, processes, and AI agents.
8
+
9
+ - **Web dashboard**: `http://127.0.0.1:8420` (three layouts: desktop, mobile, kiosk)
10
+ - **CLI**: `rdc` (Typer-based)
11
+ - **Remote access**: Cloudflare Tunnel + Caddy reverse proxy
12
+
13
+ ## Architecture
14
+
15
+ ### Backend (`src/remote_dev_ctrl/server/`)
16
+
17
+ | File | Purpose |
18
+ |------|---------|
19
+ | `app.py` | FastAPI routes, WebSocket handlers, API endpoints |
20
+ | `config.py` | Config loading, RDC_HOME resolution |
21
+ | `terminal.py` | PTY management (`socat`-based), WebSocket relay |
22
+ | `worker.py` | Task execution engine (polls DB, spawns agents) |
23
+ | `intent.py` | AI orchestrator (natural language → dashboard actions) |
24
+ | `streaming.py` | SSE/streaming endpoints |
25
+ | `knowledge.py` | Bridge between DB projects and knowledge indexer |
26
+ | `middleware.py` | Auth middleware, rate limiting, public path config |
27
+ | `browser.py` | Browserless container management, CDP context capture |
28
+ | `agents/manager.py` | Agent provider abstraction |
29
+ | `db/connection.py` | SQLite connection pool |
30
+ | `db/repositories.py` | SQLite repositories (Project, Task, Event, etc.) |
31
+ | `db/models.py` | Pydantic models for all DB tables |
32
+ | `db/migrate.py` | SQL migration runner (auto-runs on startup) |
33
+
34
+ ### Frontend (`frontend/src/`)
35
+
36
+ | Directory | Purpose |
37
+ |-----------|---------|
38
+ | `layouts/` | `desktop.tsx`, `mobile.tsx`, `kiosk.tsx` — all first-class |
39
+ | `features/` | Feature modules (terminal, tasks, chat, browser, wiki, mobile) |
40
+ | `stores/` | Zustand state (state-store, ui-store, terminal-store, etc.) |
41
+ | `hooks/` | Shared hooks (use-orchestrator, use-voice) |
42
+ | `components/` | Shared UI components |
43
+ | `lib/` | API client, WebSocket manager, utilities |
44
+
45
+ ### Key Subsystems
46
+
47
+ 1. **Terminal System** (`terminal.py`)
48
+ - PTY relay via `socat` subprocesses — survive server restarts
49
+ - Session metadata in `~/.rdc/terminal_sessions.json`
50
+ - WebSocket relay at `/terminals/{id}/ws`
51
+ - MCP approval detection for cursor-agent
52
+
53
+ 2. **Task/Worker System** (`worker.py`)
54
+ - API creates tasks in SQLite (`status: pending`)
55
+ - Worker polls DB, claims tasks, spawns agent subprocesses
56
+ - Agent monitoring, completion handling, orphan recovery
57
+ - Worker heartbeat for liveness detection
58
+
59
+ 3. **State Synchronization**
60
+ - Server → WebSocket `/ws/state` → `state-store.ts` → Zustand selectors
61
+ - All connected clients get real-time state updates
62
+
63
+ 4. **Browser Preview** (`browser.py`)
64
+ - Browserless Docker containers for shared browser sessions
65
+ - CDP-based context capture (screenshot + accessibility tree)
66
+ - rrweb session recording with chunked storage
67
+ - PinchTab integration for connecting to existing browser tabs
68
+
69
+ 5. **Knowledge Base** (`knowledge.py` + `frontend/src/features/wiki/`)
70
+ - Indexes `.ai/` directories from registered projects
71
+ - Full-page route at `/kb` with tree nav, search, markdown viewer
72
+ - Create/edit docs via REST API
73
+
74
+ 6. **AI Orchestrator** (`intent.py`)
75
+ - Natural language → structured actions (open terminal, create task, etc.)
76
+ - Used by chat panels and voice commands
77
+
78
+ ## Database
79
+
80
+ Single SQLite database at `~/.rdc/data/rdc.db` (consolidated from previous multi-DB setup).
81
+
82
+ Schema managed by SQL migrations in `src/remote_dev_ctrl/server/db/migrations/rdc/`.
83
+ Migrations auto-run on server startup via `db/migrate.py`.
84
+
85
+ Key tables: `projects`, `tasks`, `events`, `workers`, `browser_sessions`, `contexts`, `agent_registry`, `process_configs`, `settings`.
86
+
87
+ ## CLI Commands
88
+
89
+ ```bash
90
+ rdc server start [--reload] # Start FastAPI server
91
+ rdc server start -d # Daemonized
92
+ rdc add <name> <path> # Register a project
93
+ rdc list # List projects
94
+ rdc remove <name> # Remove a project
95
+ ```
96
+
97
+ ## Development
98
+
99
+ ```bash
100
+ # Frontend build (must pass with zero errors)
101
+ cd frontend && pnpm run build
102
+
103
+ # Frontend dev server (proxies API to :8420)
104
+ cd frontend && pnpm dev
105
+
106
+ # Server with hot-reload
107
+ rdc server start --reload
108
+
109
+ # Type-check only
110
+ cd frontend && npx tsc --noEmit
111
+ ```
112
+
113
+ ## File Locations
114
+
115
+ - Main server: `src/remote_dev_ctrl/server/`
116
+ - Frontend: `frontend/src/`
117
+ - Database: `~/.rdc/data/rdc.db`
118
+ - Migrations: `src/remote_dev_ctrl/server/db/migrations/rdc/`
119
+ - Config: `~/.rdc/config.yml`
120
+ - Agent logs: `~/.rdc/logs/agents/`
121
+ - Process logs: `~/.rdc/logs/processes/`
122
+ - Browser recordings: `~/.rdc/recordings/`
123
+ - Context snapshots: `~/.rdc/contexts/`
@@ -0,0 +1,67 @@
1
+ # RDC Development Learnings
2
+
3
+ Corrections and patterns learned during development.
4
+
5
+ ## Rebrand: adt → rdc
6
+
7
+ The project was rebranded from `agent-dev-tool` (CLI: `adt`) to `remote-dev-ctrl` (CLI: `rdc`).
8
+ - Python module: `src/remote_dev_ctrl/`
9
+ - Config dir: `~/.rdc/` (falls back to `~/.adt/` for compat)
10
+ - DB: `rdc.db` (falls back to `adt.db`)
11
+ - Env vars: `RDC_HOME`, `RDC_SECRET_KEY` (falls back to `ADT_*`)
12
+ - Frontend localStorage: `rdc_*` (migration shim in `main.tsx`)
13
+
14
+ ## All Three Layouts Are First-Class
15
+
16
+ Desktop, Mobile, and Kiosk layouts must all be updated when making feature changes.
17
+ - Desktop: `layouts/desktop.tsx`
18
+ - Mobile: `layouts/mobile.tsx`
19
+ - Kiosk: `layouts/kiosk.tsx`
20
+
21
+ ## Terminal PTY Architecture
22
+
23
+ - `terminal.py` uses `socat`-based PTY relay processes that survive server restarts
24
+ - Background buffer polling pre-WebSocket, event-loop `add_reader` post-connect
25
+ - MCP detection: server-side `_mcp_approval_needed` flag in StateSnapshot
26
+ - Default command: plain `cursor-agent` (no --resume). Configurable per-project.
27
+
28
+ ## cursor-agent Quirks
29
+
30
+ - `cursor-agent --resume` + MCP Server Approval = exits with code 0 (bug)
31
+ - `cursor-agent` (fresh session, no `--resume`) works correctly
32
+ - Uses Ink (React terminal UI) — requires raw mode on stdin, needs a real PTY
33
+
34
+ ## CDP / rrweb Recording
35
+
36
+ - `Runtime.evaluate` scopes `var` declarations — use `window.rrweb = ...` explicitly
37
+ - Dual push/pull: CDP binding for low-latency + periodic buffer drain as fallback
38
+ - Recordings stored as chunked JSON in `~/.rdc/recordings/{rec_id}/chunk_{n}.json`
39
+
40
+ ## Frontend Build
41
+
42
+ - `pnpm run build` runs `tsc -b && vite build`
43
+ - Unused variables/imports are build errors (strict TypeScript)
44
+ - Always build after changes to verify zero errors
45
+
46
+ ## Auth Middleware
47
+
48
+ - Public paths defined in `middleware.py` (`PUBLIC_PATHS` and `PUBLIC_PATH_PREFIXES`)
49
+ - New SPA routes must be added to public paths so the frontend `index.html` gets served
50
+ - Frontend handles auth client-side via localStorage token
51
+
52
+ ## Flexbox Height Issues
53
+
54
+ Use proper flexbox chain to prevent panels from being cut off:
55
+ ```html
56
+ <div class="h-screen flex flex-col">
57
+ <header class="shrink-0">...</header>
58
+ <main class="flex-1 min-h-0 overflow-auto">...</main>
59
+ </div>
60
+ ```
61
+ Key: `min-h-0` on flex children prevents content from expanding beyond bounds.
62
+
63
+ ## Database Migrations
64
+
65
+ - SQL files in `src/remote_dev_ctrl/server/db/migrations/rdc/`
66
+ - Auto-run on server startup via `db/migrate.py`
67
+ - Single consolidated SQLite DB at `~/.rdc/data/rdc.db`
@@ -0,0 +1,62 @@
1
+ # RDC Task Worker Architecture
2
+
3
+ ## Overview
4
+
5
+ The worker is a background process that executes tasks by spawning agent subprocesses. It's decoupled from the API server so tasks survive API restarts.
6
+
7
+ ## Architecture
8
+
9
+ ```
10
+ ┌─────────────────────────────────────────────┐
11
+ │ SQLite DB │
12
+ │ tasks (queue) │ agents (state) │ workers │
13
+ └────────────────┼────────────────┼────────────┘
14
+ poll │ update │ heartbeat
15
+ ┌────────────────▼────────────────▼────────────┐
16
+ │ RDC Worker │
17
+ │ Task Poller → Agent Monitor → Health Report │
18
+ │ ↓ │
19
+ │ Agent Subprocesses (cursor-agent, etc.) │
20
+ └──────────────────────────────────────────────┘
21
+ (independent)
22
+ ┌──────────────────────────────────────────────┐
23
+ │ FastAPI Server │
24
+ │ POST /tasks (insert) │ WebSocket (broadcast)│
25
+ └──────────────────────────────────────────────┘
26
+ ```
27
+
28
+ ## How It Works
29
+
30
+ 1. **API** creates tasks in DB (`status: pending`)
31
+ 2. **Worker** polls DB, atomically claims next pending task
32
+ 3. **Worker** spawns agent subprocess (cursor-agent or web-native)
33
+ 4. **Worker** monitors subprocess for completion
34
+ 5. **Worker** updates task status in DB (completed/failed)
35
+ 6. **API** reads updated state, broadcasts via WebSocket
36
+
37
+ ## Key Components
38
+
39
+ - `server/worker.py` — TaskWorker class with poll/spawn/monitor/heartbeat loops
40
+ - `server/agents/manager.py` — AgentManager for subprocess lifecycle
41
+ - `db/repositories.py` — TaskRepository with atomic claim/complete/fail operations
42
+
43
+ ## Task Lifecycle
44
+
45
+ ```
46
+ pending → claimed (by worker) → in_progress → completed/failed
47
+
48
+ needs_review → approved/rejected
49
+ ```
50
+
51
+ ## CLI
52
+
53
+ ```bash
54
+ rdc server start # Server includes integrated worker
55
+ rdc server start -d # Daemonized
56
+ ```
57
+
58
+ ## Recovery
59
+
60
+ - **API restarts**: Worker (integrated) restarts with server, recovers orphaned tasks
61
+ - **Agent crashes**: Worker detects via PID monitoring, marks task as failed
62
+ - **Orphan detection**: On startup, scans for tasks claimed but not running