ZacharyZhang-NY d75bfd5851 refactor(model-pool): scope disabled-models by company; cascade on delete (v42)
The per-connector "enabled/disabled model" settings lived under a
global key in the settings key-value table
(`disabled_models:${connectorId}`). No company dimension. Deleting a
company left the pool choices behind, and creating a new company
silently inherited them — the visible symptom was "onboarding's team-
model configuration survives company deletion and pollutes the next
company's CEO model list."

Root fix, not a cleanup hook: the storage becomes a real relational
table with `(company_id, connector_id)` primary key and an
`ON DELETE CASCADE` FK from `companies`. Company deletion wipes pool
config by construction; no cleanup step in `deleteCompany()` can
drift.

Schema (migration v42):
- CREATE TABLE connector_model_pool_settings (company_id, connector_id,
  disabled_models_json, updated_at), PK (company_id, connector_id),
  FK companies(id) ON DELETE CASCADE.
- Drop every `settings.disabled_models:*` key — these were the bug's
  residue; there is no right company to attribute them to, so the
  migration clears them. Users re-select on next onboarding.

API surgery — every reader/writer now takes companyId:
- db.getDisabledModels(companyId, connectorId)
- db.setDisabledModels(companyId, connectorId, models)
- db.hasModelPoolSettings(companyId, connectorId)
- connector-model-policy: getConnectorModelPolicy(deps, companyId,
  connectorId); validateConnectorModelSelection(deps, companyId,
  connectorId, model)
- model-dispatch: listEnabledModels(companyId, deps);
  pickModelForAgent resolves companyId from agent.companyId
- orchestration heartbeat/task-runner/turn-context/run-dispatch pass
  the agent's or run's companyId through to the policy deps
- IPC schema: connectorDisabledModelsSchema gains companyId; new
  connectorModelPoolQuerySchema pairs companyId+connectorId for reads

Onboarding becomes commit-on-launch:
- useConnectorModelSelection no longer persists via IPC during
  onboarding. Toggles mutate local state; it exposes `poolSelections`
  to the wizard.
- bootstrapOnboardingSchema gains connectorPoolSelections. The
  onboarding service saves the company first, then persists each
  per-connector disabled list scoped to the new company id — CEO
  model validation runs against the company's freshly-persisted pool,
  not some stale global.
- IPC setConnectorDisabledModels now requires companyId; the only
  consumer was onboarding, which no longer calls it at all.
- Main-side listConnectorModels returns the raw provider catalog
  (no pool filtering), since that IPC is used from onboarding where
  no company exists yet; pool filtering happens at dispatch time.

saveConnector IPC drops the per-company pool validation — connector
config is a global hint, company-scoped enforcement belongs at run
dispatch where the company is known.

Tests: 603/603 green. Typecheck clean. Integration tests rewritten
to set the pool via connectorPoolSelections on bootstrap input, not
a pre-bootstrap global setDisabledModels call.
2026-04-18 22:14:09 -04:00
2026-04-16 14:48:51 -04:00
2026-04-17 14:03:56 -04:00
2026-04-04 12:03:50 -04:00
2026-04-16 14:48:51 -04:00
2026-04-17 14:03:56 -04:00
2026-04-17 14:03:56 -04:00
2026-04-04 12:03:50 -04:00
2026-03-15 22:15:01 -04:00
2026-04-17 22:41:59 -04:00

AgentCompany logo

AgentCompany

Run an AI company from your desktop.

Latest Release License Platform Electron

Download  |  Website


AgentCompany dashboard

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_review for your decision.

Switch at Settings → Execution mode.


Features

Self-organizing teams

CEO builds the org chart from one goal.

Org chart

Agent messaging

Threads and DMs between agents. Messages land in each recipient's transcript as pi AgentMessage turns.

Agent messaging

Tasks

Goals break into tasks. Agents pick them up, report progress, escalate blockers.

Task queue

Approvals

Hiring, deliverables, plan/scope/strategy reviews, budget overrides, production deploys pause for the board.

Approvals

Documents

Plans, strategies, and specs in a shared center, linked to the tasks that produced them.

Document center

Launch in a minute

Name, mission, goal, provider, mode.

Onboarding


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

  1. Onboarding probes your shell PATH for node (agents call the local HTTP API via node -e).
  2. Settings → Providers. Sign in or drop a key.
  3. 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-core directly.
  • Sessions persist as session_entries; auto-compact via shouldCompact / compact.
  • Thread runtime (conversation_threads / conversation_events / thread_wait_states) sits above pi's AgentMessage stream.

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

License

MIT

S
Description
No description provided
Readme MIT
135 MiB
0 Stars 1 Watchers 0 Forks
2026-10-10 01:31:40 +00:00
Languages
TypeScript 93.7%
Shell 3%
CSS 2.3%
Python 0.5%
JavaScript 0.4%