acp-runtime
The ACP runtime is the domain service that serves the ACP API contract. It owns the host-scoped dependencies needed to run provider ACP sessions, but it should…
- `src/main/core/updates/update-service.ts` - `src/main/core/updates/controller.ts` - `build/` - `package.json` - `electron-builder.config.ts` - `electron-builder.canary.config.ts` - `scripts/release/build.ts` - `scripts/release/notarize-mac.ts` -
How it fires
How this agent gets triggered: by you, by Claude, or both.
Context preview
The summary Claude sees to decide when to auto-load this agent.
- `src/main/core/updates/update-service.ts` - `src/main/core/updates/controller.ts` - `build/` - `package.json` - `electron-builder.config.ts` - `electron-builder.canary.config.ts` - `scripts/release/build.ts` - `scripts/release/notarize-mac.ts` -
The stable release pipeline publishes to **GitHub Releases** (primary feed) and **Cloudflare R2** (legacy/migration feed). Both feeds are served from the same platform builds and are promoted by a single finalizer only after the complete supported architecture set builds and verifies.
electron-builder emits channel manifests named by the **first** publish provider's `channel`:
The R2 feed uses different channel names (`v1-stable`, `v1-canary`) that pre-date the GitHub migration. Rather than running a second packaging pass, `scripts/release/build.ts` calls `duplicateChannelManifests()` after the electron-builder step to copy `latest*.yml → v1-stable*.yml` (or `canary*.yml → v1-canary*.yml`). The duplicated manifests are kept local until platform verification finishes. `upload-github-assets.ts` then hashes the final files, refreshes manifest checksums and sizes, and uploads the artifacts and both manifest variants to the exact owned GitHub draft. On macOS this happens only after notarization and stapling.
Platform jobs never write the live R2 channel. `scripts/release/finalize-release.ts` first validates the exact owned GitHub release, the complete architecture inventory, and every update manifest entry. It downloads every referenced GitHub asset, verifies its SHA-512 against the manifest, uploads installer assets under an immutable `releases/<tag>/<run>-<attempt>/` prefix, and rewrites the R2 manifests to those keys. Before replacing any root `v1-stable*.yml` or `v1-canary*.yml` object, it snapshots the complete previous manifest set. Promotion or a confirmed GitHub publication failure restores that set. The original snapshot is journaled in R2 by tag, run, and commit before any root changes, so it survives retries and runner termination. If GitHub's response is ambiguous, the complete new R2 set is retained; a retry restores the journaled public roots when the release is still a draft or reconciles every root when publication actually succeeded.
The app does **not** override `autoUpdater.channel`; the GitHub provider resolves the channel naturally:
The `UPDATE_CHANNEL` / `v1-stable` / `v1-canary` naming applies **only** to the flat R2 bucket (via the `generic` publish block's `channel`). It is kept as a log label in `update-service.ts` for diagnostics but is not passed to `autoUpdater.channel`.
R2 uploads continue until telemetry confirms all clients have migrated to the GitHub-backed feed. At that point:
1. Remove the `provider: generic` block from `electron-builder.config.ts` and `electron-builder.canary.config.ts`. 2. Remove R2 staging/promotion from `finalize-release.ts` and `duplicateChannelManifests` from `build.ts`. 3. Decommission the R2 bucket.
exact release and manifest contents, promotes R2, and flips the GitHub draft to published. Until that job finishes the release remains invisible to GitHub-backed electron-updater clients.
verification and regenerates updater metadata from their bytes
Release scripts declare `yaml` 2.9 as a direct development dependency because electron-builder emits YAML updater manifests that must be parsed, structurally validated, merged, and serialized. Node.js does not provide a YAML parser. A handwritten parser would be unsafe, while importing the copy used transitively by Vite or electron-builder would create an undeclared and unstable dependency on their internal dependency graphs.
Dependency assessment recorded on 2026-09-01:
resolution or transitive dependency
Emdash is the Open-Source Agentic Development Environment (🧡 YC W26). Run multiple coding agents in parallel. Use any provider.
Repo: generalaction/emdash
The ACP runtime is the domain service that serves the ACP API contract. It owns the host-scoped dependencies needed to run provider ACP sessions, but it should…
This page defines the target organization of `packages/core/src/`. Core is organized by module type so that shared domain APIs and their platform…
Git is split into a transport contract and a host-scoped runtime. Renderer, desktop, and workspace-server code share the Wire vocabulary without importing Git…
The main process is organized into domain modules under `src/main/core/`. Each domain typically has a `controller.ts` (RPC handlers) and service/implementation…
`@emdash/core/primitives/path/api` is the source of truth for portable file identity and lexical path operations. The detailed package docs live in…