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.
- rdc-0.1.0/.ai/browser-context-design.md +58 -0
- rdc-0.1.0/.ai/context.md +123 -0
- rdc-0.1.0/.ai/learnings.md +67 -0
- rdc-0.1.0/.ai/worker-design.md +62 -0
- rdc-0.1.0/.cursorrules +726 -0
- rdc-0.1.0/.github/workflows/publish.yml +78 -0
- rdc-0.1.0/.gitignore +39 -0
- rdc-0.1.0/AGENTS.md +732 -0
- rdc-0.1.0/CLAUDE.md +817 -0
- rdc-0.1.0/GEMINI.md +732 -0
- rdc-0.1.0/LICENSE +21 -0
- rdc-0.1.0/PKG-INFO +298 -0
- rdc-0.1.0/README.md +231 -0
- rdc-0.1.0/SETUP.md +47 -0
- rdc-0.1.0/TODO.md +37 -0
- rdc-0.1.0/design_knowledge_system.md +293 -0
- rdc-0.1.0/design_orchestrator.md +727 -0
- rdc-0.1.0/design_persistent_memory_and_voice.md +373 -0
- rdc-0.1.0/docs/VISUAL_STREAMING_COMPLETE.md +252 -0
- rdc-0.1.0/docs/ai-agent-guide.md +236 -0
- rdc-0.1.0/docs/architecture/data-layer.md +236 -0
- rdc-0.1.0/docs/architecture/phone-calling.md +186 -0
- rdc-0.1.0/docs/architecture/security-audit-findings.md +62 -0
- rdc-0.1.0/docs/architecture/security-audit.md +425 -0
- rdc-0.1.0/docs/architecture/state-machine.md +230 -0
- rdc-0.1.0/docs/configuration.md +197 -0
- rdc-0.1.0/docs/frontend-live-spec.md +426 -0
- rdc-0.1.0/docs/human-guide.md +334 -0
- rdc-0.1.0/docs/mcp-setup.md +143 -0
- rdc-0.1.0/docs/one-loop-dev-cycle.md +146 -0
- rdc-0.1.0/docs/remote-desktop-agent-plan.md +63 -0
- rdc-0.1.0/docs/visual-streaming-quickstart.md +75 -0
- rdc-0.1.0/docs/visual-streaming.md +379 -0
- rdc-0.1.0/frontend/.gitignore +24 -0
- rdc-0.1.0/frontend/README.md +73 -0
- rdc-0.1.0/frontend/components.json +23 -0
- rdc-0.1.0/frontend/eslint.config.js +23 -0
- rdc-0.1.0/frontend/index.html +12 -0
- rdc-0.1.0/frontend/package-lock.json +9594 -0
- rdc-0.1.0/frontend/package.json +54 -0
- rdc-0.1.0/frontend/pnpm-lock.yaml +7429 -0
- rdc-0.1.0/frontend/public/rrweb.min.js +19 -0
- rdc-0.1.0/frontend/src/App.tsx +156 -0
- rdc-0.1.0/frontend/src/components/collection-picker.tsx +96 -0
- rdc-0.1.0/frontend/src/components/global-text-input.tsx +341 -0
- rdc-0.1.0/frontend/src/components/project-bar.tsx +517 -0
- rdc-0.1.0/frontend/src/components/toast.tsx +29 -0
- rdc-0.1.0/frontend/src/components/ui/badge.tsx +48 -0
- rdc-0.1.0/frontend/src/components/ui/button.tsx +64 -0
- rdc-0.1.0/frontend/src/components/ui/card.tsx +92 -0
- rdc-0.1.0/frontend/src/components/ui/input.tsx +21 -0
- rdc-0.1.0/frontend/src/components/ui/scroll-area.tsx +58 -0
- rdc-0.1.0/frontend/src/components/ui/separator.tsx +28 -0
- rdc-0.1.0/frontend/src/components/ui/tabs.tsx +89 -0
- rdc-0.1.0/frontend/src/components/ui/textarea.tsx +18 -0
- rdc-0.1.0/frontend/src/components/ui/tooltip.tsx +55 -0
- rdc-0.1.0/frontend/src/features/activity/activity-feed.tsx +86 -0
- rdc-0.1.0/frontend/src/features/agent/agent-run-panel.tsx +295 -0
- rdc-0.1.0/frontend/src/features/auth/pair-approve.tsx +102 -0
- rdc-0.1.0/frontend/src/features/browser/browser-panel.tsx +564 -0
- rdc-0.1.0/frontend/src/features/browser/floating-agent-panel.tsx +225 -0
- rdc-0.1.0/frontend/src/features/browser/pinchtab-panel.tsx +523 -0
- rdc-0.1.0/frontend/src/features/browser/recording-player.tsx +340 -0
- rdc-0.1.0/frontend/src/features/browser/unified-browser-panel.tsx +759 -0
- rdc-0.1.0/frontend/src/features/chat/chat-fab.tsx +123 -0
- rdc-0.1.0/frontend/src/features/chat/chat-panel.tsx +99 -0
- rdc-0.1.0/frontend/src/features/chat/chat-renderer.tsx +117 -0
- rdc-0.1.0/frontend/src/features/command-bar/command-bar.tsx +133 -0
- rdc-0.1.0/frontend/src/features/logs/logs-panel.tsx +162 -0
- rdc-0.1.0/frontend/src/features/mobile/activity-sheet.tsx +76 -0
- rdc-0.1.0/frontend/src/features/mobile/add-project-sheet.tsx +251 -0
- rdc-0.1.0/frontend/src/features/mobile/attention-card.tsx +36 -0
- rdc-0.1.0/frontend/src/features/mobile/browser-card.tsx +232 -0
- rdc-0.1.0/frontend/src/features/mobile/chat-card.tsx +236 -0
- rdc-0.1.0/frontend/src/features/mobile/contexts-card.tsx +161 -0
- rdc-0.1.0/frontend/src/features/mobile/create-task-sheet.tsx +10 -0
- rdc-0.1.0/frontend/src/features/mobile/dictation-card.tsx +158 -0
- rdc-0.1.0/frontend/src/features/mobile/hamburger-sheet.tsx +137 -0
- rdc-0.1.0/frontend/src/features/mobile/mobile-command-bar.tsx +167 -0
- rdc-0.1.0/frontend/src/features/mobile/paired-devices-sheet.tsx +120 -0
- rdc-0.1.0/frontend/src/features/mobile/pinchtab-card.tsx +71 -0
- rdc-0.1.0/frontend/src/features/mobile/pinchtab-overlay.tsx +219 -0
- rdc-0.1.0/frontend/src/features/mobile/process-log-overlay.tsx +79 -0
- rdc-0.1.0/frontend/src/features/mobile/processes-card.tsx +229 -0
- rdc-0.1.0/frontend/src/features/mobile/project-card.tsx +77 -0
- rdc-0.1.0/frontend/src/features/mobile/project-sheet.tsx +115 -0
- rdc-0.1.0/frontend/src/features/mobile/sheet.tsx +94 -0
- rdc-0.1.0/frontend/src/features/mobile/task-output-overlay.tsx +126 -0
- rdc-0.1.0/frontend/src/features/mobile/tasks-card.tsx +349 -0
- rdc-0.1.0/frontend/src/features/mobile/terminal-overlay.tsx +310 -0
- rdc-0.1.0/frontend/src/features/mobile/terminals-card.tsx +198 -0
- rdc-0.1.0/frontend/src/features/modals/browser-preview.tsx +169 -0
- rdc-0.1.0/frontend/src/features/modals/collections-manager.tsx +216 -0
- rdc-0.1.0/frontend/src/features/modals/context-viewer.tsx +168 -0
- rdc-0.1.0/frontend/src/features/modals/pair-device.tsx +106 -0
- rdc-0.1.0/frontend/src/features/modals/port-assignments.tsx +179 -0
- rdc-0.1.0/frontend/src/features/modals/project-settings.tsx +778 -0
- rdc-0.1.0/frontend/src/features/modals/screenshots.tsx +159 -0
- rdc-0.1.0/frontend/src/features/modals/system-settings.tsx +1530 -0
- rdc-0.1.0/frontend/src/features/output/output-panel.tsx +121 -0
- rdc-0.1.0/frontend/src/features/processes/add-action-form.tsx +176 -0
- rdc-0.1.0/frontend/src/features/processes/process-list.tsx +210 -0
- rdc-0.1.0/frontend/src/features/right-tabs/right-tabs.tsx +1093 -0
- rdc-0.1.0/frontend/src/features/stats/stats-grid.tsx +28 -0
- rdc-0.1.0/frontend/src/features/tasks/create-task-form.tsx +351 -0
- rdc-0.1.0/frontend/src/features/tasks/task-list.tsx +122 -0
- rdc-0.1.0/frontend/src/features/tasks/task-panel.tsx +564 -0
- rdc-0.1.0/frontend/src/features/terminal/bottom-panel.tsx +337 -0
- rdc-0.1.0/frontend/src/features/terminal/embedded-terminal.tsx +538 -0
- rdc-0.1.0/frontend/src/features/terminal/terminal-view.tsx +710 -0
- rdc-0.1.0/frontend/src/hooks/use-browser-agent.ts +269 -0
- rdc-0.1.0/frontend/src/hooks/use-mount-effect.ts +12 -0
- rdc-0.1.0/frontend/src/hooks/use-orchestrator.ts +542 -0
- rdc-0.1.0/frontend/src/hooks/use-voice.ts +245 -0
- rdc-0.1.0/frontend/src/index.css +561 -0
- rdc-0.1.0/frontend/src/layouts/desktop.tsx +319 -0
- rdc-0.1.0/frontend/src/layouts/kiosk.tsx +855 -0
- rdc-0.1.0/frontend/src/layouts/mobile.tsx +467 -0
- rdc-0.1.0/frontend/src/lib/agent-presets.ts +58 -0
- rdc-0.1.0/frontend/src/lib/api.ts +74 -0
- rdc-0.1.0/frontend/src/lib/chat-catalog.ts +112 -0
- rdc-0.1.0/frontend/src/lib/chat-components.tsx +140 -0
- rdc-0.1.0/frontend/src/lib/client-id.ts +25 -0
- rdc-0.1.0/frontend/src/lib/utils.ts +14 -0
- rdc-0.1.0/frontend/src/lib/ws.ts +113 -0
- rdc-0.1.0/frontend/src/main.tsx +28 -0
- rdc-0.1.0/frontend/src/stores/agent-run-store.ts +84 -0
- rdc-0.1.0/frontend/src/stores/auth-store.ts +29 -0
- rdc-0.1.0/frontend/src/stores/browser-store.ts +117 -0
- rdc-0.1.0/frontend/src/stores/dictation-store.ts +51 -0
- rdc-0.1.0/frontend/src/stores/logs-store.ts +338 -0
- rdc-0.1.0/frontend/src/stores/pinchtab-store.ts +215 -0
- rdc-0.1.0/frontend/src/stores/process-store.ts +128 -0
- rdc-0.1.0/frontend/src/stores/project-store.ts +139 -0
- rdc-0.1.0/frontend/src/stores/state-store.ts +264 -0
- rdc-0.1.0/frontend/src/stores/terminal-presets-store.ts +68 -0
- rdc-0.1.0/frontend/src/stores/terminal-store.ts +95 -0
- rdc-0.1.0/frontend/src/stores/ui-store.ts +139 -0
- rdc-0.1.0/frontend/src/types/index.ts +126 -0
- rdc-0.1.0/frontend/tsconfig.app.json +32 -0
- rdc-0.1.0/frontend/tsconfig.json +13 -0
- rdc-0.1.0/frontend/tsconfig.node.json +26 -0
- rdc-0.1.0/frontend/vite.config.ts +80 -0
- rdc-0.1.0/install.sh +267 -0
- rdc-0.1.0/mcp-config.json +9 -0
- rdc-0.1.0/pyproject.toml +99 -0
- rdc-0.1.0/rdc.yaml +10 -0
- rdc-0.1.0/rdc.yml +6 -0
- rdc-0.1.0/src/gwd/__init__.py +69 -0
- rdc-0.1.0/src/gwd/__main__.py +70 -0
- rdc-0.1.0/src/gwd/classify.py +63 -0
- rdc-0.1.0/src/gwd/client.py +46 -0
- rdc-0.1.0/src/gwd/executor.py +165 -0
- rdc-0.1.0/src/gwd/orchestrator.py +224 -0
- rdc-0.1.0/src/gwd/planner.py +191 -0
- rdc-0.1.0/src/gwd/prompts.py +100 -0
- rdc-0.1.0/src/gwd/tools.py +363 -0
- rdc-0.1.0/src/gwd/types.py +98 -0
- rdc-0.1.0/src/gwd/verifier.py +158 -0
- rdc-0.1.0/src/remote_dev_ctrl/__init__.py +3 -0
- rdc-0.1.0/src/remote_dev_ctrl/cli.py +1629 -0
- rdc-0.1.0/src/remote_dev_ctrl/llm.py +464 -0
- rdc-0.1.0/src/remote_dev_ctrl/mcp/__init__.py +8 -0
- rdc-0.1.0/src/remote_dev_ctrl/mcp/server.py +361 -0
- rdc-0.1.0/src/remote_dev_ctrl/scaffold.py +1058 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/__init__.py +1 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/actions.py +178 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/agents/__init__.py +9 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/agents/gwd_provider.py +117 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/agents/manager.py +385 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/agents/provider.py +89 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/agents/terminal_provider.py +170 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/agents/tools.py +615 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/agents/web_provider.py +342 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/app.py +8130 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/audit.py +372 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/auth.py +359 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/browser.py +1518 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/browser_use.py +189 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/caddy.py +384 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/channels/__init__.py +1 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/channels/phone.py +796 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/channels/telegram.py +877 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/chrome.py +246 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/collections_page.py +174 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/config.py +363 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/context_synthesizer.py +138 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/conversation.py +268 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/dashboard.py +1679 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/db/__init__.py +87 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/db/connection.py +107 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/db/migrate.py +592 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/logs/20260210000001_create_schema.sql +62 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/rdc/20260210000001_create_schema.sql +81 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/rdc/20260210000002_add_project_description.sql +7 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/rdc/20260210000003_runtime_state_tables.sql +53 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/rdc/20260212000004_add_collections.sql +21 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/rdc/20260213000005_add_agent_sessions.sql +18 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/rdc/20260222000006_browser_nullable_process_id.sql +48 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/rdc/20260222000007_add_recordings.sql +21 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/rdc/20260305000008_add_recipes.sql +17 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/rdc/20260312000009_add_project_tags.sql +5 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/rdc/20260316000010_add_actions.sql +6 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/db/migrations/tasks/20260210000001_create_schema.sql +48 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/db/models.py +365 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/db/repositories.py +1616 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/debug_page.py +689 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/event_store.py +346 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/events/__init__.py +5 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/events/bus.py +144 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/intent.py +2665 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/middleware.py +354 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/orchestrator.py +297 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/pinchtab.py +393 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/ports.py +188 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/process_discovery.py +521 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/processes.py +951 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/pty_relay.py +505 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/queue/__init__.py +9 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/recipes.py +153 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/recording.py +203 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/scrubber.py +200 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/state_machine.py +983 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/static/rrweb.min.js +19 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/static/shared.css +698 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/static/vendor/tailwind.js +65 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/static/vendor/xstate.js +2 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/static/vendor/xterm-addon-fit.js +2 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/static/vendor/xterm-addon-unicode11.js +8 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/static/vendor/xterm-addon-web-links.js +2 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/static/vendor/xterm.css +209 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/static/vendor/xterm.js +2 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/streaming.py +191 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/terminal.py +1200 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/tts.py +310 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/vault.py +229 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/vnc.py +527 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/voice_agent.py +169 -0
- rdc-0.1.0/src/remote_dev_ctrl/server/worker.py +880 -0
- rdc-0.1.0/tests/test_visual_streaming.py +172 -0
- 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
|
rdc-0.1.0/.ai/context.md
ADDED
|
@@ -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
|