agentic-first CRM / open source

CRM は、
エージェントのノートブック。

人がフォームへ入力する CRM ではなく、エージェントが調査し、フォローアップを予約し、確かな証拠だけを記録する CRM。データベースはその作業結果を保持する場所に徹する。

eve durable agentNext.js 16NestJS + tRPCPostgres / PrismaMIT
01 / thesis

「AI 機能付き CRM」ではない

agent ≠ feature

エージェントは画面横のチャットではない。独立したデプロイで、キューから仕事を取り、ブラウザを閉じても調査を続ける。

API = signal

API は判断しない。スレッド取込や未知の参加者を AgentTask として記録し、意味づけは agent 側へ渡す。

no guesses

人物情報に confidence score を付けない。観測した evidence と、人が判断すべき suggestion を分ける。

単一テナント。 Google sign-in と allow-list が認証モデルの全体。社内利用を前提に、認可の複雑さを増やさない。
02 / architecture

イベントを置く API と、意味を読む agent

flowchart LR B[Browser] --> APP[Next.js app\nRSC + TanStack Query] APP -->|tRPC| API[NestJS API\nHTTP / auth / sync] API -->|writes event| Q[(Postgres\nAgentTask queue)] AG[Durable eve agent\nown schedule + budget] -->|leases| Q AG -->|facts / suggestions| Q API --> DB[(Prisma / Postgres)] AG --> EXT[Optional outside sources\nGmail / Calendar / research]

API と agent の境界は「HTTP の中で同期的に enrich しない」。キューの行は agent が停止していても残り、lease が切れれば再実行できる。

03 / agent runtime

仕事を自分で取り、予算が尽きたら止まる

Durable work queue

claimDue は FOR UPDATE SKIP LOCKED で期限の来たタスクを lease。複数 dispatcher が同じ仕事を取らず、死んだ run は lease expiry で戻る。

Evidence-aware tools

read_crm_history、search_crm、identify_contact、research_person、record_fact など、観測・照合・記録を分離した tool 群。

Schedule is a decision

cron は「毎 N 分」ではなく、タスクの dueAt。再確認には理由を残す schedule_recheck を使う。

agent → lease task → inspect evidence → strong evidence: write fact → weak evidence: human suggestion → schedule next look with reason
04 / truth model

確信度ではなく、証拠の価格

モデル自身に確信度を採点させると、便利そうに見える方向へ誤る。CRM は crm.signature-block や github.account-identity のような provenance を保存し、evidence ledger が強さを評価する。

入力扱い書き込み
署名ブロック、直接の履歴強い観測record に反映
外部プロフィールの候補弱い / 衝突の可能性suggestion として人へ
モデルの「たぶん」証拠ではない人物情報に書かない

「空欄」は「自信満々に間違っている」より安全。誰も誤りに気づけないデータを作らない。

05 / product surface

画面は作業のために薄く保つ

CRM overview dashboard

Overview — closed-won、open pipeline、stage 別の案件を一画面で把握。

CRM deals list

Deals — filter・sort・pagination を URL に保持し、ビューをリンクとして共有。

Sheets, not nested pages

行をクリックすると URL param で detail sheet を開く。戻るボタンで閉じ、深い route tree を作らない。全リストは同じ server-side paginated DataTable を使う。

06 / stack

境界を説明できるモノレポ

層役割代表パス
apps/appRSC prefetch、画面、URL statecomponents/crm
apps/apiauth、health、tRPC routers、syncsrc/*
apps/agentdurable session、tools、skills、scheduleagent/
packages/dbPrisma schema と safe clientpackages/db
packages/ui共有 UI primitives / DataTablepackages/ui

外部 API の vendor client は apps/agent に置く。Nest service が enrichment を呼び出したら、境界違反として扱う。

07 / quick start

ローカルで動かす

cp .env.example .env bun install bun run dev

Google sign-in、Postgres、必要に応じて Gmail / Calendar の credentials を設定する。詳細は source repository の docs/environment.md と README.md を参照。

GitHub: 53able/crm ↗