acp-runtime
AgentThe ACP runtime is the domain service that serves the ACP API contract. It owns the host-scoped dependencies needed to run…
All paths are relative to `apps/emdash-desktop/`.
All paths are relative to `apps/emdash-desktop/`.
creates the app store scope, then mounts React
(`seedWireConnection` / `getWireConnection` / `domainClient`); every slice exposes a typed domain client from its `api/` built on `domainClient`
contributed by slices (`contributions/views.ts`) via `defineView` from `src/core/primitives/views/`
`src/core/features/workbench/browser/home-view.tsx`)
Modal and view registration are manifest-owned, not shell-owned: `src/core/manifests/browser/modal-catalog.ts` and `src/core/manifests/browser/view-catalog.ts` aggregate slice contributions.
Feature-owned React components, hooks, and MobX stores live beside their portable API and Node implementation. Major browser slices include `tasks`, `projects`, `conversations`, `automations`, `browser`, `integrations`, `settings`, `skills`, `mcp`, and `library`. Workbench-owned tabs, sidebar, command palette, and onboarding UI live under `src/core/features/workbench/browser/`. Cross-slice task-view lifecycle and workspace composition live in `src/core/features/workbench/api/browser/task-composition.ts` and `src/core/features/workbench/browser/task-composition-state.ts`; task, project, and workspace stores expose feature-owned children through scoped-store tokens.
Task children have two explicit lifetimes: lightweight persistent stores survive session teardown for as long as the task row exists (`task-persistent-stores.ts`), while operational task stores are disposed when the task session is torn down (`task-scoped-stores.ts`).
Task attention indicators aggregate unseen events from saved Conversations, independently of open tabs. A successful user close of either an ACP or terminal conversation tab acknowledges its existing notification through the resource's `onClose` hook; later background events can notify again. Generic disposal (including snapshot restoration, preview replacement and teardown) only releases resources. Conversation managers reconcile membership on successful list reloads and deletion events, preserving membership changes received during an in-flight reload. Stream gaps invalidate the list so a gap during a reload schedules another fetch. Failed reloads preserve the current stores. An empty pane can still have background attention, but a task with no Conversations has no agent status indicator.
Notification clicks wait for the task composition and saved conversation record, then resolve its tab kind through the Conversations API. Opening through the pane layout focuses an existing ACP chat or terminal conversation tab across panes; unavailable targets expire without opening a tab.
The Tasks slice owns current-task workspace activation in its app-scoped `TaskActivationCoordinator`. It derives activation from navigation, Project context hydration, Task state, and Host generation readiness. Views and navigation handlers only express which Task is current; they do not opportunistically provision it. Explicit Retry and Re-provision actions remain direct user commands.
Feature views, modals, and task tabs are exposed through `contributions/` and aggregated by `src/core/manifests/browser/browser-contributions.ts` and `src/core/manifests/browser/task-tab-contributions.ts`.
The command palette uses the same static contribution model. Owning slices export `PaletteProviderDef` arrays from `contributions/browser/`, and `src/core/manifests/browser/palette-provider-catalog.ts` aggregates the five providers for commands, tasks, conversations, files, and projects. The workbench modal only renders `PaletteController` output. Argumentless commands opt in separately through `CommandPaletteItemDef` contributions aggregated by `src/core/manifests/shared/command-palette-catalog.ts`; command matching stays in the renderer, while task, conversation, and project providers request kind-filtered candidates through the search slice.
`src/renderer/lib/` is a thin host shell; portable browser infrastructure lives in `src/core/primitives/`.
renderer-internal aggregate Wire client (`desktop-wire-client.ts`); slices use their own domain clients instead
definitions, store, and close guards live in `src/core/primitives/modals/react/`
scope (`src/core/manifests/browser/app-scoped-stores.ts`)
Navigation lives in `src/core/primitives/navigation/`; commands and the palette live in `src/core/primitives/commands/`, `src/core/primitives/view-scopes/`, and `src/core/primitives/palette/`. The PTY frontend is owned by the terminals slice (`src/core/features/terminals/`). Monaco, file rendering, file-tree projection, and renderer-facing file runtime access are owned by `src/core/features/editor/browser/`.
The renderer error
Emdash is the Open-Source Agentic Development Environment (🧡 YC W26). Run multiple coding agents in parallel. Use any provider.
The ACP runtime is the domain service that serves the ACP API contract. It owns the host-scoped dependencies needed to run…
This page defines the target organization of `packages/core/src/`. Core is organized by module type so that shared domain APIs…
Git is split into a transport contract and a host-scoped runtime. Renderer, desktop, and workspace-server code share the Wire…
The main process is organized into domain modules under `src/main/core/`. Each domain typically has a `controller.ts` (RPC…
`@emdash/core/primitives/path/api` is the source of truth for portable file identity and lexical path operations. The detailed…
Validates project structure against co-location and architecture patterns defined in AGENTS.md
Deprecated placeholder. Do not use; follow root AGENTS.md and package instructions instead.
Use this agent when you need to create or update technical documentation that helps developers understand the deep patterns,…
Orchestration patterns learned from experience. Review at startup and before heartbeat responses.