@open-everywhere/create 0.2.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -11
- package/bin/create-open-everywhere.js +4 -0
- package/package.json +3 -3
- package/src/cli.ts +37 -4
- package/src/deploy-status.ts +84 -0
- package/src/engine.ts +4 -3
- package/src/env-file.ts +11 -9
- package/src/scaffold.ts +21 -0
- package/src/steps/database.ts +4 -3
- package/src/steps/env-checklist.ts +28 -9
- package/src/steps/slack.ts +11 -2
- package/template/.env.example +10 -1
- package/template/AGENTS.md +17 -3
- package/template/README.md +22 -7
- package/template/agent/access/access-requests.ts +7 -2
- package/template/agent/access/browser-hosts.ts +3 -2
- package/template/agent/access/bundles.ts +7 -0
- package/template/agent/access/connector-credentials.ts +6 -0
- package/template/agent/access/mcp-servers.ts +48 -0
- package/template/agent/access/pre-approval-rules.ts +27 -11
- package/template/agent/lib/register-config.ts +0 -10
- package/template/agent/memory/config/domains/index.ts +15 -0
- package/template/agent/memory/config/domains/org.ts +18 -4
- package/template/agent/memory/config/domains.ts +8 -5
- package/template/agent/model/models.ts +6 -4
- package/template/agent/model/stacks.ts +2 -2
- package/template/agent/sandbox/backend-select.ts +2 -1
- package/template/agent/sandbox/sandbox.ts +41 -30
- package/template/agent/settings/settings.ts +17 -2
- package/template/claude/skills/quickstart-open-everywhere/SKILL.md +115 -22
- package/template/claude/skills/upgrade-open-everywhere/SKILL.md +29 -13
- package/template/scripts/goldens/roster-plan.txt +156 -0
- package/template/agent/blob/hosting.ts +0 -42
|
@@ -22,9 +22,13 @@ that repository ships no `env:pipe` script. Everything else is the same.
|
|
|
22
22
|
- The ops MCP tools check and scaffold. **You** run install, build and deploy commands in the
|
|
23
23
|
user's shell: show the command, get a yes, then run it. Never run a deploy, create a cloud
|
|
24
24
|
resource, or write a secret without explicit confirmation.
|
|
25
|
-
- **Never ask the user to paste a secret into the chat, and never echo or
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
- **Never ask the user to paste a secret into the chat, never pass one to a tool, and never echo or
|
|
26
|
+
commit one.** A tool call is part of your transcript. The user types each secret into their OWN
|
|
27
|
+
terminal with `npx oe env set <NAME>`: it reads the value from a hidden prompt and writes it to the
|
|
28
|
+
gitignored `.env.local`. You only ever handle the NAME: `scaffold_env { secretNames: [...] }`
|
|
29
|
+
returns the command per name and whether the file holds a value yet. `scaffold_env { values }`
|
|
30
|
+
takes non-secret config only, and its schema refuses a secret name. Mint the credential-store key
|
|
31
|
+
with `scaffold_credential_key`, which never prints it.
|
|
28
32
|
- **Never propose a local run as a setup step.** `npm run dev` is the development loop AFTER the
|
|
29
33
|
deploy. A local run has no public HTTPS URL for Slack to reach and keeps its state in a different
|
|
30
34
|
store, so it proves little about the deployment. See "Develop locally" below.
|
|
@@ -32,9 +36,17 @@ that repository ships no `env:pipe` script. Everything else is the same.
|
|
|
32
36
|
`OE_CREDENTIAL_ENCRYPTION_KEY`, `SLACK_BOT_TOKEN`, `SLACK_SIGNING_SECRET` and
|
|
33
37
|
`GITHUB_WEBHOOK_SECRET` from its **environment**: the Slack bundle and the GitHub webhook check
|
|
34
38
|
never read the credential store. So these go in `.env.local`, and then into the deployment's own
|
|
35
|
-
environment. `secret_set` is for a credential whose `broker` is `"db"` (and
|
|
36
|
-
`NOTION_WEBHOOK_SECRET`)
|
|
37
|
-
|
|
39
|
+
environment. `secret_set { names: [...] }` is for a credential whose `broker` is `"db"` (and
|
|
40
|
+
`NOTION_WEBHOOK_SECRET`): it moves each named value from `.env.local` into the store, so the user
|
|
41
|
+
runs `npx oe env set <NAME>` first. It needs `DATABASE_URL` and the key in `.env.local` too.
|
|
42
|
+
Nothing reads a stored secret back out (`secret_list` returns names only).
|
|
43
|
+
- **If an ops tool answers "the app now runs @open-everywhere/core X; this ops server runs Y"**, the
|
|
44
|
+
server predates an upgrade. Ask the user to restart it (`/mcp`, then reconnect
|
|
45
|
+
`open-everywhere-ops`) and call again. Never work around it: a stale server serves old code. A
|
|
46
|
+
server whose core predates this check cannot refuse: after an upgrade, an input-validation error
|
|
47
|
+
that names `values` or `secrets`, a `scaffold_env` reply with no `secrets` list for the
|
|
48
|
+
`secretNames` you sent, or "Tool … not found", means the same thing. Restart it. Never fall back
|
|
49
|
+
to passing a value.
|
|
38
50
|
- Every command runs from the app root.
|
|
39
51
|
|
|
40
52
|
## Step 1 — ask which route
|
|
@@ -53,11 +65,26 @@ that repository ships no `env:pipe` script. Everything else is the same.
|
|
|
53
65
|
Nothing beyond these two is supported. For any other host, read the contract and follow the Docker
|
|
54
66
|
route; do not invent a recipe.
|
|
55
67
|
|
|
68
|
+
## Tell the user about telemetry, before the first deploy
|
|
69
|
+
|
|
70
|
+
**The deployed app sends anonymous usage telemetry, and it is ON by default.** Tell the user that
|
|
71
|
+
before the first deploy, and ask whether they want it. Do not decide for them. It sends event names,
|
|
72
|
+
enums, coarse buckets, public model ids and the app version, with a random per-install id
|
|
73
|
+
(`service.instance.id`). It never sends message or memory content, org names, workspace, channel,
|
|
74
|
+
user or session ids, or env values. The full list
|
|
75
|
+
of events is `https://github.com/open-everywhere/open-everywhere/blob/main/docs/deploy/telemetry.md`.
|
|
76
|
+
|
|
77
|
+
To turn it off, `OE_TELEMETRY=off` (or `DO_NOT_TRACK=1`) must be set on the DEPLOYMENT: a value in
|
|
78
|
+
`.env.local` reaches only a local run. On the Vercel route, at step 9:
|
|
79
|
+
`printf off | npx vercel env add OE_TELEMETRY production`. On the Docker route, put it in the
|
|
80
|
+
container's environment. Every boot prints a line that says whether telemetry is on.
|
|
81
|
+
|
|
56
82
|
## Status, at every step
|
|
57
83
|
|
|
58
84
|
- `npx @open-everywhere/create --check --json` — the step list as data: `satisfied`, `detail`, and a
|
|
59
85
|
`next` command per unsatisfied step. It changes nothing. Pass `--route docker` on the Docker
|
|
60
|
-
route, and `--host https://<host>` once a deployment exists
|
|
86
|
+
route, and `--host https://<host>` once a deployment exists: the env step then also reads the
|
|
87
|
+
deployment's own verdicts from its public status route. In a clone of the repository, run
|
|
61
88
|
`node packages/create/bin/create-open-everywhere.js --check --json` instead.
|
|
62
89
|
- The `preflight` tool — the env verdict per name. Pass `target: "vercel"` or `target: "docker"`.
|
|
63
90
|
|
|
@@ -74,29 +101,43 @@ tool. The same step list, written for a human, is
|
|
|
74
101
|
3. **Database.** `npx vercel install neon` provisions a Neon database and connects it to the linked
|
|
75
102
|
project, which sets `DATABASE_URL` there. (`vercel install` is an alias of
|
|
76
103
|
`vercel integration add`; the Marketplace slug is `neon`.) The dashboard path — project →
|
|
77
|
-
**Storage → Neon → Connect** — does the same thing.
|
|
104
|
+
**Storage → Neon → Connect** — does the same thing. The integration can also enable **Neon
|
|
105
|
+
Auth** (`NEON_AUTH_BASE_URL`, `VITE_NEON_AUTH_URL`). Open Everywhere does not use it: leave it
|
|
106
|
+
off, or ignore those two variables. Then get the same value into `.env.local`
|
|
78
107
|
for the operator tools, either with `npx vercel env pull` (it writes the project's environment
|
|
79
108
|
into `.env.local`, overwriting it, so pull before you add anything local) or by asking the user
|
|
80
|
-
|
|
109
|
+
to run `npx oe env set DATABASE_URL` and paste the connection string at its prompt. **That one value is the whole
|
|
81
110
|
step:** it resolves both the operational store and the memory backing to postgres on its own, so
|
|
82
111
|
set no provider selector. A selector pointing AWAY from postgres is the only thing that breaks
|
|
83
112
|
it.
|
|
84
113
|
4. **Key.** `scaffold_credential_key`.
|
|
85
114
|
5. **Slack app.** Call `surface_manifest { surface: "slack" }` and hand the user the manifest and
|
|
86
115
|
the steps it returns. Before the first deploy the manifest keeps `YOUR-DEPLOY-URL`. The user
|
|
87
|
-
creates and installs the app, then
|
|
88
|
-
|
|
116
|
+
creates and installs the app, then runs `npx oe env set SLACK_BOT_TOKEN` and
|
|
117
|
+
`npx oe env set SLACK_SIGNING_SECRET` in their own terminal. Confirm with
|
|
118
|
+
`scaffold_env { secretNames: ["SLACK_BOT_TOKEN", "SLACK_SIGNING_SECRET"] }`: both read `present: true`.
|
|
119
|
+
**App icon.** With no `identity.name` set, the agent presents as the project, so its default
|
|
120
|
+
avatar is the project mark. Unless the user set `identity.name` and chose their own icon, tell
|
|
121
|
+
them to upload
|
|
122
|
+
`https://raw.githubusercontent.com/open-everywhere/open-everywhere/main/brand/png/mark-square-1024.png`
|
|
123
|
+
under **Basic Information → Display Information → App icon**. The manifest has no icon field.
|
|
124
|
+
The same file is the icon for a Discord application, a GitHub App, and a Notion or Linear
|
|
125
|
+
integration. For Teams, the package icons are the mark:
|
|
126
|
+
`https://raw.githubusercontent.com/open-everywhere/open-everywhere/main/teams-app/color.png` and
|
|
127
|
+
`https://raw.githubusercontent.com/open-everywhere/open-everywhere/main/teams-app/outline.png`.
|
|
89
128
|
6. **Vouch the workspace.** Ask for the team id (`T…`: the segment after `/client/` in the
|
|
90
129
|
workspace URL at app.slack.com). In `agent/identity/surfaces.ts` add
|
|
91
130
|
`defineSurface({ key: "slack/<team-id>", trust: "internal" })`.
|
|
92
131
|
7. **Admin.** Ask for the user's member id (`U…`: Slack profile → ⋮ More → Copy member ID). In
|
|
93
132
|
`agent/memory/config/domains/org.ts` set `admins: ["slack/<team-id>/<member-id>"]`. Offer to
|
|
94
133
|
commit both edits. They take effect on the next deploy, so make them before it.
|
|
134
|
+
Then OFFER the optional window step below. Do not make it for the user unasked.
|
|
95
135
|
8. **Build.** `npm run build`. It must pass.
|
|
96
136
|
9. **Deployment env.** `.env.local` never ships, so the deployment reads only what you set ON it.
|
|
97
137
|
The names are `OE_CREDENTIAL_ENCRYPTION_KEY`, `SLACK_BOT_TOKEN` and `SLACK_SIGNING_SECRET`. The
|
|
98
138
|
Neon integration already set `DATABASE_URL` there, and that one value resolves both stores — so
|
|
99
|
-
there is no `OE_OPERATIONAL_PROVIDER` or `OE_MEMORY_PROVIDER` to push.
|
|
139
|
+
there is no `OE_OPERATIONAL_PROVIDER` or `OE_MEMORY_PROVIDER` to push. Add `OE_TELEMETRY` (value
|
|
140
|
+
`off`) only when the user chose to turn telemetry off (see the telemetry section above).
|
|
100
141
|
Confirm each command first, and **never let a value reach your own output.**
|
|
101
142
|
- **In a scaffolded app:** `npm run -s env:pipe -- <NAME> | npx vercel env add <NAME> production`.
|
|
102
143
|
Always pipe `env:pipe` straight into `vercel env add`, as written. Never run it bare: your
|
|
@@ -127,11 +168,12 @@ public HTTPS URL, Postgres, a sandbox backend, egress control, a model route, an
|
|
|
127
168
|
Then:
|
|
128
169
|
|
|
129
170
|
1. **Install and build.** `npm install`, then `npm run build`.
|
|
130
|
-
2. **Postgres.** Provision one the container can reach
|
|
131
|
-
one value resolves both stores to postgres;
|
|
171
|
+
2. **Postgres.** Provision one the container can reach. The user runs `npx oe env set DATABASE_URL`
|
|
172
|
+
and pastes its connection string at the prompt. That one value resolves both stores to postgres;
|
|
173
|
+
set no provider selector.
|
|
132
174
|
3. **Key.** `scaffold_credential_key`.
|
|
133
175
|
4. **Model route.** There is no OIDC off Vercel, so the user supplies `AI_GATEWAY_API_KEY` (Vercel
|
|
134
|
-
→ AI Gateway → API Keys issues one for any host)
|
|
176
|
+
→ AI Gateway → API Keys issues one for any host) with `npx oe env set AI_GATEWAY_API_KEY`. Running a different model backend instead is
|
|
135
177
|
an **adapter swap in app code**
|
|
136
178
|
(`https://github.com/open-everywhere/open-everywhere/blob/main/docs/extending/adapter-model.md`),
|
|
137
179
|
which `--check` cannot see: that step stays `missing` on the Docker route either way, so read it
|
|
@@ -145,11 +187,57 @@ Then:
|
|
|
145
187
|
7. **Prove it, then the Slack URLs and the hello.** As steps 11–13 of the Vercel route, with
|
|
146
188
|
`--route docker --host https://<host>`.
|
|
147
189
|
|
|
190
|
+
## Optional: one cross-surface window
|
|
191
|
+
|
|
192
|
+
Offer this step once, after the admin step. Skip it when the user declines. Every channel the bot
|
|
193
|
+
is in already has its own standing seat, because `window.topology` ships on. The `org` catch-all
|
|
194
|
+
always stays solo: the boot refuses `mode` on it, because the whole org is never one window.
|
|
195
|
+
|
|
196
|
+
A cross-surface window lets a few rooms share ONE conversation and one brain. To make one:
|
|
197
|
+
|
|
198
|
+
1. Ask for the window's **name** (for example `team`) and its **reach**: the exact surface keys of
|
|
199
|
+
the rooms that share it, such as `slack/<team-id>/<channel-id>` or `github/<owner>/<repo>`.
|
|
200
|
+
2. Say the cost plainly: each room's seat sees what the other rooms said, so the window is a wider
|
|
201
|
+
data blast radius than a solo seat.
|
|
202
|
+
3. Write `agent/memory/config/domains/<name>.ts`:
|
|
203
|
+
`export const domain = defineDomain({ name: "<name>", reach: [ … ], memory: "org-brain", mode: "unified" });`
|
|
204
|
+
Then add `import * as <name> from "./<name>.js";` and `<name>` to `MODULES` in
|
|
205
|
+
`agent/memory/config/domains/index.ts`. Declare ONE such domain, not one per room.
|
|
206
|
+
4. Every member outside Slack must be declared internal in `agent/identity/surfaces.ts`, or the
|
|
207
|
+
boot refuses the window at config load.
|
|
208
|
+
|
|
209
|
+
## Optional: add an MCP server
|
|
210
|
+
|
|
211
|
+
Offer this step when the user names a tool their team uses that has a hosted MCP server (for
|
|
212
|
+
example FullStory). An admin declares the server, and the declaration lands by pull request: a
|
|
213
|
+
person in chat cannot add one.
|
|
214
|
+
|
|
215
|
+
1. Ask for the server's **name** (lowercase, for example `fullstory`), its **URL** from the
|
|
216
|
+
vendor's own MCP documentation, and one line that says what it is for.
|
|
217
|
+
2. Add one entry to `MCP_SERVERS` in `agent/access/mcp-servers.ts`:
|
|
218
|
+
`{ name: "fullstory", url: "https://<the vendor's MCP endpoint>", description: "…" }`.
|
|
219
|
+
The default sign-in is MCP OAuth discovery with dynamic client registration, so the entry
|
|
220
|
+
needs no client id and no secret. Only a vendor WITHOUT dynamic registration takes a
|
|
221
|
+
`signIn: { mode: "static-confidential", … }` block, and that block names the secret's
|
|
222
|
+
credential-store REF (`clientSecretRef`), never the value.
|
|
223
|
+
3. Run `npx oe build`. Commit `agent/access/mcp-servers.ts` and the updated
|
|
224
|
+
`scripts/goldens/roster-plan.txt`, then open the pull request.
|
|
225
|
+
4. Say what the user gets. In a DM, each person uses the server as THEMSELVES: their first call
|
|
226
|
+
posts a "Connect my account" card, and they sign in with their own account once. A channel
|
|
227
|
+
gets nothing until an admin grants the server's `workspace-oauth` credential (the org's own
|
|
228
|
+
account) on a bundle in `agent/access/bundles.ts`.
|
|
229
|
+
5. Say who "each person" is: every account that can DM the agent, an external one included (a
|
|
230
|
+
Slack Connect user, a Discord user who shares a server with the bot). If external people can
|
|
231
|
+
DM the agent, offer to narrow the entry with `people: { groups: ["<group>"] }`.
|
|
232
|
+
|
|
233
|
+
With no server declared, nothing changes: the build writes no connection for one, and only the
|
|
234
|
+
shipped connections (Notion) stay mounted.
|
|
235
|
+
|
|
148
236
|
## Develop locally
|
|
149
237
|
|
|
150
|
-
Only when the user asks to change or debug the agent — never as a setup step.
|
|
151
|
-
`AI_GATEWAY_API_KEY`
|
|
152
|
-
then `npm run dev`. A local run keeps its state in an embedded database under
|
|
238
|
+
Only when the user asks to change or debug the agent — never as a setup step. The user creates
|
|
239
|
+
`AI_GATEWAY_API_KEY` (Vercel → AI Gateway → API Keys) and writes it with
|
|
240
|
+
`npx oe env set AI_GATEWAY_API_KEY`, then `npm run dev`. A local run keeps its state in an embedded database under
|
|
153
241
|
`.open-everywhere-data/`, and Slack cannot reach it without a public tunnel.
|
|
154
242
|
|
|
155
243
|
## Notes
|
|
@@ -161,7 +249,12 @@ then `npm run dev`. A local run keeps its state in an embedded database under
|
|
|
161
249
|
- The deployment's own identity (`deploymentIdentity`) is code in `agent/identity/surfaces.ts`, not
|
|
162
250
|
env.
|
|
163
251
|
- `@open-everywhere/create` has no interactive wizard and sends no telemetry. It scaffolds
|
|
164
|
-
(`npx @open-everywhere/create <dir>`) and reports status (`--check`). Nothing else.
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
252
|
+
(`npx @open-everywhere/create <dir>`) and reports status (`--check`). Nothing else. The deployed
|
|
253
|
+
app is a different matter: its telemetry is on by default (see the telemetry section above).
|
|
254
|
+
- 🔴 **Without `--host`, `--check` reads `.env.local` and your shell, never the deployment's own
|
|
255
|
+
environment.** With `--host`, the env step also reads the deployment's status route, which reports
|
|
256
|
+
`DATABASE_URL` and the credential key (its `secrets` row), the store selection and the model route.
|
|
257
|
+
The env step does not judge the Slack secrets, so even a "9/9 satisfied" is not proof that the
|
|
258
|
+
deployment holds `SLACK_BOT_TOKEN` and `SLACK_SIGNING_SECRET`. The same status document's
|
|
259
|
+
`surfaces.slack.credentials` reports whether both are present: read it with
|
|
260
|
+
`curl -s https://<host>/eve/v1/oe/status`. Slack's **Verified** is what proves the signing secret.
|
|
@@ -66,7 +66,8 @@ Those are decisions, not steps.
|
|
|
66
66
|
|
|
67
67
|
`--plan` also prints a **template drift** report. It compares every file the scaffold copied into
|
|
68
68
|
this app with the TARGET release's `@open-everywhere/create` template, and lists each one that
|
|
69
|
-
differs, with a one-line size of its diff. An upgrade changes only `package.json
|
|
69
|
+
differs, with a one-line size of its diff. An upgrade changes only `package.json` and
|
|
70
|
+
`package-lock.json`, so a scaffolded
|
|
70
71
|
file stays as the old template wrote it. A stale copy can typecheck and build and still break the
|
|
71
72
|
deployment: the 0.1.2 `agent/lib/register-adapters.ts` registers no Postgres client on a bare
|
|
72
73
|
`DATABASE_URL`, so a Vercel+Neon deployment of 0.1.4 fails at its first write.
|
|
@@ -82,6 +83,14 @@ the adapters by hand to the one-call copy: move any adapter the user registered
|
|
|
82
83
|
| --- | --- |
|
|
83
84
|
| SYNC | a template-owned file — wiring, a script, `AGENTS.md`, `README.md`, `.env.example`, a skill. Plan to copy the target's file over this one, after you read the diff. |
|
|
84
85
|
| config | the app's own config-as-code. A difference is normal once the app is configured. Merge the template's change by hand only if the user wants it. |
|
|
86
|
+
| DELETE | a release up to the target removed this file from the template, and the app still has it. Plan to delete it. eve 0.69 and later refuse `agent/instrumentation.ts` at build. |
|
|
87
|
+
| app-owned | `.oe-template-ignore` names the file, so the app owns it. Nothing to do. |
|
|
88
|
+
|
|
89
|
+
`.oe-template-ignore` at the app root lists the template files the app removed or owns on purpose:
|
|
90
|
+
one app-relative path per line, a trailing `/` for a directory, `#` for a comment. The report prints
|
|
91
|
+
nothing for an ignored file the app does not have, and one `app-owned` line for one it has. Add a
|
|
92
|
+
path only when the user says the app owns that file. Never add one to silence a SYNC line you have
|
|
93
|
+
not read.
|
|
85
94
|
|
|
86
95
|
The report never writes a file. If it says the drift check did not run, compare the files with the
|
|
87
96
|
target's template by hand. An installed core without the report prints none: `oe upgrade` runs the
|
|
@@ -99,7 +108,11 @@ In order, and it stops at the first step that fails:
|
|
|
99
108
|
1. bump every `@open-everywhere/*` package to the target, renaming a dependency on the retired
|
|
100
109
|
unscoped `create-open-everywhere` to `@open-everywhere/create` as it goes;
|
|
101
110
|
2. pin `eve` to the version the target core declares as its peer;
|
|
102
|
-
3. `npm install` — its `postinstall` runs `oe-eve-patch`, which the app refuses to boot without
|
|
111
|
+
3. `npm install` — its `postinstall` runs `oe-eve-patch`, which the app refuses to boot without.
|
|
112
|
+
Before it, the run drops the `package-lock.json` entries of `eve`, of every
|
|
113
|
+
`@open-everywhere/*` package and of every package that peers on one of them, so npm resolves
|
|
114
|
+
that set again. If the install still stops with ERESOLVE (a core at 0.2.1 or earlier does not
|
|
115
|
+
drop them), run `rm package-lock.json && npm install`, then run `oe upgrade` again;
|
|
103
116
|
4. run the config codemods the target's notes name, and print the migrations that are yours;
|
|
104
117
|
5. `oe build --accept` — this rewrites `roster.lock.json`;
|
|
105
118
|
6. `npm run typecheck`;
|
|
@@ -136,7 +149,7 @@ codemod. Do not delete the marker to get past this refusal.
|
|
|
136
149
|
|
|
137
150
|
```
|
|
138
151
|
git diff roster.lock.json
|
|
139
|
-
git diff package.json
|
|
152
|
+
git diff package.json package-lock.json
|
|
140
153
|
git status
|
|
141
154
|
```
|
|
142
155
|
|
|
@@ -149,7 +162,8 @@ Then run the app's own checks once more if anything above was fixed by hand:
|
|
|
149
162
|
|
|
150
163
|
Then act on the template drift report. A core that carries it prints it again after the install;
|
|
151
164
|
if this run printed no "Template drift" heading, run `npx oe upgrade --to <target> --plan` now to get it. For
|
|
152
|
-
each
|
|
165
|
+
each DELETE line, delete the file. If the user says the app owns it, keep it and name it in
|
|
166
|
+
`.oe-template-ignore`. For each SYNC line, read the diff against the installed template, for example
|
|
153
167
|
`diff node_modules/@open-everywhere/create/template/agent/lib/register-adapters.ts agent/lib/register-adapters.ts`.
|
|
154
168
|
Keep any edit the user made on purpose, and copy the template's file otherwise. For
|
|
155
169
|
`agent/lib/register-adapters.ts`, the user's edits belong in the `customAdapters` hook of the
|
|
@@ -171,7 +185,7 @@ Commit on a branch, never on the default branch. The body carries:
|
|
|
171
185
|
- what changed in `roster.lock.json`, in your own words;
|
|
172
186
|
- **the env names the deployment needs before this merges**, names only;
|
|
173
187
|
- the manual steps, and who does each one.
|
|
174
|
-
- the template files you synced, and each SYNC line you left as it is, with the reason.
|
|
188
|
+
- the template files you synced or deleted, and each SYNC or DELETE line you left as it is, with the reason.
|
|
175
189
|
|
|
176
190
|
Then stop. The admin reviews the lock diff and merges. The merge deploys.
|
|
177
191
|
|
|
@@ -179,21 +193,23 @@ Then stop. The admin reviews the lock diff and merges. The merge deploys.
|
|
|
179
193
|
|
|
180
194
|
A green build is not a working deployment.
|
|
181
195
|
|
|
182
|
-
**
|
|
183
|
-
JSON route that reports the deployment's version, whether the
|
|
184
|
-
|
|
185
|
-
answers, and the Slack posture.
|
|
186
|
-
|
|
187
|
-
|
|
196
|
+
**Read the status route, `GET /eve/v1/oe/status`.** It ships from core 0.1.4. It is an
|
|
197
|
+
unauthenticated, non-sensitive JSON route that reports the deployment's version, whether the
|
|
198
|
+
database is reachable, the sandbox backend, whether egress is enforced, whether the model route
|
|
199
|
+
answers, and the Slack posture. A deployment can hide it on purpose, with a roster exclusion or an
|
|
200
|
+
edge rule (`docs/deploy/contract.md` § Hiding the status route). A 404 or a 403 there can be that
|
|
201
|
+
choice, not a fault: ask the operator before you call it broken. Never read some other route as if
|
|
202
|
+
it were this one. When the route answers, report each field, in this order:
|
|
188
203
|
|
|
189
204
|
1. **version** — it reads the target. If it still reads the old version, the deploy has not
|
|
190
205
|
finished, or it failed. Nothing below is meaningful until this matches.
|
|
191
|
-
2. **database reachable
|
|
206
|
+
2. **database reachable** (the `postgres` verdict).
|
|
192
207
|
3. **sandbox backend**, and **egress enforced**.
|
|
193
208
|
4. **model route answers.**
|
|
194
209
|
5. **Slack** — credentials present, workspace installed, events verified.
|
|
195
210
|
|
|
196
|
-
**
|
|
211
|
+
**When the route does not answer**, on a core older than 0.1.4 or on a deployment that hides it,
|
|
212
|
+
confirm what you can and say plainly what you could not:
|
|
197
213
|
|
|
198
214
|
- the deploy finished, from the host's own deployment log;
|
|
199
215
|
- `npx @open-everywhere/create --check --json --host https://<host>` — its `build-deploy` step
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
agent/channels/aws-sso-callback.ts mounted @open-everywhere/core
|
|
2
|
+
agent/channels/control-mcp.ts mounted @open-everywhere/core
|
|
3
|
+
agent/channels/control-read.ts mounted @open-everywhere/core
|
|
4
|
+
agent/channels/credential-intake-page.ts mounted @open-everywhere/core
|
|
5
|
+
agent/channels/github.ts mounted @open-everywhere/provider-github
|
|
6
|
+
agent/channels/notion.ts mounted @open-everywhere/provider-notion
|
|
7
|
+
agent/channels/oe-oauth-callback.ts mounted @open-everywhere/core
|
|
8
|
+
agent/channels/oe-status.ts mounted @open-everywhere/core
|
|
9
|
+
agent/channels/policy-pages.ts mounted @open-everywhere/core
|
|
10
|
+
agent/channels/slack-commands.ts mounted @open-everywhere/provider-slack
|
|
11
|
+
agent/channels/slack-setup-page.ts mounted @open-everywhere/provider-slack
|
|
12
|
+
agent/channels/slack.ts mounted @open-everywhere/provider-slack
|
|
13
|
+
agent/channels/test-wake.ts mounted @open-everywhere/core
|
|
14
|
+
agent/channels/transcript-relay.ts mounted @open-everywhere/core
|
|
15
|
+
agent/channels/unified.ts mounted @open-everywhere/core
|
|
16
|
+
agent/channels/webhook-reveal-page.ts mounted @open-everywhere/core
|
|
17
|
+
agent/channels/webhooks.ts mounted @open-everywhere/core
|
|
18
|
+
agent/connections/notion.ts mounted @open-everywhere/core
|
|
19
|
+
agent/hooks/approval-raised.ts mounted @open-everywhere/core
|
|
20
|
+
agent/hooks/approval-settlement.ts mounted @open-everywhere/core
|
|
21
|
+
agent/hooks/binding-bridge.ts mounted @open-everywhere/core
|
|
22
|
+
agent/hooks/connector-audit.ts mounted @open-everywhere/core
|
|
23
|
+
agent/hooks/egress.ts mounted @open-everywhere/core
|
|
24
|
+
agent/hooks/eve-patch-gate.ts mounted @open-everywhere/core
|
|
25
|
+
agent/hooks/fire-carriage.ts mounted @open-everywhere/core
|
|
26
|
+
agent/hooks/fire-toolset.ts mounted @open-everywhere/core
|
|
27
|
+
agent/hooks/held-question.ts mounted @open-everywhere/core
|
|
28
|
+
agent/hooks/job-posture.ts mounted @open-everywhere/core
|
|
29
|
+
agent/hooks/lean-seat.ts mounted @open-everywhere/core
|
|
30
|
+
agent/hooks/learn.ts mounted @open-everywhere/core
|
|
31
|
+
agent/hooks/link-claim.ts mounted @open-everywhere/core
|
|
32
|
+
agent/hooks/log-flush.ts mounted @open-everywhere/core
|
|
33
|
+
agent/hooks/loop-breaker.ts mounted @open-everywhere/core
|
|
34
|
+
agent/hooks/memory.ts mounted @open-everywhere/core
|
|
35
|
+
agent/hooks/native-input-audit.ts mounted @open-everywhere/core
|
|
36
|
+
agent/hooks/own-account-ask.ts mounted @open-everywhere/core
|
|
37
|
+
agent/hooks/requester-identity.ts mounted @open-everywhere/core
|
|
38
|
+
agent/hooks/requester-messages.ts mounted @open-everywhere/core
|
|
39
|
+
agent/hooks/routine-outcome.ts mounted @open-everywhere/core
|
|
40
|
+
agent/hooks/routine-silence.ts mounted @open-everywhere/core
|
|
41
|
+
agent/hooks/sandbox-lifecycle.ts mounted @open-everywhere/adapters
|
|
42
|
+
agent/hooks/session-park.ts mounted @open-everywhere/core
|
|
43
|
+
agent/hooks/spawn-taint.ts mounted @open-everywhere/core
|
|
44
|
+
agent/hooks/spend.ts mounted @open-everywhere/core
|
|
45
|
+
agent/hooks/stall-guard.ts mounted @open-everywhere/core
|
|
46
|
+
agent/hooks/telemetry.ts mounted @open-everywhere/core
|
|
47
|
+
agent/hooks/turn-anchor.ts mounted @open-everywhere/core
|
|
48
|
+
agent/hooks/wake-accounting-turn.ts mounted @open-everywhere/core
|
|
49
|
+
agent/hooks/wake-turn-start.ts mounted @open-everywhere/core
|
|
50
|
+
agent/hooks/window-routing.ts mounted @open-everywhere/core
|
|
51
|
+
agent/lib/providers.generated.ts providers slack,notion,github
|
|
52
|
+
agent/schedules/directory-sync.ts mounted @open-everywhere/core
|
|
53
|
+
agent/schedules/dispatch.ts mounted @open-everywhere/core
|
|
54
|
+
agent/schedules/dream-mode3.ts mounted @open-everywhere/core
|
|
55
|
+
agent/schedules/notion-ingress.ts mounted @open-everywhere/provider-notion
|
|
56
|
+
agent/schedules/tidy.ts mounted @open-everywhere/core
|
|
57
|
+
agent/skills/scoped.ts mounted @open-everywhere/core
|
|
58
|
+
agent/tools/add_label.ts mounted @open-everywhere/core
|
|
59
|
+
agent/tools/add_routine_rule.ts mounted @open-everywhere/core
|
|
60
|
+
agent/tools/agent_version.ts mounted @open-everywhere/core
|
|
61
|
+
agent/tools/ask_question.ts mounted @open-everywhere/core
|
|
62
|
+
agent/tools/ask_room.ts mounted @open-everywhere/core
|
|
63
|
+
agent/tools/assign.ts mounted @open-everywhere/core
|
|
64
|
+
agent/tools/aws.ts mounted @open-everywhere/core
|
|
65
|
+
agent/tools/bash.ts framework-disabled
|
|
66
|
+
agent/tools/browser_tools.ts mounted @open-everywhere/core
|
|
67
|
+
agent/tools/cancel_routine.ts mounted @open-everywhere/core
|
|
68
|
+
agent/tools/cancel_work.ts mounted @open-everywhere/core
|
|
69
|
+
agent/tools/capture_events.ts mounted @open-everywhere/core
|
|
70
|
+
agent/tools/check_pr_status.ts mounted @open-everywhere/core
|
|
71
|
+
agent/tools/checkout_repo.ts mounted @open-everywhere/core
|
|
72
|
+
agent/tools/clear_connector_override.ts mounted @open-everywhere/core
|
|
73
|
+
agent/tools/clear_spend_limit.ts mounted @open-everywhere/core
|
|
74
|
+
agent/tools/complete_job.ts mounted @open-everywhere/core
|
|
75
|
+
agent/tools/complete_thread.ts mounted @open-everywhere/core
|
|
76
|
+
agent/tools/confirm_link.ts mounted @open-everywhere/core
|
|
77
|
+
agent/tools/connector.ts mounted @open-everywhere/core
|
|
78
|
+
agent/tools/create_agent.ts mounted @open-everywhere/core
|
|
79
|
+
agent/tools/create_routine.ts mounted @open-everywhere/core
|
|
80
|
+
agent/tools/create_skill.ts mounted @open-everywhere/core
|
|
81
|
+
agent/tools/create_ticket.ts mounted @open-everywhere/core
|
|
82
|
+
agent/tools/declare_webhook.ts mounted @open-everywhere/core
|
|
83
|
+
agent/tools/delete_skill.ts mounted @open-everywhere/core
|
|
84
|
+
agent/tools/describe_image.ts mounted @open-everywhere/core
|
|
85
|
+
agent/tools/dm_person.ts mounted @open-everywhere/core
|
|
86
|
+
agent/tools/edit_reply.ts mounted @open-everywhere/core
|
|
87
|
+
agent/tools/edit_routine.ts mounted @open-everywhere/core
|
|
88
|
+
agent/tools/enable_routine.ts mounted @open-everywhere/core
|
|
89
|
+
agent/tools/explain_permission.ts mounted @open-everywhere/core
|
|
90
|
+
agent/tools/extend_workspace_time.ts mounted @open-everywhere/adapters
|
|
91
|
+
agent/tools/get_pr_feedback.ts mounted @open-everywhere/core
|
|
92
|
+
agent/tools/grant_tools.ts mounted @open-everywhere/core
|
|
93
|
+
agent/tools/halt.ts mounted @open-everywhere/core
|
|
94
|
+
agent/tools/link_identity.ts mounted @open-everywhere/core
|
|
95
|
+
agent/tools/list_recent_events.ts mounted @open-everywhere/core
|
|
96
|
+
agent/tools/list_repos.ts mounted @open-everywhere/core
|
|
97
|
+
agent/tools/list_routines.ts mounted @open-everywhere/core
|
|
98
|
+
agent/tools/list_skills.ts mounted @open-everywhere/core
|
|
99
|
+
agent/tools/list_webhooks.ts mounted @open-everywhere/core
|
|
100
|
+
agent/tools/memory_admin_list.ts mounted @open-everywhere/core
|
|
101
|
+
agent/tools/memory_admin_read.ts mounted @open-everywhere/core
|
|
102
|
+
agent/tools/message_thread_seat.ts mounted @open-everywhere/core
|
|
103
|
+
agent/tools/no_reply.ts mounted @open-everywhere/core
|
|
104
|
+
agent/tools/notion_search.ts mounted @open-everywhere/provider-notion
|
|
105
|
+
agent/tools/open_pull_request.ts mounted @open-everywhere/core
|
|
106
|
+
agent/tools/permission_fit_report.ts mounted @open-everywhere/core
|
|
107
|
+
agent/tools/post_file.ts mounted @open-everywhere/core
|
|
108
|
+
agent/tools/post_message.ts mounted @open-everywhere/core
|
|
109
|
+
agent/tools/post_pr_walkthrough.ts mounted @open-everywhere/core
|
|
110
|
+
agent/tools/purge_memory.ts mounted @open-everywhere/core
|
|
111
|
+
agent/tools/query_analytics.ts mounted @open-everywhere/core
|
|
112
|
+
agent/tools/react.ts mounted @open-everywhere/core
|
|
113
|
+
agent/tools/read_channel.ts mounted @open-everywhere/core
|
|
114
|
+
agent/tools/read_docs.ts mounted @open-everywhere/core
|
|
115
|
+
agent/tools/read_file_upload.ts mounted @open-everywhere/core
|
|
116
|
+
agent/tools/read_file.ts framework-disabled
|
|
117
|
+
agent/tools/read_github_issue.ts mounted @open-everywhere/core
|
|
118
|
+
agent/tools/read_notion_comments.ts mounted @open-everywhere/provider-notion
|
|
119
|
+
agent/tools/read_notion_page.ts mounted @open-everywhere/provider-notion
|
|
120
|
+
agent/tools/read_routine_transcript.ts mounted @open-everywhere/core
|
|
121
|
+
agent/tools/read_thread_seat.ts mounted @open-everywhere/core
|
|
122
|
+
agent/tools/read_thread.ts mounted @open-everywhere/core
|
|
123
|
+
agent/tools/read_webhook_history.ts mounted @open-everywhere/core
|
|
124
|
+
agent/tools/read_work_channel.ts mounted @open-everywhere/core
|
|
125
|
+
agent/tools/read_work_thread.ts mounted @open-everywhere/core
|
|
126
|
+
agent/tools/record_follow_up.ts mounted @open-everywhere/core
|
|
127
|
+
agent/tools/record_job_state.ts mounted @open-everywhere/core
|
|
128
|
+
agent/tools/record_watch_state.ts mounted @open-everywhere/core
|
|
129
|
+
agent/tools/remove_routine_rule.ts mounted @open-everywhere/core
|
|
130
|
+
agent/tools/reply.ts mounted @open-everywhere/core
|
|
131
|
+
agent/tools/report_run_failed.ts mounted @open-everywhere/core
|
|
132
|
+
agent/tools/request_access.ts mounted @open-everywhere/core
|
|
133
|
+
agent/tools/request_credential_grant.ts mounted @open-everywhere/core
|
|
134
|
+
agent/tools/resume.ts mounted @open-everywhere/core
|
|
135
|
+
agent/tools/revoke_connector.ts mounted @open-everywhere/core
|
|
136
|
+
agent/tools/revoke_credential_grant.ts mounted @open-everywhere/core
|
|
137
|
+
agent/tools/revoke_routine_permissions.ts mounted @open-everywhere/core
|
|
138
|
+
agent/tools/rotate_webhook.ts mounted @open-everywhere/core
|
|
139
|
+
agent/tools/run_routine_now.ts mounted @open-everywhere/core
|
|
140
|
+
agent/tools/sandbox_tools.ts mounted @open-everywhere/core
|
|
141
|
+
agent/tools/search.ts mounted @open-everywhere/core
|
|
142
|
+
agent/tools/session_cost.ts mounted @open-everywhere/core
|
|
143
|
+
agent/tools/set_dm_delivery.ts mounted @open-everywhere/core
|
|
144
|
+
agent/tools/set_spend_limit.ts mounted @open-everywhere/core
|
|
145
|
+
agent/tools/set_state.ts mounted @open-everywhere/core
|
|
146
|
+
agent/tools/spawn_thread_session.ts mounted @open-everywhere/core
|
|
147
|
+
agent/tools/spend_report.ts mounted @open-everywhere/core
|
|
148
|
+
agent/tools/stand_down.ts mounted @open-everywhere/core
|
|
149
|
+
agent/tools/subscribe_pr.ts mounted @open-everywhere/core
|
|
150
|
+
agent/tools/unlink_identity.ts mounted @open-everywhere/core
|
|
151
|
+
agent/tools/update_status.ts mounted @open-everywhere/core
|
|
152
|
+
agent/tools/usage_report.ts mounted @open-everywhere/core
|
|
153
|
+
agent/tools/walk_pr.ts mounted @open-everywhere/core
|
|
154
|
+
agent/tools/web_fetch.ts framework-disabled
|
|
155
|
+
agent/tools/work.ts mounted @open-everywhere/core
|
|
156
|
+
agent/tools/write_file.ts framework-disabled
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
// Blob hosting — config-as-code, the org-level opt-in for PUBLISHING HTML artifacts to a
|
|
2
|
-
// world-readable Vercel Blob URL from the post_file tool (@open-everywhere/core/agent/tools/post_file.js).
|
|
3
|
-
//
|
|
4
|
-
// OFF BY DEFAULT. With `enabled:
|
|
5
|
-
// false` — the shipped default — post_file NEVER hosts: an HTML artifact is attached to the
|
|
6
|
-
// message as a downloadable `.html` file (workspace-scoped, no world-readable URL). Flip
|
|
7
|
-
// `enabled: true` to opt this org IN; then post_file publishes HTML pages to a public Blob URL,
|
|
8
|
-
// and that public write is APPROVAL-GATED at the tool (an admin approves each publish).
|
|
9
|
-
//
|
|
10
|
-
// TO TURN IT ON, an operator:
|
|
11
|
-
// 1. Connects a Vercel Blob store to this project (Vercel populates VERCEL_OIDC_TOKEN +
|
|
12
|
-
// BLOB_STORE_ID automatically — the SDK authenticates via OIDC, NO BLOB_READ_WRITE_TOKEN).
|
|
13
|
-
// 2. Sets `enabled: true` here and merges it (reviewed git config, same PR-to-widen posture
|
|
14
|
-
// as model/policy.ts and spend/budgets.ts).
|
|
15
|
-
// If `enabled: true` ships without the Blob store connected, the first publish FAILS LOUD
|
|
16
|
-
// (missing OIDC env) rather than silently degrading — an opted-in-but-unconfigured deployment
|
|
17
|
-
// is a misconfig we surface, not hide.
|
|
18
|
-
//
|
|
19
|
-
// This file is the seam a DB/dashboard would swap behind. After editing:
|
|
20
|
-
// `npm run typecheck` plus a boot (assertBlobHostingValid runs at import and throws on a malformed
|
|
21
|
-
// `publicPrefix`).
|
|
22
|
-
|
|
23
|
-
import { defineBlobHosting, type BlobHostingConfig } from "@open-everywhere/core/agent/blob/hosting.js";
|
|
24
|
-
|
|
25
|
-
const config: BlobHostingConfig = defineBlobHosting({
|
|
26
|
-
// OFF by default — HTML artifacts are attached as downloadable files, nothing is published.
|
|
27
|
-
enabled: false,
|
|
28
|
-
|
|
29
|
-
// --- EXAMPLE: opt this org in to hosting HTML artifacts on Vercel Blob ---
|
|
30
|
-
// Requires a connected Blob store (VERCEL_OIDC_TOKEN + BLOB_STORE_ID). Each publish is
|
|
31
|
-
// approval-gated at the post_file tool.
|
|
32
|
-
// enabled: true,
|
|
33
|
-
|
|
34
|
-
// --- OPTIONAL: override the reserved public-output prefix (namespace isolation) ---
|
|
35
|
-
// Defaults to "public-artifacts". A plain prefix segment: no leading/trailing slash, no "..".
|
|
36
|
-
// publicPrefix: "public-artifacts",
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
/** The seam a DB/dashboard would swap behind. Static config for now. */
|
|
40
|
-
export function loadBlobHosting(): BlobHostingConfig {
|
|
41
|
-
return config;
|
|
42
|
-
}
|