acp-runtime
AgentThe ACP runtime is the domain service that serves the ACP API contract. It owns the host-scoped dependencies needed to run…
The desktop app has exactly one component kit: **`@emdash/ui`** (`packages/ui`). The legacy Tailwind/cva kit that lived at `apps/emdash-desktop/src/core/primitives/ui/browser/` was deleted by the UI-kit unification migration — do not reintroduce it or shim to its old APIs.
The desktop app has exactly one component kit: **`@emdash/ui`** (`packages/ui`). The legacy Tailwind/cva kit that lived at `apps/emdash-desktop/src/core/primitives/ui/browser/` was deleted by the UI-kit unification migration — do not reintroduce it or shim to its old APIs.
menus, tooltips, toasts, tabs, markdown, time display — import them from `@emdash/ui`. Do not hand-build a styled equivalent in feature code.
utilities in feature `browser/` code are fine until the separate future Tailwind-removal effort. Do not use Tailwind to build new reusable styled components.
base-ui patterns per [UI styling conventions](ui-styling.md). Storybook stories covering variants and states are mandatory for every new or extended component.
`src/core/features/<feature>/browser/` (or the owning service/primitive), composed from `@emdash/ui` primitives. Only promote to `packages/ui` when a component is genuinely app-agnostic.
(`@core/primitives/styling/browser/cn`). It is the only sanctioned class-merging helper app-side; `packages/ui` does not use it.
from the trigger and sizes to at least the trigger by default. Use `width="trigger"` when a form control should keep an exact column width. Avoid `alignItemWithTrigger`; it makes the selected row overlap the trigger and is reserved for a deliberately native-select-like interaction.
entities such as agents, branches, remotes, machines, models, and working copies. Prefer the composed `ComboboxPopover` when its trigger/list/footer API is sufficient. Use `width="content-at-least-trigger"` when rows contain useful secondary metadata that needs more room than the trigger.
checkbox items are appropriate when an action menu also exposes a current preference.
or commands.
mentions and slash commands.
Popup width is an explicit content decision rather than a positioning side effect. `Select`, `Combobox`, and `DropdownMenu` content support `trigger`, `content`, and `content-at-least-trigger` widths.
A page-level list of records is a **`CollectionView`** (`packages/ui/src/react/patterns/collection-view/`), full stop. Card grids, trees (`TreeView`), sidebars, popup pickers, and changed-files lists are different patterns. The reference renderings are the stories in `packages/ui/src/react/patterns/collection-view/collection-view.stories.tsx`; the full locked spec lives with the unify-list-views effort.
dividers, hover/selected states, and always-on virtualization. Row content is either tabular `columns` (`CollectionViewColumn[]`, with `CollectionViewCell` for two-line text cells) or freeform `renderRow` — exactly one of the two. There is no header row.
`Root`) for search/filter/sort/sections/selection/pagination, or plain `items` + `getItemKey` when no state layer is needed. Selection, sections, and loading/error status auto-wire in view mode; `renderSectionHeader` overrides the default label+count section header (for select-all headers and the like).
Taller measured content overrides via `estimateSize`; per-surface pixel tweaking is not a thing.
`CollectionToolbar.Search`, `Spacer`, `Group`, and `Separator` as needed, then put it in `toolbar`; floating bulk bars and banners built on `ListPopoverCard` go in `footer`.
labels live in the sort spec, never re-declared in the UI.
the default presentation is a hover-revealed leading checkbox column plus a floating `ListPopoverCard` bulk bar. Row click opens the item and never mutates.
discoverability on management tables, hover buttons for at most 1–2 high-frequency actions. Destructive actions go last, separated, destructive-styled, with a confirm modal when irreversible.
interactive empty states are allowed); `Spinner` is the loading default. Custom `EmptyState` slot content must pass `bare` — the card paints its own surface, so the component's panel background would patch over it.
Query, bridge the query result into the view with `useQueryListSource(query, buildItems)` (an `external` list source) instead of `observable.box` bridges or hand-rolled loading/error branches. Routing is then framework-owned: `loading` + no rows
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.