Skip to content

Commit 6ab3b3f

Browse files
committed
Bring the docs and the changelog up to date with the code before release
Every claim in the README, .env.example, docs/ and the chart README was checked against the code on main and corrected where it had drifted. The README points to running Intelligence locally on the free Developer plan and to having CopilotKit build OpenBot with you. The Unreleased changelog gains entries for Automatic Learning, Parallel Search, constant-time token checks and the lodash-es pin, an upgrade note naming migrations 0042 to 0051, and the entries that had been written into the already released 0.0.15 and 0.0.14 sections after their tags.
1 parent 99d8c6a commit 6ab3b3f

13 files changed

Lines changed: 307 additions & 167 deletions

‎.env.example‎

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -108,21 +108,25 @@ OPENBOT_SINGLE_USER=true
108108
# OPENBOT_APP_URL=http://localhost:3010
109109
TRUSTED_ORIGINS=http://localhost:3010
110110

111-
# CopilotKit Intelligence. Required: the server refuses to start without all four because
112-
# Intelligence owns durable threads and memory and a deployment without it forgets every
113-
# conversation. There is no degraded mode.
114-
#
115-
# Do not run Intelligence yourself. These two point at the managed service and should be left
116-
# unchanged; the CLI below provisions a free licence for it. Running Intelligence on your own
117-
# infrastructure is an Enterprise Intelligence Platform feature deployed by Helm chart, and is not
118-
# self-serve: https://docs.showcase.copilotkit.ai/premium/self-hosting
111+
# CopilotKit Intelligence. Required: the server refuses to start without the URL, the gateway URL
112+
# and the key below, because Intelligence owns durable threads and memory and a deployment without it
113+
# forgets every conversation. There is no degraded mode.
114+
#
115+
# These two point at the managed service; leave them unless you run Intelligence yourself. To try
116+
# it on one Mac, the CLI's local evaluation writes both for you (see "Intelligence on your own
117+
# machine" in README.md): https://docs.copilotkit.ai/intelligence/self-hosting-local
118+
# Running it in production on your own infrastructure is an Enterprise Intelligence Platform
119+
# feature deployed by Helm chart: https://docs.showcase.copilotkit.ai/premium/self-hosting
119120
INTELLIGENCE_API_URL=https://api.intelligence.copilotkit.ai
120121
INTELLIGENCE_GATEWAY_WS_URL=wss://realtime.intelligence.copilotkit.ai
121122
#
122-
# Get both of the next two from the CopilotKit CLI:
123+
# Get the key from the CopilotKit CLI:
123124
#
124125
# npx --yes copilotkit@latest login # browser sign-in
125-
# npx --yes copilotkit@latest project select # prints the cpk-... runtime key -> INTELLIGENCE_API_KEY
126+
# npx --yes copilotkit@latest project select # writes the cpk-... key to .env as CPK_INTELLIGENCE_API_KEY
127+
# bun scripts/setup-learning.ts # copies it here, as INTELLIGENCE_API_KEY
128+
#
129+
# The server reads only INTELLIGENCE_API_KEY, so a key left as CPK_INTELLIGENCE_API_KEY is not seen.
126130
#
127131
# The runtime key is also under "API Keys" in your project at https://intelligence.copilotkit.ai
128132
INTELLIGENCE_API_KEY=
@@ -284,8 +288,9 @@ COMPUTER_TOKEN=
284288
# volumes, so one Bot cannot read another's files or use another's logins, and every action records
285289
# which Bot took it. A rule can still restrict a single Bot with `bot.id`.
286290
#
287-
# Attributes: tool.name, bot.id, actor.id, page.url, page.host, element.ref/role/name/type,
288-
# key, file.path, file.name, file.extension.
291+
# Attributes: tool.name, intent, bot.id, actor.id, page.url, page.host,
292+
# element.ref/role/name/type, key, command, file.path, file.name, file.extension,
293+
# mcp.server, mcp.tool, mcp.effect, initiator.kind, initiator.id.
289294
#
290295
# Name every route to the same effect. A form submits from a keypress in any of its fields, so a rule
291296
# that only blocks a Submit button does not block Enter from another field. The example below refuses
@@ -405,7 +410,8 @@ AGENT_TOOL_TOKEN=
405410
#
406411
# Left empty, the internal endpoint refuses every call and no routine ever fires — the correct state
407412
# for a deployment that has not stood up a worker. Set for one that has: openssl rand -base64 32.
408-
# Do not accept a default in production.
413+
# `scripts/start.sh` falls back to a fixed development value locally. Do not accept a default in
414+
# production.
409415
WORKER_SHARED_SECRET=
410416

411417
# Composio, the broker that holds people's accounts for a few hundred apps, so a Bot can act in Gmail

‎CHANGELOG.md‎

Lines changed: 94 additions & 73 deletions
Large diffs are not rendered by default.

‎README.md‎

Lines changed: 55 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,12 @@ your own machine.
3535
3636
> **Runs on your machine.** Everything below is written for a laptop. `.env.example` carries `OPENBOT_SINGLE_USER=true`, which admits every request as one administrator, so a fresh clone reaches the product without registering an OAuth client first. [Sign-in](#sign-in) turns that off, and is required before anybody else can reach the deployment.
3737
38-
> **Do not want to build it yourself?** We will. Our engineers will stand OpenBot up inside your
39-
> infrastructure, customize it into something that looks like your own product, and hand it back to you to
40-
> keep changing. [**Start the conversation**](https://copilotkit.ai/talk-to-an-engineer?ref=openbot_readme).
38+
> **We can build this for you, or with you, at your company.** Our engineers will stand OpenBot up
39+
> inside your infrastructure, customize it into something that looks like your own product, and hand it
40+
> back to you to keep changing. [**Start the conversation**](https://copilotkit.ai/talk-to-an-engineer?ref=openbot_readme).
41+
>
42+
> In the meantime, run all of it on your laptop, Intelligence included: CopilotKit's free Developer plan
43+
> covers [running Intelligence locally](#intelligence-on-your-own-machine) in Docker on a Mac.
4144
4245
## What it is
4346

@@ -92,9 +95,11 @@ A Bot is any endpoint speaking [AG-UI](https://github.com/ag-ui-protocol/ag-ui),
9295
`openbot` Learning container, then writes both settings to `.env`. It preserves
9396
custom container assignments and refuses to replace an existing OpenBot key.
9497
For fresh self-hosted setup, set `INTELLIGENCE_API_URL` to that deployment's
95-
HTTPS API origin and run the helper without the two `npx` commands. It opens
96-
an isolated Chrome or Edge window for your usual sign-in and project choice;
97-
install either browser first. Existing key-only setups can assign a container
98+
HTTPS API origin (or `http://localhost` for a local one) and run the helper
99+
without the two `npx` commands. It opens an isolated Chrome or Edge window for
100+
your usual sign-in and project choice; install either browser first. It writes
101+
the API URL, the key and the container, not `INTELLIGENCE_GATEWAY_WS_URL`, so
102+
set that one to the same deployment yourself. Existing key-only setups can assign a container
98103
through [Admin → Automatic Learning](docs/automatic-learning.md).
99104
Managed Intelligence needs no separate licence token.
100105

@@ -116,9 +121,31 @@ A Bot is any endpoint speaking [AG-UI](https://github.com/ag-ui-protocol/ag-ui),
116121

117122
5. Open <http://localhost:3010>.
118123

119-
`scripts/start.sh` starts Docker services, applies migrations, starts the API server on port 3001, starts the app on port 3010, and checks that the services answer their own health routes before printing next steps.
124+
`scripts/start.sh` starts Docker services, applies migrations, starts the API server on port 3001, starts the routine worker, starts the app on port 3010, and checks that the services answer their own health routes before printing next steps.
120125

121-
`scripts/stop.sh` takes the same things down, including each Bot's computer, which compose does not own. Nothing is deleted: the database, the Bots' files and their browser profiles are volumes.
126+
`scripts/stop.sh` takes the same things down, including each Bot's computer, which compose does not own; `--keep-computers` leaves the computers running. Nothing is deleted: the database, the Bots' files and their browser profiles are volumes.
127+
128+
### Intelligence on your own machine
129+
130+
To try Intelligence on one Mac instead of the managed service, follow
131+
[Evaluate Intelligence locally](https://docs.copilotkit.ai/intelligence/self-hosting-local). The free
132+
[Developer plan](https://www.copilotkit.ai/pricing) qualifies. The local licence lasts 30 days and
133+
`npx copilotkit@latest local renew` renews it as often as you need, while your account is in good
134+
standing. It is a preview for macOS with Docker Desktop,
135+
not a production installation. Run its
136+
`npx copilotkit@latest local connect` from the OpenBot root, where `.env` is.
137+
138+
That command writes `INTELLIGENCE_API_URL`, `INTELLIGENCE_GATEWAY_WS_URL` and
139+
`CPK_INTELLIGENCE_API_KEY` to `.env`. OpenBot reads the first two as they are, but takes its project
140+
key only from `INTELLIGENCE_API_KEY` and refuses to start without it, so copy the `cpk-...` value
141+
across before `bash scripts/start.sh`:
142+
143+
```sh
144+
INTELLIGENCE_API_KEY=cpk-... # the value of CPK_INTELLIGENCE_API_KEY
145+
```
146+
147+
To give the Bots a Learning container on that stack, see
148+
[Automatic Learning](docs/automatic-learning.md).
122149

123150
## Deploy it
124151

@@ -157,10 +184,19 @@ Leave `EMBEDDED_POSTGRES` off and set `DATABASE_URL` to point at a database you
157184
| `/` | Start and browse channels. |
158185
| `/agents` | Create, edit, duplicate, pin, hide, delete, and launch coworkers. |
159186
| `/channel/:id` | Converse with one coworker, watch its screen, and see what it ran. |
187+
| `/group/new` | Start one conversation with two or more Bots. |
160188
| `/bot` | Direct chat with a Bot; `?agent=<id>` selects one. |
189+
| `/bots` | What each of your Bots is doing, what it needs from you, and whether it is paused. |
190+
| `/team-bots` | Bots your teammates published, and the ones you share. |
191+
| `/responsibilities` | Give a Bot a lasting goal, follow its progress, and decide when it should work. |
192+
| `/reachability` | Continue a conversation in Slack, Microsoft Teams, by text message, or on your phone. |
193+
| `/memory` | Review what your Bots remember, and choose which connected apps can contribute facts. |
194+
| `/approvals` | Choose what your Bots may do, and review actions waiting for you. |
161195
| `/skills` | Create and enable personal skills. |
162196
| `/routines` | See the routines that are standing, and stop one. |
163197
| `/settings` | User preferences. |
198+
| `/settings/connected-accounts` | Connect your apps so your Bots can work with them. |
199+
| `/settings/passwords` | Logins you saved when signing a Bot in to a website. |
164200
| `/admin/credentials` | Store write-only encrypted credentials. |
165201
| `/admin/computers` | View, stop, and reset Bot computers. |
166202
| `/admin/boundaries` | Configure browser/file/MCP action policy. |
@@ -171,6 +207,7 @@ Leave `EMBEDDED_POSTGRES` off and set `DATABASE_URL` to point at a database you
171207
| `/admin/learning` | Assign Learning containers to Bots, or pause Automatic Learning. |
172208
| `/admin/people` | List, promote, demote, and remove people who have signed in. |
173209
| `/admin/identity-providers` | Register a company SAML or OIDC provider, routed by email domain. |
210+
| `/admin/enterprise` | What members may use, how Bot computers reach the network, and what is recorded about it. |
174211
| `/admin/audit` | Review permitted, refused, and failed actions. |
175212

176213
## Features
@@ -184,15 +221,15 @@ Leave `EMBEDDED_POSTGRES` off and set `DATABASE_URL` to point at a database you
184221
- **Secrets never enter the transcript**: the trail records that a secret was requested and how long it was, not what it said.
185222
- **Bring your own agent**: any AG-UI endpoint is a Bot, on a framework or hand-written. Endpoints are validated with the same target checks used for browser navigation, and an auth header is stored write-only.
186223
- **Components instead of prose**: compiled React components live in `app/src/components/gallery/`, sandboxed ones are authored in `/admin/playground` and published with no deployment. Every call asks the server whether the component exists, is published, and is not withheld from that Bot. Data functions are granted per component.
187-
- **Governed MCP**: Google Drive and Notion ship in the catalogue, and Composio brokers a few hundred more apps behind one account, each reached as the person asking. The catalogue carries only vendors this deployment stands behind, so adding one is a review of that vendor. Custom servers must pass URL checks; unknown tools and custom-server tools are treated as writes, and a catalogue tool the server advertises but does not name as a write classifies as a read. A Bot is told which connectors exist here and which it holds, so it says it has not been granted one rather than browsing to the vendor's website.
224+
- **Governed MCP**: Google Drive, Notion and [Parallel Search](docs/parallel-research.md) ship in the catalogue, and Composio brokers a few hundred more apps behind one account, each reached as the person asking. The catalogue carries only vendors this deployment stands behind, so adding one is a review of that vendor. Custom servers must pass URL checks; unknown tools and custom-server tools are treated as writes, and a catalogue tool the server advertises but does not name as a write classifies as a read. A Bot is told which connectors exist here and which it holds, so it says it has not been granted one rather than browsing to the vendor's website.
188225
- **Skills are instructions, not capabilities**: personal skills attach only to Bots their author owns, deployment skills are admin-owned, and both are invoked with `/` in the composer. A Bot granted the shipped `skill-creator` skill can write one with you in the conversation, and saves it only when you press the button on the card.
189226
- **Sign in with what your company already has**: Google, Microsoft or Okta from the environment, or a company's own SAML or OpenID Connect provider registered while the deployment runs and routed by email domain. Any one turns sign-in on; several may be configured at once.
190227
- **Decide who gets in**: `/admin/people` lists everybody who has signed in, promotes and demotes them, and removes access, which ends the session they are using and stops the next sign-in. Every change is on the audit trail.
191228
- **An audit trail you can read**: `/admin/audit` lists what was permitted, what was refused and what failed, and every refusal carries the rule that caused it.
192229
- **Credentials encrypted at rest**: stored through `/admin/credentials`, never returned by an API, and redacted from audit events.
193230
- **Loopback by default**: computers bind to `127.0.0.1` and require a per-container token, so nothing reaches a logged-in browser by knowing its port. The supervisor binds there too, because it holds the Docker socket and its token is a shared secret rather than a network boundary.
194231
- **Durable threads and memory**: conversations survive restarts through CopilotKit Intelligence, and each deployment stamps the threads it owns.
195-
- **Routines**: ask a Bot to do something on a schedule and it does, running as you, in the channel you asked in. A 15-minute floor and a cap of 20 enabled routines keep a sentence from scheduling more than a person meant, and ten failures in a row switch a routine off rather than burn model spend forever. Needs a worker process; see [docs/routines.md](docs/routines.md).
232+
- **Routines**: ask a Bot to do something on a schedule and it does, running as you, in the channel you asked in. A 15-minute floor and a cap of 20 enabled routines keep a sentence from scheduling more than a person meant, and ten failures in a row switch a routine off rather than burn model spend forever. Needs a worker process, which `scripts/start.sh` starts locally; see [docs/routines.md](docs/routines.md).
196233

197234
## Bring your own agent
198235

@@ -270,6 +307,7 @@ Full reference: [docs/configuration.md](docs/configuration.md).
270307
| `agent-bot` | 4200 | Proof-of-concept AG-UI Bot. |
271308
| `agent-langgraph` | 4201 | LangGraph AG-UI Bot. |
272309
| `supervisor` | 4500 host / 4300 container | Creates and manages one computer per Bot. |
310+
| `worker` | none | Fires due routines by handing each run to the server. |
273311
| PostgreSQL with pgvector | 5432 | Product data, policy, audit, credentials, grants, channels, and component metadata. |
274312
| CopilotKit Intelligence | external | Durable threads and memory. |
275313

@@ -321,16 +359,17 @@ A company's own SAML or OpenID Connect provider is registered while the deployme
321359
Admin → Identity providers, and routed by email domain. An OIDC registration needs every host in the
322360
provider's discovery document listed in `TRUSTED_ORIGINS`, not only the issuer.
323361

324-
- `INITIAL_ADMIN_EMAILS` is required, because nothing else grants the administrator role and no
325-
screen can promote somebody afterwards. It is re-read on every sign-in, so editing it takes effect
362+
- `INITIAL_ADMIN_EMAILS` is required, because it is what grants the first administrator. After that
363+
`/admin/people` can promote others, but an address named here stays an administrator and cannot be
364+
demoted or removed from that screen. It is re-read on every sign-in, so editing it takes effect
326365
the next time that person signs in.
327366
- `MICROSOFT_OAUTH_TENANT_ID` defaults to `common`, which admits personal Microsoft accounts as well
328367
as work ones. On a multi-tenant app registration Entra may send no `email` claim at all, so
329368
OpenBot falls back to `upn` and then `preferred_username`. If none of the three arrives the
330369
sign-in is refused and the reason is logged: add `email` as an optional claim, or use your
331370
directory GUID here.
332371
- A half-configured provider is refused at start-up rather than at somebody's first attempt to sign
333-
in: a client id with no secret, a secret shorter than 32 characters, or an Okta issuer with no
372+
in: a client id with no secret, a `BETTER_AUTH_SECRET` shorter than 32 characters, or an Okta issuer with no
334373
credentials behind it.
335374
- **SAML and OIDC** are registered while the deployment runs rather than configured here. Sign in as
336375
an administrator and go to Admin → Identity providers with the metadata your identity team gave
@@ -393,7 +432,10 @@ Use `bash scripts/start.sh` for the whole stack and `bash scripts/stop.sh` to ta
393432
- [docs/configuration.md](docs/configuration.md)
394433
- [docs/development.md](docs/development.md)
395434
- [docs/coworkers.md](docs/coworkers.md)
435+
- [docs/routines.md](docs/routines.md)
436+
- [docs/automatic-learning.md](docs/automatic-learning.md)
396437
- [docs/deployment.md](docs/deployment.md)
438+
- [charts/openbot/README.md](charts/openbot/README.md): the Helm chart
397439
- [docs/releasing.md](docs/releasing.md)
398440
- [docs/parallel-research.md](docs/parallel-research.md): public-web search and extraction through Parallel
399441

0 commit comments

Comments
 (0)