The 1f2f977 hotfix repairs the projector for new runs, but files that
already exist on disk before the fix lands stay invisible to the
DocumentCenter — a baseline+diff projector reports "changed" only
when a file's mtime advances past the run-start baseline, and a
quiescent file written before the fix never advances.
This commit adds a bootstrap-time one-shot rescan:
- New module `bootstrap/backfill-workspace-artifacts.ts` walks the
primary/oldest workspace of every company exactly once (gated by
`artifact_rescan_v1_done` in the settings table), applies the same
registrability filter as `artifact-projector.ts` (skip .git/,
node_modules/, .DS_Store, .lock/.log/.map; ignore package-lock.json
/ pnpm-lock.yaml / yarn.lock; cap at 5 000 files per workspace),
and upserts a `work_products` row via `findWorkProductByExternalId`
→ `createWorkProduct` for any file the projector never registered.
- bootstrap-application.ts wires the call after recoverScheduledPosts
(DB ready, services running, before the first heartbeat tick), so
the rescan completes in the same boot tick that the user opens
the DocumentCenter.
Idempotency: subsequent boots short-circuit on the settings flag.
The post-fix projector handles all future file activity inside
each run, so the backfill never needs to run twice. Per-workspace
file cap prevents a pathological tree from locking the bootstrap
path; overflow files are still picked up by the next run that
touches them. No fallback, no mock — files that fail stat are
silently skipped (same policy as the projector).
typecheck green, 543/543 unit tests, 10/10 eval. The user's 19
existing markdown deliverables under ~/Documents/Github/test/
should appear in the DocumentCenter on the next `pnpm dev`.
AgentCompany
Run an AI company from your desktop.
What it does
Type a company name and a goal. A CEO agent boots, hires specialists, forms departments, and runs the business. You approve or steer from the desktop.
Local, SQLite-backed, no external services. Inspired by Paperclip.
26 providers, no CLI
The runtime links pi-mono directly.
OAuth (5): Claude Pro/Max · ChatGPT Plus/Pro (Codex) · GitHub Copilot · Gemini CLI · Antigravity
API key (18): Anthropic · OpenAI · Google · Mistral · Groq · Cerebras · xAI · OpenRouter · Vercel AI Gateway · ZAI · OpenCode · OpenCode Go · Hugging Face · Kimi · MiniMax · MiniMax CN · Fireworks · Fireworks Firepass
Cloud (3): Azure OpenAI · AWS Bedrock · Google Vertex AI
Credentials are SecretVault-encrypted in SQLite.
Two execution modes
- AI CEO — autonomous. Hiring, tasks, deliverables run without you.
- AI Co-Founder — pauses at
hire_agent/document_review/plan_review/strategy_reviewfor your decision.
Switch at Settings → Execution mode.
Features
Self-organizing teams
CEO builds the org chart from one goal.
Agent messaging
Threads and DMs between agents. Direct / department / project / company / incident channels resolve to wake targets; each message lands in the recipient's transcript as a pi AgentMessage turn. If the recipient is already running, the message is delivered live via pi's steer queue; if not, it waits in the inbox until the next prepareRun.
Tasks
Goals break into tasks. Agents pick them up, report progress, escalate blockers.
Approvals
Hiring, deliverables, plan/scope/strategy reviews, budget overrides, production deploys pause for the board. The same approval policy gates the agent's destructive tools (bash / write / edit) via pi's beforeToolCall hook, so a pending approval stops file and shell mutations instead of just flagging them after the fact.
Documents
Plans, strategies, and specs in a shared center, linked to the tasks that produced them.
Launch in a minute
Name, mission, goal, provider, mode.
Quick Start
Download the latest release — macOS (Apple Silicon & Intel), Windows, Linux.
Build from source
# Node.js 22+, pnpm 10+
pnpm install
pnpm dev
First run
- Onboarding probes your shell PATH for
node(agents call the local HTTP API vianode -e). - Settings → Providers. Sign in or drop a key.
- Create a company: name, mission, goal, mode, workspace.
Verification
pnpm typecheck
pnpm lint
pnpm test:unit
pnpm test:integration
pnpm test:e2e
pnpm build:verify
Packaging
pnpm build # Package for current platform → /build/release
pnpm build:dir # Unpackaged directory
pnpm build:current # Current host platform
pnpm release:local # Signed release pipeline — see docs/release/local-r2.md
Targets: macOS .dmg, Windows .exe (NSIS), Linux .AppImage. Built with electron-builder. Local builds use ad-hoc signing (CSC_IDENTITY_AUTO_DISCOVERY=false). Defaults to --publish never.
Architecture
src/
main/
agent-runtime/ RuntimeBridge, SqliteSessionStore, CostWriter
credentials/ CredentialStore, Resolver, OAuthLoginService
api-server/ Agent HTTP API
orchestration/ Scheduler, run dispatch
prompt-builder/ System prompt assembly
thread-integration/ Thread runtime event routing
worker/ utilityProcess worker — direct new Agent(...)
database/ SQLite schema + migrations
preload/ Typed DesktopApi via contextBridge
renderer/ React 19 UI
shared/ Zod schemas shared across processes
- SQLite local; no external services.
contextIsolation: true,nodeIntegration: false, Zod-validated IPC.- Worker constructs
new Agent({...})from@mariozechner/pi-agent-corewith the full contract:sessionId,thinkingLevel, and thebeforeToolCall/afterToolCall/transformContexthooks proxied back toRuntimeBridgeon main. - Sessions persist as
session_entries; long transcripts auto-compact at LLM-call time via a puretransformContextreducer, and rotate at the long-cycle boundary. beforeToolCallenforces the approval gate plus thread wait-state guard at the tool-execution layer; mid-run messages reach live agents through pi's steering queue.- Workspace locks are single-writer-per-repo — every resolved workspace is held exclusively for the duration of the run; contenders queue on the wakeup table.
- Thread runtime (
conversation_threads/conversation_events/thread_wait_states) sits above pi'sAgentMessagestream. - Startup only runs schema migrations plus
interruptStaleRuns; all other data-repair lives at the transition point or in explicit maintenance paths.
Top-level directories
| Path | Purpose |
|---|---|
src/ |
TypeScript source for main / preload / renderer / shared. |
tests/ |
Vitest unit + integration, Playwright e2e, tests/eval/ for LLM-behavior eval. |
assets/ |
App icons, tray icons, and macOS entitlements. Referenced by electron-builder.yml and src/main/index.ts — must stay at repo root. |
builtin-skills/ |
Agent skill bundles shipped with the app. Loaded at runtime from process.cwd() or process.resourcesPath (see src/main/skills/runtime.ts) and packaged by electron-builder.yml. Must stay at repo root. |
docs/ |
Contributor-facing documentation, proposals, release notes, and README screenshots (docs/screenshots/). |
scripts/ |
Build, release, and packaging Node scripts. |
landing/ |
Marketing site (Next.js). Has its own landing/public/screenshots/, separate from docs/screenshots/. |
AgentCompany-Rust/ |
Exploratory Rust port; see section below. |
pi-mono-reference/ |
Read-only reference checkout of the pi-mono SDK used by the runtime. |
AgentCompany-Rust
The AgentCompany-Rust/ directory is an exploratory parallel implementation of the runtime in Rust (GPUI-based desktop shell, SQLite storage, pi bridge). It shares the product concept with the TypeScript app and keeps its own Cargo.toml workspace, PRD, and progress notes under AgentCompany-Rust/.
Current status:
- TypeScript Electron app is the shipping product and the only target of the release pipeline (
pnpm build,pnpm release:*). - Rust workspace is experimental, not wired into CI, not packaged, not distributed.
- Schemas and runtime contracts are maintained independently; no cross-language codegen yet.
Detailed design lives in AgentCompany-Rust/PRD.md. Positioning beyond "exploratory parallel implementation" is left to the Rust owner to document.
Scripts
package.json scripts follow a <group>:<subgroup> convention. Common entry points:
| Script | Purpose |
|---|---|
pnpm dev |
Run the Electron app in dev mode (electron-vite). |
pnpm typecheck |
tsc --noEmit using the root tsconfig.json. |
pnpm lint / pnpm lint:fix |
ESLint across the repo; :fix auto-fixes. |
pnpm test |
Vitest unit + integration in one pass. |
pnpm test:unit / pnpm test:integration / pnpm test:e2e |
Individual test tiers. |
pnpm test:run |
Sequential unit → integration → e2e. |
pnpm build:verify |
electron-vite build only — no packaging. |
pnpm build / pnpm build:dir / pnpm build:current |
Full packaged build / unpackaged dir / current host platform. |
pnpm release:local |
Signed release pipeline — see docs/release/local-r2.md. |
pnpm release:cloudflare / pnpm release:boss |
Distribution pipelines. |
pnpm verify |
typecheck && lint && test:unit && test:integration && test:e2e. |
pnpm verify:release |
verify && build:dir — the full gate before a release. |
Rules for adding scripts:
- Use
group:subgroup(test:unit,build:dir,release:local); avoid flat verbs likechecktypes. groupalone should do the useful-by-default thing for that group.verifyis the CI-side aggregate; keep it in sync when adding a new tier.
Tech Stack
| Layer | Tech |
|---|---|
| Framework | Electron 39.8.0 |
| Language | TypeScript 5.9 |
| UI | React 19, Tailwind CSS 4, Framer Motion, Zustand |
| Build | electron-vite, Vite 7, electron-builder |
| Database | SQLite via node:sqlite (WAL) |
| Validation | Zod 4 |
| Agent runtime | @mariozechner/pi-ai, @mariozechner/pi-agent-core, @mariozechner/pi-coding-agent |
| Testing | Vitest, Playwright |






