Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
1fc9e39
01-foundation: identity, gateway, runtime, contracts and deploy
Sep 3, 2026
d07236f
02-meetings: the meetings domain, including the MCP service
Sep 3, 2026
6afabc8
03-flows-engine: the flows engine, model and API
Sep 3, 2026
0868779
04-flows-definitions: flow definitions, steps, integrations and behav…
Sep 3, 2026
2c7279f
01-foundation: identity, gateway, runtime, contracts and deploy — tests
Sep 3, 2026
d2a9634
02-meetings: the meetings domain, including the MCP service — tests
Sep 3, 2026
3c6e1eb
03-flows-engine: the flows engine, model and API — tests
Sep 3, 2026
64f8819
04-flows-definitions: flow definitions, steps, integrations and behav…
Sep 3, 2026
ee9e59c
05-docs: the flows documentation — tests
Sep 3, 2026
3871dcc
flows: onboarding in the queue — a new person's first step is to try …
DmitriyG228 Sep 3, 2026
7df62c6
flows: README for the offline suite (gate:readme wants one per direct…
DmitriyG228 Sep 3, 2026
3701bde
flows: a friction report is never lost to a vocabulary word (F-D26)
DmitriyG228 Sep 4, 2026
b0a5b33
mcp: the edge advertises a vocabulary, it never enforces one (station…
DmitriyG228 Sep 4, 2026
2c3afc2
flows: the friction sink catches all signal — as sent (founder ruling)
DmitriyG228 Sep 4, 2026
0d7cd57
mcp: read the owning route's vocabulary under either key
DmitriyG228 Sep 4, 2026
742a399
flows: the friction sink refuses nothing a caller can send (F-D27)
DmitriyG228 Sep 4, 2026
f77f2a2
api: a refusal carries the deciding service's own words to the caller
DmitriyG228 Sep 4, 2026
acd7a25
mcp: a refusal reaches the agent as structure, not as prose with JSON…
DmitriyG228 Sep 4, 2026
72fb8ef
mcp: whats_waiting tells agents when to call it; no duplicated descri…
DmitriyG228 Sep 4, 2026
b12066d
flows: a queue item may declare itself a standing notice
DmitriyG228 Sep 4, 2026
4b68953
mcp: standing notices ride out on the meeting tools' results
DmitriyG228 Sep 4, 2026
5e8823c
mcp: standing notices ride refusals too (#1549)
DmitriyG228 Sep 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -266,9 +266,9 @@ curl -X POST "$API_BASE/agent/events" -H "X-API-Key: $API_KEY" -H "Content-Type:
"plan":{"prompt":"Triage this email into tasks; propose a record for each action item and a draft reply."}}'
```

> **Live-meeting copilot** — cards for people, decisions, and action items *during* the call
> (`POST /agent/meeting/start` → stream `GET /agent/meeting/stream`) — is on the roadmap; see
> [Status](#️-status--roadmap).
> **During the call** — stream the live transcript with `GET /agent/meeting/stream` and ask your
> agent about it in the chat. Vexa runs no model of its own during a meeting: there is one
> intelligence and it is your agent. See [Status](#️-status--roadmap).

---

Expand Down Expand Up @@ -429,9 +429,10 @@ at `/mcp` for agent clients ([docs](https://docs.vexa.ai/vexa-mcp)). Full refere
**[docs.vexa.ai](https://docs.vexa.ai)**.

> **v0.12 note:** live bot-control — `PUT /bots/{…}/config` (change language/task mid-call) and
> `POST /bots/{…}/speak` (TTS into the call) — plus the live-meeting copilot (`/agent/meeting/*`) and
> WebSocket streaming are not yet wired in the open-core stack and return `404` today. Send-a-bot, stop,
> status, transcripts, recordings, agent chat, routines, and events are live.
> `POST /bots/{…}/speak` (TTS into the call) — plus WebSocket streaming are not yet wired in the
> open-core stack and return `404` today. So do `POST /agent/meeting/{start,process}`, the removed
> in-product meeting copilot. Send-a-bot, stop, status, transcripts, recordings, the live transcript
> feed, agent chat, routines, and events are live.

---

Expand All @@ -450,7 +451,7 @@ Honest state of the **0.12** line (mirrors the [status page](https://docs.vexa.a
| **Agent chat / routines / events over your workspace** | ✅ Built & proven live |
| Workspace — git Markdown / OKF `kg/` bundle | 🟡 core proven; bucket-backed store landing |
| **Runtime — Kubernetes backend** (Pod per dispatch) | ✅ Lifecycle + per-mount isolation; Helm in `deploy/helm` |
| Live-meeting copilot (cards as the call runs) | 🔵 Next |
| Live transcript feed as the call runs (+ agent chat over it) | ✅ Built & proven live |
| Calendar sync (ICS) · planned meetings · scheduled auto-join | ✅ Production |
| Shared workspaces & shared meetings (invites, real-time feed) | ✅ Built & proven live |
| Agent chat during a live meeting (live transcript + workspace in context) | ✅ Built & proven live |
Expand Down
273 changes: 176 additions & 97 deletions architecture.calm.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
"unique-id": "agent",
"node-type": "system",
"name": "agent",
"description": "copilot; owns the processed (cleaned) transcript + signals",
"description": "the execution domain: a trigger becomes one governed agent turn over a workspace.v1 git repo; owns no transcript",
"metadata": [
{
"path": "core/agent"
Expand Down Expand Up @@ -504,18 +504,6 @@
}
]
},
{
"unique-id": "processed-notes.v1",
"node-type": "contract",
"name": "processed-notes.v1",
"description": "processed-notes.v1 — sealed/published contract (agent): the proc:meeting:{row_id} cleaned-notes stream + view_end terminal marker (agent-worker → meeting-api db-writer / agent-api SSE; ADR-0027)",
"metadata": [
{
"path": "core/agent/contracts/processed-notes.v1",
"domain": "agent"
}
]
},
{
"unique-id": "workspace.v1",
"node-type": "contract",
Expand Down Expand Up @@ -862,42 +850,11 @@
}
]
},
{
"unique-id": "proc-stream",
"node-type": "data-asset",
"name": "proc:meeting:{id} (stream)",
"description": "cleaned 1:1 processed transcript, keyed by segment_id, + the view_end terminal marker (processed-notes.v1, ADR-0027); agent-worker is the writer; read by meeting-api's db-writer (durable data.processed.views) and agent-api's live SSE",
"controls": {
"ownership": {
"description": "single writer (P23)",
"requirements": [
{
"requirement-url": "https://vexa.ai/calm/controls/single-writer.requirement.json",
"config": {
"writers": [
"agent-worker"
],
"match": "proc:meeting:",
"op": "xadd"
}
}
]
}
},
"metadata": [
{
"contract": "transcript.v1"
},
{
"stage": "cleaned"
}
]
},
{
"unique-id": "out-stream",
"node-type": "data-asset",
"name": "unit:{id}:out (stream)",
"description": "worker output stream (cards / agent activity / message deltas — notes moved to proc-stream per ADR-0027); agent-api relays as SSE",
"description": "worker output stream (agent activity / message deltas); agent-api relays as SSE",
"controls": {
"ownership": {
"description": "single writer (P23)",
Expand Down Expand Up @@ -1107,7 +1064,7 @@
"unique-id": "agent-worker",
"node-type": "service",
"name": "agent-worker",
"description": "spawned claude-in-container worker; one dispatch turn / meeting copilot",
"description": "spawned isolated workspace-agent worker; selectable Claude Code or Codex app-server harness; one dispatch turn; every dispatch mounts the ordered [_global, active workspaces, _system] stack, fails closed without _global, and loads its authoritative entry context into the turn",
"metadata": [
{
"path": "core/agent/worker"
Expand Down Expand Up @@ -1251,6 +1208,74 @@
"external-image": "vexaai/dashboard"
}
]
},
{
"unique-id": "flows",
"node-type": "system",
"name": "flows",
"description": "the reaction engine; owns the reaction row and its effect receipts",
"metadata": [
{
"path": "core/flows"
}
]
},
{
"unique-id": "flows-engine",
"node-type": "module",
"name": "flows-engine",
"description": "the engine: stdlib-only at module scope — step implementations and flow definitions are values it receives, never imports",
"metadata": [
{
"path": "core/flows/src/flows"
}
]
},
{
"unique-id": "flows-api",
"node-type": "service",
"name": "flows-api",
"description": "the flows HTTP surface: fact ingress (/events), the flow registry and lifecycle, the reaction projection, the person-scoped timeline",
"metadata": [
{
"path": "core/flows/src/flows_integrations"
}
],
"interfaces": [
{
"unique-id": "flows-http",
"type": "api"
}
]
},
{
"unique-id": "flows-worker",
"node-type": "service",
"name": "flows-worker",
"description": "the one leased loop; a SKIP LOCKED poll over next_run_at is the only clock consumer — time is a column, not a scheduler",
"metadata": [
{
"path": "core/flows/src/flows_worker"
}
]
},
{
"unique-id": "flows-rows",
"node-type": "data-asset",
"name": "flows-rows",
"description": "the reaction + effect_receipt tables (core/flows/schema.sql); a retry consults the receipt before touching the outside world again"
},
{
"unique-id": "processed-notes.v1",
"node-type": "contract",
"name": "processed-notes.v1",
"description": "processed-notes.v1 — sealed/published contract (agent): the proc:meeting:{row_id} cleaned-notes stream + view_end terminal marker (agent-worker → meeting-api db-writer / agent-api SSE; ADR-0027)",
"metadata": [
{
"path": "core/agent/contracts/processed-notes.v1",
"domain": "agent"
}
]
}
],
"relationships": [
Expand All @@ -1268,12 +1293,10 @@
"task.v1",
"tool.v1",
"unit.v1",
"processed-notes.v1",
"workspace.v1",
"agent-worker",
"out-stream",
"unit-in",
"proc-stream",
"va-chat"
]
}
Expand Down Expand Up @@ -1550,24 +1573,6 @@
}
]
},
{
"unique-id": "terminal-reads-processed",
"relationship-type": {
"connects": {
"source": {
"node": "terminal"
},
"destination": {
"node": "proc-stream"
}
}
},
"metadata": [
{
"access": "read"
}
]
},
{
"unique-id": "terminal-reads-out",
"relationship-type": {
Expand Down Expand Up @@ -2031,25 +2036,6 @@
}
]
},
{
"unique-id": "aw-proc",
"relationship-type": {
"connects": {
"source": {
"node": "agent-worker"
},
"destination": {
"node": "proc-stream"
}
}
},
"description": "XADD cleaned 1:1 notes",
"metadata": [
{
"access": "write"
}
]
},
{
"unique-id": "aw-unitin",
"relationship-type": {
Expand Down Expand Up @@ -2369,13 +2355,116 @@
]
}
}
},
{
"unique-id": "flows-composed",
"relationship-type": {
"composed-of": {
"container": "flows",
"nodes": [
"flows-engine",
"flows-api",
"flows-worker",
"flows-rows"
]
}
}
},
{
"unique-id": "flows-worker-writes-rows",
"relationship-type": {
"connects": {
"source": {
"node": "flows-worker"
},
"destination": {
"node": "flows-rows"
}
}
},
"metadata": [
{
"access": "write"
}
]
},
{
"unique-id": "flows-api-reads-rows",
"relationship-type": {
"connects": {
"source": {
"node": "flows-api"
},
"destination": {
"node": "flows-rows"
}
}
},
"metadata": [
{
"access": "read"
}
]
},
{
"unique-id": "flows-worker-calls-agent-api",
"description": "steps reach domains only over their published HTTP surfaces (core/flows/src/flows_steps/common.py) — a domain never knows flows exists",
"relationship-type": {
"connects": {
"source": {
"node": "flows-worker"
},
"destination": {
"node": "agent-api"
}
}
}
},
{
"unique-id": "flows-worker-calls-gateway",
"relationship-type": {
"connects": {
"source": {
"node": "flows-worker"
},
"destination": {
"node": "gateway"
}
}
}
},
{
"unique-id": "flows-worker-calls-admin-api",
"relationship-type": {
"connects": {
"source": {
"node": "flows-worker"
},
"destination": {
"node": "admin-api"
}
}
}
},
{
"unique-id": "flows-deployed",
"description": "helm only today (deploy/helm/charts/vexa/templates/flows.yaml); the two processes are not services in deploy/compose, so a compose stack runs no flows",
"relationship-type": {
"deployed-in": {
"container": "deploy",
"nodes": [
"flows-api",
"flows-worker"
]
}
}
}
],
"flows": [
{
"unique-id": "live-transcript-flow",
"name": "live transcript",
"description": "raw -> durable collector -> native stream -> copilot clean -> render. One render engine; terminal never re-derives.",
"description": "raw -> durable collector -> native stream -> render. One render engine; terminal never re-derives.",
"transitions": [
{
"relationship-unique-id": "bot-writes-segments-stream",
Expand All @@ -2395,17 +2484,7 @@
{
"relationship-unique-id": "aw-tcnative",
"sequence-number": 4,
"description": "copilot tails the native stream"
},
{
"relationship-unique-id": "aw-proc",
"sequence-number": 5,
"description": "copilot writes cleaned 1:1 transcript"
},
{
"relationship-unique-id": "terminal-reads-processed",
"sequence-number": 6,
"description": "one engine renders raw|processed; no re-derivation"
"description": "the agent reads the native stream for chat grounding"
}
]
},
Expand Down
2 changes: 1 addition & 1 deletion architecture.seal.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"architecture.calm.json": "2b9c70c1b57f341d50e7852b3e54b9cc6e4793edb740297b8f3b1ac5d1618d62"
"architecture.calm.json": "4a73bc6dad939e95cdc1d07c36d1162507d2d6715e84bbce4c5b6d51ad1154a9"
}
Loading
Loading