UNPKG

oneie

Version:

Build apps, websites, and AI agents in English. Zero-interaction setup for AI agents (Claude Code, Cursor, Windsurf). Download to your computer, run in the cloud, deploy to the edge. Open source and free forever.

1,140 lines (924 loc) 35.1 kB
--- title: Desktop dimension: things category: plans tags: agent, ai, architecture, connections, events, knowledge, ontology, people, things related_dimensions: connections, events, groups, knowledge, people scope: global created: 2025-11-03 updated: 2025-11-03 version: 1.0.0 ai_context: | This document is part of the things dimension in the plans category. Location: one/things/plans/desktop.md Purpose: Documents one desktop: multi-agent command center Related dimensions: connections, events, groups, knowledge, people For AI agents: Read this to understand desktop. --- # ONE Desktop: Multi-Agent Command Center **Status:** Planning **Based On:** [emdash](https://github.com/generalaction/emdash) - Multi-agent parallel execution UI **Purpose:** Desktop application for managing multiple AI coding agents working on ONE platform projects --- ## Vision ONE Desktop transforms emdash's multi-agent orchestration into a native command center for the ONE platform, where developers coordinate autonomous AI agents that build, deploy, and maintain AI-powered businesses through ONE's 6-dimension ontology (organizations, people, things, connections, events, knowledge). **Core Philosophy:** Just as emdash enables parallel agent execution across git worktrees, ONE Desktop enables parallel agent execution across your entire business ontology from content creation to audience engagement to knowledge generation. --- ## Architecture Alignment with ONE Ontology ### Things (Entities) ```typescript // Desktop-specific thing types (extend ontology) type DesktopThingType = | "desktop_session" // Running desktop instance | "agent_workspace" // Isolated agent environment | "git_worktree" // Git worktree instance | "agent_task" // Task assigned to agent | "agent_output" // Agent-generated artifact | "workspace_snapshot" // Saved workspace state | "agent_conversation"; // Chat history with agent ``` ### Connections (Relationships) ```typescript // Desktop workspace relationships relationshipType = | 'manages_workspace' // User agent_workspace | 'executes_in' // agent git_worktree | 'produced_by' // agent_output agent | 'assigned_to' // agent_task agent | 'synchronized_with' // workspace backend deployment ``` ### Events (Actions) ```typescript // Desktop activity tracking eventType = | 'workspace_created' | 'agent_started' | 'agent_completed_task' | 'agent_failed' | 'workspace_synchronized' | 'output_reviewed' | 'changes_committed' | 'changes_deployed' ``` ### Knowledge (RAG + Labels) - Index all agent outputs as knowledge chunks - Label tasks by `capability:*`, `technology:*`, `status:*` - Enable semantic search across all agent conversations - Feed context to agents from your entire ONE deployment --- ## Technology Stack (from emdash) ### Core Technologies - **Electron** - Cross-platform desktop (macOS, Windows, Linux) - **TypeScript** - Type-safe throughout - **Vite** - Fast build tooling - **Tailwind CSS** - Consistent with ONE web UI - **SQLite** - Local-first data persistence ### Key Differences from emdash 1. **Backend Integration** - Sync with ONE backend (Convex) 2. **Ontology-Aware** - All operations map to things/connections/events 3. **Knowledge Engine** - Built-in RAG for agent context 4. **Multi-Deployment** - Manage multiple ONE deployments 5. **Edge-Aware** - Deploy directly to Cloudflare from desktop --- ## Feature Set ### 1. Agent Orchestration (from emdash) **Inherited Features:** - Run multiple AI agents in parallel - Isolated git worktrees per agent - Support for Claude Code, Cursor, GitHub Copilot, etc. - Local SQLite for workspace tracking **ONE Enhancements:** - 🆕 Map agents to `business_agents` ontology (strategy, marketing, sales, etc.) - 🆕 Agents share knowledge through ONE's knowledge table - 🆕 Tasks create `agent_task` things with proper connections - 🆕 All agent activity logged as events for analytics ### 2. Workspace Management **Base (emdash):** ```typescript interface Workspace { id: string; name: string; path: string; worktrees: Worktree[]; agents: Agent[]; } ``` **ONE Extension:** ```typescript interface ONEWorkspace extends Workspace { // Link to ONE deployment deployment: { url: string; // Backend Convex URL organizationId: Id<"things">; // Org this workspace belongs to creatorId: Id<"things">; // Creator who owns it }; // Sync state with backend syncStatus: { lastSynced: number; pendingChanges: number; conflictingFiles: string[]; }; // Knowledge integration knowledgeIndex: { totalChunks: number; lastIndexed: number; embeddingModel: string; }; } ``` ### 3. Agent Capabilities Matrix | Agent Type | emdash Support | ONE Integration | | ------------------------ | -------------- | -------------------------------- | | Claude Code | Built-in | Map to `engineering_agent` | | Cursor | Built-in | Map to `engineering_agent` | | GitHub Copilot | Built-in | Map to `engineering_agent` | | Custom Agents | Extensible | Map to 10 `business_agents` | | External (ElizaOS, etc.) | None | 🆕 Via `external_agent` ontology | ### 4. Deployment Pipeline **emdash:** Git operations only **ONE Desktop:** Full deployment flow ```mermaid graph LR A[Agent Makes Changes] --> B[Review in Workspace] B --> C[Commit to Git] C --> D{Deploy Target?} D -->|Backend| E[Push to Backend Convex] D -->|Frontend| F[Deploy to Cloudflare] D -->|Both| G[Coordinate Deployment] E --> H[Log Deployment Event] F --> H G --> H ``` --- ## User Experience Flow ### 1. Launch & Connect ``` ┌─────────────────────────────────────┐ ONE Desktop [+] Connect to ONE Backend Enter Convex URL or select: Local (localhost:3000) Production (one.ie) Custom deployment [] Sync Organizations My Organization Client Projects └─────────────────────────────────────┘ ``` ### 2. Create Workspace ``` ┌─────────────────────────────────────┐ New Workspace Name: ________________ Path: [Browse...] Template: Full Stack (Frontend + Backend) Frontend Only Backend Only Existing Repository Organization: [Dropdown] [Create Workspace] └─────────────────────────────────────┘ ``` ### 3. Agent Dashboard (Main View) ``` ┌──────────────────────────────────────────────────────────────┐ ONE Desktop - My SaaS Project [Sync] [•••] ├──────────────────────────────────────────────────────────────┤ ACTIVE AGENTS Add Agent [+] ├──────────────────────────────────────────────────────────────┤ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ Claude Code Cursor Marketing engineering engineering Agent ├──────────────┤ ├──────────────┤ ├──────────────┤ Working on: Working on: Working on: Auth system UI polish Blog content Status: 🟢 Status: 🟢 Status: 23 changes 8 changes 3 drafts └──────────────┘ └──────────────┘ └──────────────┘ ├──────────────────────────────────────────────────────────────┤ KNOWLEDGE BASE Search [........] ├──────────────────────────────────────────────────────────────┤ 1,247 chunks indexed Last sync: 2 minutes ago Model: text-embedding-3-large Context available to all agents ├──────────────────────────────────────────────────────────────┤ RECENT ACTIVITY View All ├──────────────────────────────────────────────────────────────┤ 2m ago Claude Code completed "Add email verification" 5m ago Cursor committed "Polish dashboard UI" 12m ago Marketing Agent generated 3 blog posts 15m ago Workspace synced with backend └──────────────────────────────────────────────────────────────┘ ``` ### 4. Agent Detail View (Click on an agent) ``` ┌──────────────────────────────────────────────────────────────┐ Back to Dashboard Claude Code - Engineering ├──────────────────────────────────────────────────────────────┤ CURRENT TASK Implement email verification system Assigned: 45 minutes ago Worktree: /path/to/project/.worktrees/claude-email-verify ├──────────────────────────────────────────────────────────────┤ CONVERSATION [Send Task] ┌──────────────────────────────────────────────────────────┐ You: Add email verification with Better Auth Claude: I'll implement email verification. Here's my plan: 1. Add verification token entity type 2. Create verification mutation 3. Add email template 4. Update UI for verify flow [Show Generated Code] └──────────────────────────────────────────────────────────┘ [Type a message...] [Send] ├──────────────────────────────────────────────────────────────┤ CHANGES (23) [Review All] backend/convex/auth/verify.ts +127 -0 backend/convex/schema.ts +15 -2 frontend/src/pages/verify.astro +89 -0 frontend/src/components/VerifyEmail.tsx +156 -0 ... 19 more files [Commit Changes] [Deploy to Backend] [Deploy to Frontend] └──────────────────────────────────────────────────────────────┘ ``` --- ## Data Model (SQLite Schema) ### Base Schema (from emdash) ```sql -- Workspaces CREATE TABLE workspaces ( id TEXT PRIMARY KEY, name TEXT NOT NULL, path TEXT NOT NULL, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL ); -- Agents CREATE TABLE agents ( id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, provider TEXT NOT NULL, -- 'claude', 'cursor', 'copilot' status TEXT NOT NULL, -- 'idle', 'running', 'paused', 'error' created_at INTEGER NOT NULL, FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ); -- Worktrees CREATE TABLE worktrees ( id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, agent_id TEXT, path TEXT NOT NULL, branch TEXT NOT NULL, created_at INTEGER NOT NULL, FOREIGN KEY (workspace_id) REFERENCES workspaces(id), FOREIGN KEY (agent_id) REFERENCES agents(id) ); ``` ### ONE Extensions ```sql -- ONE Backend Connection CREATE TABLE deployments ( id TEXT PRIMARY KEY, name TEXT NOT NULL, convex_url TEXT NOT NULL, organization_id TEXT, -- Links to ONE backend creator_id TEXT, -- Links to ONE backend access_token TEXT, -- Encrypted last_synced INTEGER, created_at INTEGER NOT NULL ); -- Link workspaces to deployments ALTER TABLE workspaces ADD COLUMN deployment_id TEXT REFERENCES deployments(id); -- Knowledge Index CREATE TABLE knowledge_chunks ( id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, source_file TEXT NOT NULL, chunk_index INTEGER NOT NULL, text TEXT NOT NULL, embedding BLOB, -- Stored as binary embedding_model TEXT, created_at INTEGER NOT NULL, FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ); -- Agent Tasks (map to ONE's agent_task things) CREATE TABLE tasks ( id TEXT PRIMARY KEY, agent_id TEXT NOT NULL, thing_id TEXT, -- ONE backend thing ID title TEXT NOT NULL, description TEXT, status TEXT NOT NULL, -- 'pending', 'in_progress', 'completed', 'failed' started_at INTEGER, completed_at INTEGER, created_at INTEGER NOT NULL, FOREIGN KEY (agent_id) REFERENCES agents(id) ); -- Sync Queue (changes pending sync to backend) CREATE TABLE sync_queue ( id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, entity_type TEXT NOT NULL, -- 'thing', 'connection', 'event', 'knowledge' entity_id TEXT NOT NULL, operation TEXT NOT NULL, -- 'create', 'update', 'delete' payload TEXT NOT NULL, -- JSON synced BOOLEAN DEFAULT 0, created_at INTEGER NOT NULL, FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ); ``` --- ## Sync Strategy: Desktop ↔️ Backend ### 1. Initial Connection ```typescript async function connectToBackend(convexUrl: string): Promise<Deployment> { // 1. Authenticate with Better Auth const authClient = new BetterAuthClient({ baseURL: convexUrl }); const session = await authClient.signIn({ /* ... */ }); // 2. Fetch user's organizations const orgs = await convex.query(api.queries.orgs.listMyOrgs); // 3. Create deployment record const deployment = await db.deployments.insert({ convex_url: convexUrl, organization_id: orgs[0]._id, creator_id: session.user._id, access_token: encrypt(session.token), }); return deployment; } ``` ### 2. Continuous Sync ```typescript // Watch for local changes const watcher = chokidar.watch(workspace.path, { ignored: /(^|[\/\\])\../, // ignore dotfiles persistent: true, }); watcher.on("change", async (path) => { // 1. Determine entity type from file path const entityType = inferEntityType(path); // 2. Extract data from file const data = await parseFile(path); // 3. Queue for sync await db.sync_queue.insert({ workspace_id: workspace.id, entity_type: entityType, entity_id: data.id || generateId(), operation: "update", payload: JSON.stringify(data), }); }); // Sync queue processor (runs every 5 seconds) setInterval(async () => { const pending = await db.sync_queue.findMany({ where: { synced: false }, limit: 100, }); for (const item of pending) { try { // Send to backend await convex.mutation(api.mutations.sync.upsert, { entityType: item.entity_type, entityId: item.entity_id, data: JSON.parse(item.payload), }); // Mark synced await db.sync_queue.update(item.id, { synced: true }); } catch (error) { console.error("Sync failed:", error); // Retry with exponential backoff } } }, 5000); ``` ### 3. Conflict Resolution ```typescript interface SyncConflict { file: string; localVersion: string; remoteVersion: string; localModified: number; remoteModified: number; } async function resolveConflicts(conflicts: SyncConflict[]): Promise<void> { // Show UI dialog const resolution = await showConflictDialog(conflicts); for (const conflict of conflicts) { switch (resolution[conflict.file]) { case "keep-local": // Overwrite remote with local await syncToBackend(conflict.localVersion); break; case "keep-remote": // Overwrite local with remote await syncFromBackend(conflict.remoteVersion); break; case "merge": // Manual merge in editor await openMergeTool(conflict); break; } } } ``` --- ## Agent Integration Patterns ### 1. Engineering Agents (Claude, Cursor, Copilot) **Workflow:** ``` User assigns task Agent works in isolated worktree Agent makes changes Desktop detects changes Queue for review User approves Commit & sync Deploy to backend/frontend Log events ``` **Example Task:** ```typescript const task = await createTask({ agent: "claude-code", title: "Add user profile page", context: [ "User should see their name, email, avatar", "Add edit functionality", "Use existing auth session", 'Follow ontology: user is a "creator" thing', ], knowledge: await searchKnowledge("user profile ontology"), }); // Claude works on it... // When done, review changes const changes = await getAgentChanges(task.agent_id); // ... 45 files changed, 2,847 insertions, 156 deletions // Approve & deploy await commitChanges(task.agent_id, "feat: add user profile page"); await deployToBackend(changes.backend); await deployToFrontend(changes.frontend); ``` ### 2. Business Agents (Strategy, Marketing, Sales, etc.) **Workflow:** ``` User assigns business task Agent queries knowledge Agent generates output (content, strategy, etc.) Desktop saves as thing in backend Logs event Other agents can use output as context ``` **Example Task:** ```typescript const task = await createTask({ agent: "marketing-agent", title: "Generate blog post about ONE Desktop launch", context: [ "Target audience: developers and creators", "Highlight multi-agent orchestration", "Include technical details from ontology", "SEO optimized", ], knowledge: await searchKnowledge("ONE desktop agent orchestration"), }); // Marketing agent generates 3 blog posts... // Save as things in backend for (const post of task.outputs) { await convex.mutation(api.mutations.content.create, { type: "blog_post", name: post.title, properties: { content: post.content, seo: post.seo, generatedBy: "marketing_agent", }, status: "draft", }); } ``` ### 3. External Agents (ElizaOS, AutoGen, etc.) **Workflow:** ``` Connect external agent via API Register as external_agent thing Desktop routes tasks via A2A protocol External agent works Results sync back to desktop Log events Update knowledge ``` **Example Integration:** ```typescript // Register external agent const elizaAgent = await convex.mutation(api.mutations.agents.createExternal, { type: "external_agent", name: "ElizaOS Research Agent", properties: { platform: "elizaos", apiEndpoint: "https://api.eliza.ai/v1", capabilities: ["research", "summarization", "data-extraction"], }, }); // Assign task via A2A protocol const task = await createTask({ agent: elizaAgent._id, title: "Research competitor pricing", context: ["Find top 10 competitors", "Extract pricing tiers"], protocol: "a2a", }); // ElizaOS works on it... // Results come back via webhook app.post("/webhook/eliza", async (req, res) => { const result = req.body; // Save to knowledge await convex.mutation(api.mutations.knowledge.create, { knowledgeType: "document", text: result.summary, sourceThingId: elizaAgent._id, labels: ["research", "competitor-analysis"], }); // Log event await convex.mutation(api.mutations.events.log, { type: "agent_completed", actorId: elizaAgent._id, targetId: task._id, metadata: { protocol: "a2a", duration: result.duration }, }); }); ``` --- ## Knowledge Integration ### 1. Automatic Indexing ```typescript // Watch workspace for changes const indexer = new WorkspaceIndexer(workspace); indexer.on("file-changed", async (file) => { // Extract text const text = await readFile(file.path); // Chunk it (800 tokens, 200 overlap) const chunks = chunkText(text, { size: 800, overlap: 200 }); // Generate embeddings for (const chunk of chunks) { const embedding = await openai.embeddings.create({ model: "text-embedding-3-large", input: chunk.text, }); // Store locally await db.knowledge_chunks.insert({ workspace_id: workspace.id, source_file: file.path, chunk_index: chunk.index, text: chunk.text, embedding: Buffer.from( new Float32Array(embedding.data[0].embedding).buffer, ), embedding_model: "text-embedding-3-large", }); // Queue for backend sync await queueKnowledgeSync(workspace.id, chunk); } }); ``` ### 2. Context Retrieval for Agents ```typescript async function getAgentContext(agent: Agent, query: string): Promise<string[]> { // 1. Generate query embedding const queryEmbedding = await openai.embeddings.create({ model: "text-embedding-3-large", input: query, }); // 2. Search local knowledge (SQLite vector search or brute force) const localChunks = await searchLocalKnowledge( workspace.id, queryEmbedding.data[0].embedding, { limit: 5 }, ); // 3. Search backend knowledge (Convex vector search) const backendChunks = await convex.query(api.queries.knowledge.search, { query: queryEmbedding.data[0].embedding, organizationId: workspace.deployment.organizationId, limit: 5, }); // 4. Combine and deduplicate const allChunks = [...localChunks, ...backendChunks]; const uniqueChunks = deduplicateByContent(allChunks); // 5. Return as context strings return uniqueChunks.map((chunk) => chunk.text); } // Use in agent prompt const context = await getAgentContext(agent, task.description); const systemPrompt = ` You are ${agent.type} working on ${task.title}. Relevant context from the knowledge base: ${context.join("\n\n---\n\n")} Task: ${task.description} Follow the ONE ontology when making changes. All entities should map to the 6-dimension architecture (organizations, people, things, connections, events, knowledge). `; ``` --- ## Deployment Integration ### 1. Backend Deployment (Convex) ```typescript async function deployBackend(workspace: Workspace): Promise<void> { const backendPath = path.join(workspace.path, "backend"); // 1. Run type check await exec("npm run typecheck", { cwd: backendPath }); // 2. Deploy to Convex const result = await exec("npx convex deploy", { cwd: backendPath, env: { CONVEX_DEPLOYMENT: workspace.deployment.convex_url, }, }); // 3. Log deployment event await convex.mutation(api.mutations.events.log, { type: "deployment_completed", actorId: workspace.creatorId, metadata: { target: "backend", deployment_url: workspace.deployment.convex_url, duration: result.duration, }, }); // 4. Update workspace sync status await db.workspaces.update(workspace.id, { last_synced: Date.now(), }); } ``` ### 2. Frontend Deployment (Cloudflare) ```typescript async function deployFrontend(workspace: Workspace): Promise<void> { const frontendPath = path.join(workspace.path, "frontend"); // 1. Build await exec("npm run build", { cwd: frontendPath }); // 2. Deploy to Cloudflare Pages const result = await exec("npx wrangler pages deploy ./dist", { cwd: frontendPath, env: { CLOUDFLARE_API_TOKEN: await getCloudflareToken(), }, }); // 3. Extract deployment URL const deployUrl = extractDeployUrl(result.stdout); // 4. Log deployment event await convex.mutation(api.mutations.events.log, { type: "deployment_completed", actorId: workspace.creatorId, metadata: { target: "frontend", deployment_url: deployUrl, duration: result.duration, }, }); } ``` ### 3. Coordinated Deployment (Full Stack) ```typescript async function deployFullStack(workspace: Workspace): Promise<void> { // Deploy in parallel when possible const [backendResult, frontendResult] = await Promise.all([ deployBackend(workspace), deployFrontend(workspace), ]); // Update website thing in backend await convex.mutation(api.mutations.things.update, { id: workspace.websiteThingId, properties: { domain: frontendResult.url, lastDeployed: Date.now(), }, }); // Show success notification showNotification({ title: "Deployment Complete", message: `Backend and frontend deployed successfully!`, url: frontendResult.url, }); } ``` --- ## Security & Privacy ### 1. Local-First Data - All workspace data stored locally in SQLite - Embeddings computed locally (option to use local models) - Credentials encrypted with OS keychain (Keytar) - No data sent to ONE backend without explicit sync ### 2. Credential Management ```typescript import keytar from "keytar"; // Store Convex access token securely async function storeCredentials( deployment: Deployment, token: string, ): Promise<void> { await keytar.setPassword("one-desktop", deployment.convex_url, token); } // Retrieve token for sync async function getCredentials(deployment: Deployment): Promise<string> { const token = await keytar.getPassword("one-desktop", deployment.convex_url); if (!token) { throw new Error("Not authenticated. Please sign in."); } return token; } ``` ### 3. Permission Scopes ```typescript // Request minimal permissions from backend const scopes = [ "read:things", // Read entities "write:things", // Create/update entities "read:events", // Read activity logs "write:events", // Log new events "read:knowledge", // Search knowledge base "write:knowledge", // Add knowledge chunks "deploy:backend", // Deploy Convex functions "deploy:frontend", // Deploy to Cloudflare ]; // User approves during first connection const session = await authClient.signIn({ scopes, approval: "interactive", // Shows permission dialog }); ``` --- ## Platform Support ### macOS - **Native Features:** - Menu bar integration - Touch Bar support for agent controls - Spotlight search for tasks - Notification Center for agent updates ### Windows - **Native Features:** - System tray integration - Windows Search integration - Toast notifications - Jump lists for recent workspaces ### Linux - **Native Features:** - System tray (via libappindicator) - Desktop notifications - KDE/GNOME integration --- ## Development Roadmap ### Phase 1: MVP (Q1 2025) - Fork emdash codebase - Add ONE branding and UI - Implement basic Convex sync - Support Claude Code and Cursor - Basic knowledge indexing (local only) ### Phase 2: Full Integration (Q2 2025) - Complete ontology mapping - Real-time sync with backend - All 10 business agents supported - External agent integration (ElizaOS, AutoGen) - Vector search across local + backend knowledge ### Phase 3: Advanced Features (Q3 2025) - Multi-deployment management - Conflict resolution UI - Agent marketplace (discover & install agents) - Workflow templates - Team collaboration (shared workspaces) ### Phase 4: Enterprise (Q4 2025) - SSO integration - Audit logging - Role-based access control - Air-gapped mode (fully offline) - Custom agent development SDK --- ## Success Metrics ### Developer Experience - **Goal:** Ship 10x faster with AI agents - **Metrics:** - Average task completion time - Number of agents used per project - Lines of code generated vs manually written ### System Performance - **Goal:** Sub-second responsiveness - **Metrics:** - Agent startup time < 2s - Sync latency < 500ms - Search response time < 100ms ### Adoption - **Goal:** 10,000 active developers by end of 2025 - **Metrics:** - Monthly active users - Workspaces created - Deployments triggered - Knowledge chunks indexed --- ## Technical Comparison: emdash vs ONE Desktop | Feature | emdash | ONE Desktop | | ------------------------ | ------------------------------ | --------------------------------- | | **Core Purpose** | Multi-agent parallel execution | AI business orchestration | | **Data Model** | SQLite (custom schema) | SQLite + ONE ontology sync | | **Supported Agents** | 7 coding agents | 7 coding + 10 business + external | | **Backend Integration** | None | Full Convex sync | | **Knowledge Base** | None | Built-in RAG with embeddings | | **Deployment** | Git only | Git + Convex + Cloudflare | | **Organization Support** | Single user | Multi-tenant orgs | | **Conflict Resolution** | Manual | UI-guided + auto-merge | | **Analytics** | None | Full event tracking | | **Marketplace** | None | Agent & template marketplace | --- ## Why ONE Desktop > emdash 1. **Ontology Integration** - Every operation maps to ONE's 4-table system 2. **Knowledge Engine** - Agents share context through unified RAG 3. **Business Agents** - Beyond code: strategy, marketing, sales, etc. 4. **Full Deployment** - From development to production in one click 5. **Multi-Tenant** - Manage multiple orgs and projects 6. **Protocol-Aware** - Support A2A, ACP, AP2, X402 out of the box 7. **Edge-Native** - Deploy to Cloudflare's global network 8. **Event-Driven** - Complete audit trail and analytics 9. **Extensible** - Plugin system for custom agents and workflows 10. **Open Source** - Fork, customize, and contribute back --- ## Getting Started (Developer) ### Prerequisites - Node.js 20+ - Git - Convex account (free tier) - Cloudflare account (free tier) ### Installation ```bash # Clone the repo git clone https://github.com/one-ie/desktop cd desktop # Install dependencies npm install # Start in dev mode npm run dev # Build for production npm run build # Package for distribution npm run package ``` ### Configuration ```typescript // ~/.one-desktop/config.json { "deployments": [ { "name": "Production", "url": "https://your-backend.convex.cloud", "default": true }, { "name": "Development", "url": "http://localhost:3000", "default": false } ], "agents": { "claude": { "enabled": true, "apiKey": "sk-ant-..." // Or use system env var }, "cursor": { "enabled": true } }, "knowledge": { "indexingEnabled": true, "embeddingModel": "text-embedding-3-large", "maxChunkSize": 800, "chunkOverlap": 200 }, "sync": { "autoSync": true, "syncInterval": 5000, "conflictResolution": "prompt" // or "keep-local", "keep-remote" } } ``` --- ## Conclusion **ONE Desktop transforms emdash from a multi-agent code orchestrator into a complete AI business command center.** By integrating with ONE's ontology, knowledge engine, and deployment pipeline, developers can: - Orchestrate 17+ AI agents (7 coding + 10 business) - Build applications that map to a clean 4-table data model - Deploy instantly to global edge infrastructure - Generate and sell knowledge to other AI agents - Manage entire AI-powered businesses from one desktop app **The future of development is AI-native. ONE Desktop makes it real.** --- ## References - **emdash GitHub:** https://github.com/generalaction/emdash - **ONE Ontology:** `/one/knowledge/ontology.md` - **ONE Vision:** `/one/things/vision.md` - **ONE Platform:** https://one.ie --- **Status:** Ready for development **Next Steps:** 1. Fork emdash repository 2. Set up ONE branding 3. Implement Convex sync layer 4. Build ontology mapping 5. Launch private beta