Work-product rows written before the artifact projector tracked workspace_id end-to-end can lose the link through all three joins: workspace_id is NULL, task_id is NULL, and the row's run exists but its runs.workspace_id is also NULL. Those orphans were readable in the DocumentCenter (the listing doesn't need a workspace root) but could not be opened — resolveWorkProductTarget returned null and the toast now reports workspace_unresolved. Add a fourth resolution tier in resolveWorkProductTarget: if the three-step chain yields nothing, look up the company's observation workspace (primary first, then oldest) and check whether the external_id resolves to a real file inside that root. If it does, return that absolute path and the row opens. If the file isn't there, the error falls through with an extended detail line naming the observation root that was tried, so the operator sees exactly why the heal also failed. This is deterministic — exactly one fallback workspace — and side-effect-free on the read path: the row itself is left alone, no stealth write-back. A follow-up commit will stop the projector from writing NULL workspace_id in the first place. Typecheck and build:verify clean.
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 |






