Skip to content
Agent Workspaces
Agent

renderer

All paths are relative to `apps/emdash-desktop/`.

From plugin
emdash
6.2k33 skills33 agents

Agent definition

renderer.md

Renderer

All paths are relative to `apps/emdash-desktop/`.

Main Entry Points

  • `src/renderer/main.tsx`: renderer bootstrap — seeds the wire connection and navigation host,

creates the app store scope, then mounts React

  • `src/renderer/App.tsx`: top-level provider composition
  • `src/renderer/app/workspace.tsx`: main post-onboarding shell
  • `src/core/primitives/wire/browser/connection.ts`: seeded wire-connection seam

(`seedWireConnection` / `getWireConnection` / `domainClient`); every slice exposes a typed domain client from its `api/` built on `domainClient`

  • `src/core/manifests/browser/view-catalog.ts`: aggregated view catalog; view definitions are

contributed by slices (`contributions/views.ts`) via `defineView` from `src/core/primitives/views/`

App Shell (`src/renderer/app/`)

  • `workspace.tsx`, `welcome.tsx` — shell and top-level views (the home view is workbench-owned:

`src/core/features/workbench/browser/home-view.tsx`)

  • `app-menu-events.tsx` — native app menu event wiring
  • `app-shutdown-lifecycle.tsx` — quit-confirmation and shutdown-flush handling

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 Areas (`src/core/features/*/browser/`)

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.

Shared Renderer Infrastructure (`src/renderer/lib/`)

`src/renderer/lib/` is a thin host shell; portable browser infrastructure lives in `src/core/primitives/`.

  • `runtime/` — bootstrap seeding (`seed-desktop-wire.ts`, `seed-navigation-host.ts`) and the

renderer-internal aggregate Wire client (`desktop-wire-client.ts`); slices use their own domain clients instead

  • `modal/modal-renderer.tsx` — renders the active modal from the manifest catalog; modal

definitions, store, and close guards live in `src/core/primitives/modals/react/`

  • `layout/` — workspace layout and right-sidebar composition
  • `keybindings/` — keybinding dispatcher mount and browser shortcut forwarding
  • `stores/` — navigation telemetry wiring; app-lifetime stores are slice-owned and ride the app

scope (`src/core/manifests/browser/app-scoped-stores.ts`)

  • `providers/`, `hooks/` — shared providers and hooks (theme, feature flags, multi-select)

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

Read more
@generalaction
Ships withemdash

Emdash is the Open-Source Agentic Development Environment (🧡 YC W26). Run multiple coding agents in parallel. Use any provider.

Stars on GitHub

Momentum

stars in total
6.2k
Star history of generalaction/emdash on GitHub, a chart by star-history.com

Other agents on emdash.

acp-runtime

acp-runtime

Agent

The ACP runtime is the domain service that serves the ACP API contract. It owns the host-scoped dependencies needed to run…

core-modules

core-modules

Agent

This page defines the target organization of `packages/core/src/`. Core is organized by module type so that shared domain APIs…

git-runtime

git-runtime

Agent

Git is split into a transport contract and a host-scoped runtime. Renderer, desktop, and workspace-server code share the Wire…

main-process

main-process

Agent

The main process is organized into domain modules under `src/main/core/`. Each domain typically has a `controller.ts` (RPC…

path-system

path-system

Agent

`@emdash/core/primitives/path/api` is the source of truth for portable file identity and lexical path operations. The detailed…

More agents from other plugins.

api-builder

api-builder

Agent

Deprecated placeholder. Do not use; follow root AGENTS.md and package instructions instead.

happier2d2.2k
@happier-dev@happier-devInstall Agent

Questions about renderer.

Which coding agents can use renderer?
renderer installs in Claude Code and Cursor: each loads subagents from .claude/agents, so copy the file there. Flowy's auto-invocation runs in Claude Code only.