@every-app/sdk 0.3.0-rc.8 → 0.3.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 +75 -74
- package/dist/cloudflare/catalogSettings.generated.d.ts +20 -6
- package/dist/cloudflare/catalogSettings.generated.d.ts.map +1 -1
- package/dist/cloudflare/catalogSettings.generated.js +45 -14
- package/dist/cloudflare/index.d.ts +1 -1
- package/dist/cloudflare/index.d.ts.map +1 -1
- package/dist/cloudflare/sentinel.d.ts +3 -0
- package/dist/cloudflare/sentinel.d.ts.map +1 -1
- package/dist/cloudflare/sentinel.js +10 -0
- package/dist/cloudflare/worker.d.ts +67 -23
- package/dist/cloudflare/worker.d.ts.map +1 -1
- package/dist/cloudflare/worker.js +68 -32
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/internal/aiDefault.d.ts +36 -79
- package/dist/internal/aiDefault.d.ts.map +1 -1
- package/dist/internal/aiDefault.js +47 -149
- package/dist/internal/aiProviders.d.ts +1 -1
- package/dist/internal/aiProviders.d.ts.map +1 -1
- package/dist/internal/aiProviders.js +2 -2
- package/dist/internal/appSettings.d.ts +140 -89
- package/dist/internal/appSettings.d.ts.map +1 -1
- package/dist/internal/appSettings.js +264 -156
- package/dist/internal/capabilities.d.ts +145 -503
- package/dist/internal/capabilities.d.ts.map +1 -1
- package/dist/internal/capabilities.js +29 -550
- package/dist/internal/catalog/commerce.js +1 -1
- package/dist/internal/catalog/comms.d.ts +37 -0
- package/dist/internal/catalog/comms.d.ts.map +1 -1
- package/dist/internal/catalog/comms.js +43 -0
- package/dist/internal/catalog/index.d.ts +72 -0
- package/dist/internal/catalog/index.d.ts.map +1 -1
- package/dist/internal/catalog/infra.d.ts +35 -0
- package/dist/internal/catalog/infra.d.ts.map +1 -1
- package/dist/internal/catalog/infra.js +65 -0
- package/dist/internal/devProviders.d.ts +1 -19
- package/dist/internal/devProviders.d.ts.map +1 -1
- package/dist/internal/devProviders.js +7 -1
- package/dist/internal/events.d.ts +52 -1
- package/dist/internal/events.d.ts.map +1 -1
- package/dist/internal/events.js +66 -2
- package/dist/internal/gatewaySettings.d.ts +6 -16
- package/dist/internal/gatewaySettings.d.ts.map +1 -1
- package/dist/internal/gatewaySettings.js +6 -24
- package/dist/internal/index.d.ts +1 -0
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +1 -0
- package/dist/internal/mcpOAuth.d.ts +210 -0
- package/dist/internal/mcpOAuth.d.ts.map +1 -0
- package/dist/internal/mcpOAuth.js +735 -0
- package/dist/internal/oauthClient.d.ts +7 -47
- package/dist/internal/oauthClient.d.ts.map +1 -1
- package/dist/internal/oauthClient.js +1 -115
- package/dist/internal/oauthPresets.d.ts +356 -20
- package/dist/internal/oauthPresets.d.ts.map +1 -1
- package/dist/internal/oauthPresets.js +183 -861
- package/dist/internal/oauthScopes.d.ts +43 -155
- package/dist/internal/oauthScopes.d.ts.map +1 -1
- package/dist/internal/oauthScopes.js +82 -475
- package/dist/internal/oauthSpec.d.ts +28 -71
- package/dist/internal/oauthSpec.d.ts.map +1 -1
- package/dist/internal/oauthSpec.js +172 -448
- package/dist/internal/protocol.d.ts +39 -15
- package/dist/internal/protocol.d.ts.map +1 -1
- package/dist/internal/protocol.js +40 -7
- package/dist/internal/providerApps.d.ts +2 -2
- package/dist/internal/providerApps.js +2 -2
- package/dist/internal/providerRegistry.d.ts +5 -64
- package/dist/internal/providerRegistry.d.ts.map +1 -1
- package/dist/internal/providerRegistry.js +19 -118
- package/dist/internal/providerSpec.d.ts.map +1 -1
- package/dist/internal/providerSpec.js +14 -36
- package/dist/internal/remoteMcp.d.ts +191 -47
- package/dist/internal/remoteMcp.d.ts.map +1 -1
- package/dist/internal/remoteMcp.js +338 -133
- package/dist/internal/signInProviders.d.ts +1 -1
- package/dist/internal/signInProviders.d.ts.map +1 -1
- package/dist/internal/tools.d.ts +15 -8
- package/dist/internal/tools.d.ts.map +1 -1
- package/dist/internal/tools.js +9 -8
- package/dist/manifest.d.ts +96 -28
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +1 -1
- package/dist/server/ai.d.ts +1 -93
- package/dist/server/ai.d.ts.map +1 -1
- package/dist/server/ai.js +17 -111
- package/dist/server/attribution.d.ts +10 -1
- package/dist/server/attribution.d.ts.map +1 -1
- package/dist/server/attribution.js +7 -1
- package/dist/server/connectUrl.d.ts +4 -9
- package/dist/server/connectUrl.d.ts.map +1 -1
- package/dist/server/connectUrl.js +17 -14
- package/dist/server/context.d.ts +12 -14
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/context.js +23 -25
- package/dist/server/emit.d.ts.map +1 -1
- package/dist/server/emit.js +2 -2
- package/dist/server/env.d.ts +3 -0
- package/dist/server/env.d.ts.map +1 -1
- package/dist/server/eventsEndpoint.d.ts +48 -0
- package/dist/server/eventsEndpoint.d.ts.map +1 -0
- package/dist/server/eventsEndpoint.js +145 -0
- package/dist/server/everyApp.d.ts +16 -26
- package/dist/server/everyApp.d.ts.map +1 -1
- package/dist/server/everyApp.js +22 -46
- package/dist/server/gatewayFetch.d.ts +19 -1
- package/dist/server/gatewayFetch.d.ts.map +1 -1
- package/dist/server/gatewayFetch.js +45 -3
- package/dist/server/index.d.ts +6 -9
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +4 -8
- package/dist/server/integrationFetch.d.ts +60 -72
- package/dist/server/integrationFetch.d.ts.map +1 -1
- package/dist/server/integrationFetch.js +124 -397
- package/dist/server/listMembers.d.ts.map +1 -1
- package/dist/server/listMembers.js +2 -2
- package/dist/server/refusal.d.ts +0 -9
- package/dist/server/refusal.d.ts.map +1 -1
- package/dist/server/refusal.js +0 -22
- package/dist/server/sendEmail.d.ts.map +1 -1
- package/dist/server/sendEmail.js +2 -2
- package/dist/server/tools.d.ts +17 -6
- package/dist/server/tools.d.ts.map +1 -1
- package/dist/server/tools.js +14 -4
- package/dist/server/toolsEndpoint.d.ts +2 -1
- package/dist/server/toolsEndpoint.d.ts.map +1 -1
- package/dist/server/toolsEndpoint.js +4 -3
- package/dist/server/webhooks.d.ts +56 -0
- package/dist/server/webhooks.d.ts.map +1 -0
- package/dist/server/webhooks.js +205 -0
- package/dist/testing/index.d.ts +2 -3
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +2 -6
- package/package.json +6 -1
- package/dist/server/aiBinding.d.ts +0 -68
- package/dist/server/aiBinding.d.ts.map +0 -1
- package/dist/server/aiBinding.js +0 -294
- package/dist/server/authorizeUrl.d.ts +0 -43
- package/dist/server/authorizeUrl.d.ts.map +0 -1
- package/dist/server/authorizeUrl.js +0 -106
- package/dist/server/emailBinding.d.ts +0 -72
- package/dist/server/emailBinding.d.ts.map +0 -1
- package/dist/server/emailBinding.js +0 -124
- package/dist/server/fromMcpTools.d.ts +0 -89
- package/dist/server/fromMcpTools.d.ts.map +0 -1
- package/dist/server/fromMcpTools.js +0 -192
|
@@ -186,6 +186,43 @@ export declare const COMMS: {
|
|
|
186
186
|
};
|
|
187
187
|
readonly tags: readonly ["support", "chat", "messaging"];
|
|
188
188
|
};
|
|
189
|
+
readonly granola: {
|
|
190
|
+
readonly mode: "api_key";
|
|
191
|
+
readonly label: "Granola";
|
|
192
|
+
readonly description: "Meeting notes: list, search and read notes with their AI summaries, transcripts, folders and spaces.";
|
|
193
|
+
readonly auth: {
|
|
194
|
+
readonly kind: "bearer";
|
|
195
|
+
readonly secret: "GRANOLA_API_KEY";
|
|
196
|
+
};
|
|
197
|
+
readonly docs: "https://docs.granola.ai/help-center/sharing/integrations/granola-api";
|
|
198
|
+
readonly api: "https://docs.granola.ai/introduction";
|
|
199
|
+
readonly hosts: readonly ["public-api.granola.ai"];
|
|
200
|
+
readonly data: "account";
|
|
201
|
+
readonly access: readonly ["read"];
|
|
202
|
+
readonly readMethods: readonly ["GET", "POST"];
|
|
203
|
+
readonly accountWidePaths: readonly [readonly ["audit"], readonly ["webhook-endpoints"], readonly ["legal-holds"]];
|
|
204
|
+
readonly hint: "An API key (grn_...) from the Granola desktop app's Settings > Connectors > API keys, on a Business or Enterprise plan; the Gateway sends it as a bearer token. It reads only the notes its scopes allow.";
|
|
205
|
+
readonly secrets: readonly [{
|
|
206
|
+
readonly name: "GRANOLA_API_KEY";
|
|
207
|
+
readonly hint: "A personal or workspace API key (grn_...), with only the note scopes the apps need.";
|
|
208
|
+
}];
|
|
209
|
+
readonly rate: {
|
|
210
|
+
readonly perSecond: 5;
|
|
211
|
+
readonly note: "Bursts of 25 requests in 5 seconds; per user or per workspace, by the key's scope.";
|
|
212
|
+
};
|
|
213
|
+
readonly smoke: {
|
|
214
|
+
readonly method: "GET";
|
|
215
|
+
readonly path: "/v1/notes?page_size=1";
|
|
216
|
+
readonly expect: readonly [200];
|
|
217
|
+
readonly free: true;
|
|
218
|
+
};
|
|
219
|
+
readonly example: "summarize what we decided in this week's customer calls";
|
|
220
|
+
readonly verified: {
|
|
221
|
+
readonly on: "2026-10-30";
|
|
222
|
+
readonly how: "docs";
|
|
223
|
+
};
|
|
224
|
+
readonly tags: readonly ["meetings", "notes", "transcripts"];
|
|
225
|
+
};
|
|
189
226
|
readonly linear: {
|
|
190
227
|
readonly mode: "api_key";
|
|
191
228
|
readonly label: "Linear";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comms.d.ts","sourceRoot":"","sources":["../../../src/internal/catalog/comms.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,KAAK
|
|
1
|
+
{"version":3,"file":"comms.d.ts","sourceRoot":"","sources":["../../../src/internal/catalog/comms.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAihBmC,CAAC"}
|
|
@@ -259,6 +259,49 @@ export const COMMS = {
|
|
|
259
259
|
},
|
|
260
260
|
tags: ["support", "chat", "messaging"],
|
|
261
261
|
},
|
|
262
|
+
// Added 2026-10-30 from docs.granola.ai and its OpenAPI spec. Granola's
|
|
263
|
+
// hosted MCP server (mcp.granola.ai/mcp) is OAuth only, which the Gateway
|
|
264
|
+
// can't sign in to yet; this is its API-key REST API.
|
|
265
|
+
granola: {
|
|
266
|
+
mode: "api_key",
|
|
267
|
+
label: "Granola",
|
|
268
|
+
description: "Meeting notes: list, search and read notes with their AI summaries, transcripts, folders and spaces.",
|
|
269
|
+
auth: { kind: "bearer", secret: "GRANOLA_API_KEY" },
|
|
270
|
+
docs: "https://docs.granola.ai/help-center/sharing/integrations/granola-api",
|
|
271
|
+
api: "https://docs.granola.ai/introduction",
|
|
272
|
+
hosts: ["public-api.granola.ai"],
|
|
273
|
+
data: "account",
|
|
274
|
+
access: ["read"],
|
|
275
|
+
// Searching notes is a POST that reads; with the paths below refused,
|
|
276
|
+
// it is the only POST an app can reach.
|
|
277
|
+
readMethods: ["GET", "POST"],
|
|
278
|
+
// Workspace administration: the audit log, webhook endpoints (which
|
|
279
|
+
// would send every note to a URL of the app's choosing) and legal holds.
|
|
280
|
+
accountWidePaths: [["audit"], ["webhook-endpoints"], ["legal-holds"]],
|
|
281
|
+
hint: "An API key (grn_...) from the Granola desktop app's Settings > Connectors > API keys, on a Business or Enterprise plan; the Gateway sends it as a bearer token. It reads only the notes its scopes allow.",
|
|
282
|
+
secrets: [
|
|
283
|
+
{
|
|
284
|
+
name: "GRANOLA_API_KEY",
|
|
285
|
+
hint: "A personal or workspace API key (grn_...), with only the note scopes the apps need.",
|
|
286
|
+
},
|
|
287
|
+
],
|
|
288
|
+
rate: {
|
|
289
|
+
perSecond: 5,
|
|
290
|
+
note: "Bursts of 25 requests in 5 seconds; per user or per workspace, by the key's scope.",
|
|
291
|
+
},
|
|
292
|
+
smoke: {
|
|
293
|
+
method: "GET",
|
|
294
|
+
path: "/v1/notes?page_size=1",
|
|
295
|
+
expect: [200],
|
|
296
|
+
free: true,
|
|
297
|
+
},
|
|
298
|
+
example: "summarize what we decided in this week's customer calls",
|
|
299
|
+
verified: {
|
|
300
|
+
on: "2026-10-30",
|
|
301
|
+
how: "docs",
|
|
302
|
+
},
|
|
303
|
+
tags: ["meetings", "notes", "transcripts"],
|
|
304
|
+
},
|
|
262
305
|
linear: {
|
|
263
306
|
mode: "api_key",
|
|
264
307
|
label: "Linear",
|
|
@@ -1206,6 +1206,41 @@ export declare const CATALOG_ENTRIES: {
|
|
|
1206
1206
|
};
|
|
1207
1207
|
readonly tags: readonly ["weather", "forecast"];
|
|
1208
1208
|
};
|
|
1209
|
+
readonly daytona: {
|
|
1210
|
+
readonly mode: "api_key";
|
|
1211
|
+
readonly label: "Daytona";
|
|
1212
|
+
readonly description: "Sandboxes for running code: create, start, stop, archive and delete sandboxes, and manage their snapshots and volumes.";
|
|
1213
|
+
readonly auth: {
|
|
1214
|
+
readonly kind: "bearer";
|
|
1215
|
+
readonly secret: "DAYTONA_API_KEY";
|
|
1216
|
+
};
|
|
1217
|
+
readonly docs: "https://www.daytona.io/docs/en/api-keys/";
|
|
1218
|
+
readonly api: "https://www.daytona.io/docs/en/tools/api/";
|
|
1219
|
+
readonly hosts: readonly ["app.daytona.io"];
|
|
1220
|
+
readonly data: "account";
|
|
1221
|
+
readonly access: readonly ["read", "write"];
|
|
1222
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
1223
|
+
readonly writeMethods: readonly ["POST", "PUT", "PATCH", "DELETE"];
|
|
1224
|
+
readonly accountWidePaths: readonly [readonly ["organizations"], readonly ["organization"], readonly ["billing"], readonly ["api-keys"], readonly ["users"], readonly ["audit"], readonly ["webhooks"], readonly ["secret"], readonly ["docker-registry"], readonly ["object-storage"], readonly ["regions"], readonly ["runners"], readonly ["for-runner"], readonly ["jobs"], readonly ["warm-pools"], readonly ["preview"], readonly ["ssh-access", "validate"]];
|
|
1225
|
+
readonly hint: "An API key from the Daytona dashboard's Keys page, with only the permissions the apps need; the Gateway sends it as a bearer token to app.daytona.io. Any key of an organization reaches every running sandbox in it, so give the Gateway a Daytona organization of its own.";
|
|
1226
|
+
readonly secrets: readonly [{
|
|
1227
|
+
readonly name: "DAYTONA_API_KEY";
|
|
1228
|
+
readonly hint: "An API key from the Daytona dashboard's Keys page: write:sandboxes and delete:sandboxes (and the snapshot or volume ones) only if an app needs them, and never manage:api_keys, manage:secrets, manage:billing or the region and runner permissions.";
|
|
1229
|
+
}];
|
|
1230
|
+
readonly smoke: {
|
|
1231
|
+
readonly method: "GET";
|
|
1232
|
+
readonly path: "/api/sandbox";
|
|
1233
|
+
readonly expect: readonly [200];
|
|
1234
|
+
readonly free: true;
|
|
1235
|
+
readonly note: "Lists the organization's sandboxes; any key may read them.";
|
|
1236
|
+
};
|
|
1237
|
+
readonly example: "start a sandbox from my snapshot and stop it when the run is done";
|
|
1238
|
+
readonly verified: {
|
|
1239
|
+
readonly on: "2026-11-01";
|
|
1240
|
+
readonly how: "docs";
|
|
1241
|
+
};
|
|
1242
|
+
readonly tags: readonly ["sandbox", "compute", "hosting"];
|
|
1243
|
+
};
|
|
1209
1244
|
readonly postmark: {
|
|
1210
1245
|
readonly mode: "api_key";
|
|
1211
1246
|
readonly label: "Postmark";
|
|
@@ -1393,6 +1428,43 @@ export declare const CATALOG_ENTRIES: {
|
|
|
1393
1428
|
};
|
|
1394
1429
|
readonly tags: readonly ["support", "chat", "messaging"];
|
|
1395
1430
|
};
|
|
1431
|
+
readonly granola: {
|
|
1432
|
+
readonly mode: "api_key";
|
|
1433
|
+
readonly label: "Granola";
|
|
1434
|
+
readonly description: "Meeting notes: list, search and read notes with their AI summaries, transcripts, folders and spaces.";
|
|
1435
|
+
readonly auth: {
|
|
1436
|
+
readonly kind: "bearer";
|
|
1437
|
+
readonly secret: "GRANOLA_API_KEY";
|
|
1438
|
+
};
|
|
1439
|
+
readonly docs: "https://docs.granola.ai/help-center/sharing/integrations/granola-api";
|
|
1440
|
+
readonly api: "https://docs.granola.ai/introduction";
|
|
1441
|
+
readonly hosts: readonly ["public-api.granola.ai"];
|
|
1442
|
+
readonly data: "account";
|
|
1443
|
+
readonly access: readonly ["read"];
|
|
1444
|
+
readonly readMethods: readonly ["GET", "POST"];
|
|
1445
|
+
readonly accountWidePaths: readonly [readonly ["audit"], readonly ["webhook-endpoints"], readonly ["legal-holds"]];
|
|
1446
|
+
readonly hint: "An API key (grn_...) from the Granola desktop app's Settings > Connectors > API keys, on a Business or Enterprise plan; the Gateway sends it as a bearer token. It reads only the notes its scopes allow.";
|
|
1447
|
+
readonly secrets: readonly [{
|
|
1448
|
+
readonly name: "GRANOLA_API_KEY";
|
|
1449
|
+
readonly hint: "A personal or workspace API key (grn_...), with only the note scopes the apps need.";
|
|
1450
|
+
}];
|
|
1451
|
+
readonly rate: {
|
|
1452
|
+
readonly perSecond: 5;
|
|
1453
|
+
readonly note: "Bursts of 25 requests in 5 seconds; per user or per workspace, by the key's scope.";
|
|
1454
|
+
};
|
|
1455
|
+
readonly smoke: {
|
|
1456
|
+
readonly method: "GET";
|
|
1457
|
+
readonly path: "/v1/notes?page_size=1";
|
|
1458
|
+
readonly expect: readonly [200];
|
|
1459
|
+
readonly free: true;
|
|
1460
|
+
};
|
|
1461
|
+
readonly example: "summarize what we decided in this week's customer calls";
|
|
1462
|
+
readonly verified: {
|
|
1463
|
+
readonly on: "2026-10-30";
|
|
1464
|
+
readonly how: "docs";
|
|
1465
|
+
};
|
|
1466
|
+
readonly tags: readonly ["meetings", "notes", "transcripts"];
|
|
1467
|
+
};
|
|
1396
1468
|
readonly linear: {
|
|
1397
1469
|
readonly mode: "api_key";
|
|
1398
1470
|
readonly label: "Linear";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/internal/catalog/index.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,eAAe
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/internal/catalog/index.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAMlB,CAAC"}
|
|
@@ -419,5 +419,40 @@ export declare const INFRA: {
|
|
|
419
419
|
};
|
|
420
420
|
readonly tags: readonly ["weather", "forecast"];
|
|
421
421
|
};
|
|
422
|
+
readonly daytona: {
|
|
423
|
+
readonly mode: "api_key";
|
|
424
|
+
readonly label: "Daytona";
|
|
425
|
+
readonly description: "Sandboxes for running code: create, start, stop, archive and delete sandboxes, and manage their snapshots and volumes.";
|
|
426
|
+
readonly auth: {
|
|
427
|
+
readonly kind: "bearer";
|
|
428
|
+
readonly secret: "DAYTONA_API_KEY";
|
|
429
|
+
};
|
|
430
|
+
readonly docs: "https://www.daytona.io/docs/en/api-keys/";
|
|
431
|
+
readonly api: "https://www.daytona.io/docs/en/tools/api/";
|
|
432
|
+
readonly hosts: readonly ["app.daytona.io"];
|
|
433
|
+
readonly data: "account";
|
|
434
|
+
readonly access: readonly ["read", "write"];
|
|
435
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
436
|
+
readonly writeMethods: readonly ["POST", "PUT", "PATCH", "DELETE"];
|
|
437
|
+
readonly accountWidePaths: readonly [readonly ["organizations"], readonly ["organization"], readonly ["billing"], readonly ["api-keys"], readonly ["users"], readonly ["audit"], readonly ["webhooks"], readonly ["secret"], readonly ["docker-registry"], readonly ["object-storage"], readonly ["regions"], readonly ["runners"], readonly ["for-runner"], readonly ["jobs"], readonly ["warm-pools"], readonly ["preview"], readonly ["ssh-access", "validate"]];
|
|
438
|
+
readonly hint: "An API key from the Daytona dashboard's Keys page, with only the permissions the apps need; the Gateway sends it as a bearer token to app.daytona.io. Any key of an organization reaches every running sandbox in it, so give the Gateway a Daytona organization of its own.";
|
|
439
|
+
readonly secrets: readonly [{
|
|
440
|
+
readonly name: "DAYTONA_API_KEY";
|
|
441
|
+
readonly hint: "An API key from the Daytona dashboard's Keys page: write:sandboxes and delete:sandboxes (and the snapshot or volume ones) only if an app needs them, and never manage:api_keys, manage:secrets, manage:billing or the region and runner permissions.";
|
|
442
|
+
}];
|
|
443
|
+
readonly smoke: {
|
|
444
|
+
readonly method: "GET";
|
|
445
|
+
readonly path: "/api/sandbox";
|
|
446
|
+
readonly expect: readonly [200];
|
|
447
|
+
readonly free: true;
|
|
448
|
+
readonly note: "Lists the organization's sandboxes; any key may read them.";
|
|
449
|
+
};
|
|
450
|
+
readonly example: "start a sandbox from my snapshot and stop it when the run is done";
|
|
451
|
+
readonly verified: {
|
|
452
|
+
readonly on: "2026-11-01";
|
|
453
|
+
readonly how: "docs";
|
|
454
|
+
};
|
|
455
|
+
readonly tags: readonly ["sandbox", "compute", "hosting"];
|
|
456
|
+
};
|
|
422
457
|
};
|
|
423
458
|
//# sourceMappingURL=infra.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"infra.d.ts","sourceRoot":"","sources":["../../../src/internal/catalog/infra.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,KAAK
|
|
1
|
+
{"version":3,"file":"infra.d.ts","sourceRoot":"","sources":["../../../src/internal/catalog/infra.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4mBmC,CAAC"}
|
|
@@ -540,4 +540,69 @@ export const INFRA = {
|
|
|
540
540
|
},
|
|
541
541
|
tags: ["weather", "forecast"],
|
|
542
542
|
},
|
|
543
|
+
// Added 2026-11-01 from Daytona's OpenAPI spec (daytona.io/docs/openapi.json)
|
|
544
|
+
// and its API-key docs, for Birds' sandboxes (docs/design/
|
|
545
|
+
// 2026-11-birds-forcing-function.md, section 1.12). The control plane only:
|
|
546
|
+
// preview URLs (<port>-<id>.proxy.daytona.works, per-sandbox tokens) and
|
|
547
|
+
// the toolbox stay outside the proxy.
|
|
548
|
+
daytona: {
|
|
549
|
+
mode: "api_key",
|
|
550
|
+
label: "Daytona",
|
|
551
|
+
description: "Sandboxes for running code: create, start, stop, archive and delete sandboxes, and manage their snapshots and volumes.",
|
|
552
|
+
auth: { kind: "bearer", secret: "DAYTONA_API_KEY" },
|
|
553
|
+
docs: "https://www.daytona.io/docs/en/api-keys/",
|
|
554
|
+
api: "https://www.daytona.io/docs/en/tools/api/",
|
|
555
|
+
hosts: ["app.daytona.io"],
|
|
556
|
+
data: "account",
|
|
557
|
+
access: ["read", "write"],
|
|
558
|
+
readMethods: ["GET", "HEAD"],
|
|
559
|
+
writeMethods: ["POST", "PUT", "PATCH", "DELETE"],
|
|
560
|
+
// One key is the whole Daytona organization's. Refused: the
|
|
561
|
+
// organization itself (members, roles, invitations, SSO, usage and
|
|
562
|
+
// spend, its settings), billing, API keys, the signed-in user, the audit
|
|
563
|
+
// log, webhooks (which would send every sandbox event to a URL of the
|
|
564
|
+
// app's choosing), and what hands out the organization's credentials or
|
|
565
|
+
// runs its infrastructure: the organization's secrets, registry and
|
|
566
|
+
// object-storage push access, regions (which regenerate proxy and SSH
|
|
567
|
+
// keys), runners, jobs, warm pools, and the preview proxy's own checks.
|
|
568
|
+
accountWidePaths: [
|
|
569
|
+
["organizations"],
|
|
570
|
+
["organization"],
|
|
571
|
+
["billing"],
|
|
572
|
+
["api-keys"],
|
|
573
|
+
["users"],
|
|
574
|
+
["audit"],
|
|
575
|
+
["webhooks"],
|
|
576
|
+
["secret"],
|
|
577
|
+
["docker-registry"],
|
|
578
|
+
["object-storage"],
|
|
579
|
+
["regions"],
|
|
580
|
+
["runners"],
|
|
581
|
+
["for-runner"],
|
|
582
|
+
["jobs"],
|
|
583
|
+
["warm-pools"],
|
|
584
|
+
["preview"],
|
|
585
|
+
["ssh-access", "validate"],
|
|
586
|
+
],
|
|
587
|
+
hint: "An API key from the Daytona dashboard's Keys page, with only the permissions the apps need; the Gateway sends it as a bearer token to app.daytona.io. Any key of an organization reaches every running sandbox in it, so give the Gateway a Daytona organization of its own.",
|
|
588
|
+
secrets: [
|
|
589
|
+
{
|
|
590
|
+
name: "DAYTONA_API_KEY",
|
|
591
|
+
hint: "An API key from the Daytona dashboard's Keys page: write:sandboxes and delete:sandboxes (and the snapshot or volume ones) only if an app needs them, and never manage:api_keys, manage:secrets, manage:billing or the region and runner permissions.",
|
|
592
|
+
},
|
|
593
|
+
],
|
|
594
|
+
smoke: {
|
|
595
|
+
method: "GET",
|
|
596
|
+
path: "/api/sandbox",
|
|
597
|
+
expect: [200],
|
|
598
|
+
free: true,
|
|
599
|
+
note: "Lists the organization's sandboxes; any key may read them.",
|
|
600
|
+
},
|
|
601
|
+
example: "start a sandbox from my snapshot and stop it when the run is done",
|
|
602
|
+
verified: {
|
|
603
|
+
on: "2026-11-01",
|
|
604
|
+
how: "docs",
|
|
605
|
+
},
|
|
606
|
+
tags: ["sandbox", "compute", "hosting"],
|
|
607
|
+
},
|
|
543
608
|
};
|
|
@@ -1,21 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A provider registered on a gateway, in local development
|
|
3
|
-
* (docs/design/2026-10-provider-registry.md, section 4). There is no
|
|
4
|
-
* gateway to ask in `everyapp dev`, so the spec comes from the app's
|
|
5
|
-
* directory: `everyapp provider add` (run in an app directory) and
|
|
6
|
-
* `everyapp provider show <id> --save` write it to
|
|
7
|
-
* `.everyapp/providers/<id>.json`, `everyAppWorker()` reads every such
|
|
8
|
-
* file when it builds the dev Worker and hands them over as one text
|
|
9
|
-
* binding, {@link DEV_PROVIDERS_ENV}, and `integrationFetch()`'s local
|
|
10
|
-
* fallback resolves an id outside the catalog from it, with the
|
|
11
|
-
* developer's own key from `.dev.vars` under the spec's setting names.
|
|
12
|
-
*
|
|
13
|
-
* The binding is JSON: `[{ "file": ".everyapp/providers/stripe.json",
|
|
14
|
-
* "spec": <the file's JSON, or its text when it isn't JSON> }]`. Each spec
|
|
15
|
-
* is parsed here, with the same parser `provider add` uses; one that
|
|
16
|
-
* doesn't parse is ignored until an app asks for its id, which then gets
|
|
17
|
-
* a ConfigurationError naming the file.
|
|
18
|
-
*/
|
|
19
1
|
import { type RegistrableCapability } from "./providerSpec.js";
|
|
20
2
|
/** The dev Worker's binding holding the specs (a copy is in ../cloudflare/worker.ts, kept in step by a test). */
|
|
21
3
|
export declare const DEV_PROVIDERS_ENV = "EVERYAPP_DEV_PROVIDERS";
|
|
@@ -34,7 +16,7 @@ export declare function devProviderFile(id: string): string;
|
|
|
34
16
|
export type DevProviderLookup = {
|
|
35
17
|
found: true;
|
|
36
18
|
capability: RegistrableCapability;
|
|
37
|
-
file
|
|
19
|
+
file?: string;
|
|
38
20
|
} | {
|
|
39
21
|
found: false;
|
|
40
22
|
problem: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devProviders.d.ts","sourceRoot":"","sources":["../../src/internal/devProviders.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"devProviders.d.ts","sourceRoot":"","sources":["../../src/internal/devProviders.ts"],"names":[],"mappings":"AAqBA,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,mBAAmB,CAAC;AAE3B,iHAAiH;AACjH,eAAO,MAAM,iBAAiB,2BAA2B,CAAC;AAE1D,iEAAiE;AACjE,eAAO,MAAM,iBAAiB,wBAAwB,CAAC;AAEvD,0CAA0C;AAC1C,MAAM,WAAW,eAAe;IAC9B,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,IAAI,EAAE,OAAO,CAAC;CACf;AAED,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,gFAAgF;AAChF,MAAM,MAAM,iBAAiB,GACzB;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,qBAAqB,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACjE;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAuBtC;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzC,EAAE,EAAE,MAAM,GACT,iBAAiB,CAiCnB"}
|
|
@@ -8,7 +8,9 @@
|
|
|
8
8
|
* file when it builds the dev Worker and hands them over as one text
|
|
9
9
|
* binding, {@link DEV_PROVIDERS_ENV}, and `integrationFetch()`'s local
|
|
10
10
|
* fallback resolves an id outside the catalog from it, with the
|
|
11
|
-
* developer's own key from `.dev.vars` under the spec's setting names.
|
|
11
|
+
* developer's own key from `.dev.vars` under the spec's setting names. An
|
|
12
|
+
* OAuth preset's id needs no file: its preset is the spec (a deploy writes
|
|
13
|
+
* the same row).
|
|
12
14
|
*
|
|
13
15
|
* The binding is JSON: `[{ "file": ".everyapp/providers/stripe.json",
|
|
14
16
|
* "spec": <the file's JSON, or its text when it isn't JSON> }]`. Each spec
|
|
@@ -16,6 +18,7 @@
|
|
|
16
18
|
* doesn't parse is ignored until an app asks for its id, which then gets
|
|
17
19
|
* a ConfigurationError naming the file.
|
|
18
20
|
*/
|
|
21
|
+
import { oauthPreset } from "./oauthPresets.js";
|
|
19
22
|
import { describeSpecProblems, parseProviderSpec, } from "./providerSpec.js";
|
|
20
23
|
/** The dev Worker's binding holding the specs (a copy is in ../cloudflare/worker.ts, kept in step by a test). */
|
|
21
24
|
export const DEV_PROVIDERS_ENV = "EVERYAPP_DEV_PROVIDERS";
|
|
@@ -71,6 +74,9 @@ export function resolveDevProvider(values, id) {
|
|
|
71
74
|
}
|
|
72
75
|
return { found: true, capability: parsed.capability, file: entry.file };
|
|
73
76
|
}
|
|
77
|
+
const preset = problem ? null : oauthPreset(id);
|
|
78
|
+
if (preset)
|
|
79
|
+
return { found: true, capability: preset };
|
|
74
80
|
return {
|
|
75
81
|
found: false,
|
|
76
82
|
problem: problem
|
|
@@ -114,11 +114,62 @@ export declare const EVENT_PRIVATE_NAME_SUFFIXES: readonly string[];
|
|
|
114
114
|
*/
|
|
115
115
|
export declare function isPrivateEventTargetName(host: string): boolean;
|
|
116
116
|
/** The sinks a subscription delivers to. */
|
|
117
|
-
export declare const EVENT_SINKS: readonly ["webhook", "email"];
|
|
117
|
+
export declare const EVENT_SINKS: readonly ["webhook", "email", "app"];
|
|
118
118
|
export type EventSink = (typeof EVENT_SINKS)[number];
|
|
119
119
|
/** Whom the email sink mails: the organization's owners, or owners and admins. */
|
|
120
120
|
export declare const EVENT_EMAIL_RECIPIENTS: readonly ["owners", "admins"];
|
|
121
121
|
export type EventEmailRecipients = (typeof EVENT_EMAIL_RECIPIENTS)[number];
|
|
122
|
+
/**
|
|
123
|
+
* The `app` sink (docs/design/2026-11-birds-decisions/app-event-sink.md):
|
|
124
|
+
* an app declares `events: { subscribe, why }` in its manifest, the deploy
|
|
125
|
+
* makes the subscription for the app's own organization, and the Gateway
|
|
126
|
+
* delivers over the app's service binding to {@link APP_EVENTS_PATH} with a
|
|
127
|
+
* system token of purpose `events.deliver`.
|
|
128
|
+
*
|
|
129
|
+
* Which events may reach an app is an **allowlist** of families, not a
|
|
130
|
+
* deny-list: a family added to the catalogue later reaches no app until it
|
|
131
|
+
* is added here on purpose. `token.*`, `subscription.*`, `provider.*`,
|
|
132
|
+
* `signin_provider.*`, `cap.*`, `ai.*`, `access.*` and `organization.*` are
|
|
133
|
+
* not on it, and `member.password_reset` is left out of `member.*`.
|
|
134
|
+
*/
|
|
135
|
+
export declare const APP_EVENTS_PATH = "/__everyapp/events";
|
|
136
|
+
export declare const APP_SINK_EVENT_FAMILIES: readonly EventGroup[];
|
|
137
|
+
/** Types of an allowed family that still never reach an app. */
|
|
138
|
+
export declare const APP_SINK_EXCLUDED_TYPES: readonly string[];
|
|
139
|
+
/** The most patterns one app's `events.subscribe` may list. */
|
|
140
|
+
export declare const APP_SINK_PATTERNS_MAX = 25;
|
|
141
|
+
/**
|
|
142
|
+
* Whether an event of this type may be delivered to an app at all: its
|
|
143
|
+
* family is on the allowlist and the type isn't excluded. Checked when the
|
|
144
|
+
* bus queues a delivery and again before each attempt, whatever the
|
|
145
|
+
* subscription's stored patterns say.
|
|
146
|
+
*/
|
|
147
|
+
export declare function appSinkTypeAllowed(type: string): boolean;
|
|
148
|
+
/**
|
|
149
|
+
* What is wrong with a pattern an app's manifest subscribes to, or null: a
|
|
150
|
+
* well-formed pattern ({@link eventPatternProblem}) inside an allowed
|
|
151
|
+
* family. `*` and any pattern outside the families are refused at deploy.
|
|
152
|
+
*/
|
|
153
|
+
export declare function appSinkPatternProblem(pattern: string): string | null;
|
|
154
|
+
/**
|
|
155
|
+
* What the Gateway POSTs to {@link APP_EVENTS_PATH}: the same envelope a
|
|
156
|
+
* webhook receives.
|
|
157
|
+
*/
|
|
158
|
+
export interface AppEventEnvelope {
|
|
159
|
+
id: string;
|
|
160
|
+
type: string;
|
|
161
|
+
version: number;
|
|
162
|
+
summary: string;
|
|
163
|
+
time: string;
|
|
164
|
+
gateway: string;
|
|
165
|
+
organization: {
|
|
166
|
+
id: string;
|
|
167
|
+
slug: string;
|
|
168
|
+
name: string;
|
|
169
|
+
};
|
|
170
|
+
actor: unknown;
|
|
171
|
+
data: Record<string, unknown>;
|
|
172
|
+
}
|
|
122
173
|
/**
|
|
123
174
|
* A subscription pattern: `*` (everything but ping), an exact type, or a
|
|
124
175
|
* prefix with `.*` (`member.*`, `app.*`, `app.crm.*`). `app.*` matches the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/internal/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,UAAU,GAClB,QAAQ,GACR,cAAc,GACd,KAAK,GACL,KAAK,GACL,OAAO,GACP,MAAM,GACN,YAAY,GACZ,OAAO,GACP,QAAQ,GACR,iBAAiB,GACjB,SAAS,GACT,UAAU,GACV,cAAc,GACd,IAAI,GACJ,MAAM,CAAC;AAEX,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,0EAA0E;IAC1E,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AASD;;;;;GAKG;AACH,eAAO,MAAM,WAAW,EAAE,SAAS,aAAa,
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/internal/events.ts"],"names":[],"mappings":"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"}
|
package/dist/internal/events.js
CHANGED
|
@@ -26,6 +26,7 @@ export const EVENT_TYPES = [
|
|
|
26
26
|
entry("member", "member.password_reset", "A member reset their password"),
|
|
27
27
|
entry("member", "member.invitation_cancelled", "A pending invitation was cancelled"),
|
|
28
28
|
entry("organization", "organization.renamed", "The workspace was renamed"),
|
|
29
|
+
entry("organization", "organization.linked_dev_changed", "Linked dev (everyapp dev against this Gateway) was turned on or off"),
|
|
29
30
|
entry("app", "app.installed", "An app was installed on the Gateway"),
|
|
30
31
|
entry("app", "app.updated", "An app was redeployed"),
|
|
31
32
|
entry("app", "app.live", "An app went live on the Gateway"),
|
|
@@ -51,6 +52,7 @@ export const EVENT_TYPES = [
|
|
|
51
52
|
entry("tool", "tool.error", "An AI client's tool call failed"),
|
|
52
53
|
entry("connection", "connection.created", "An AI app was connected"),
|
|
53
54
|
entry("connection", "connection.revoked", "An AI app connection was revoked"),
|
|
55
|
+
entry("connection", "connection.used", "Linked dev used the Gateway's services, or an app used a member's OAuth connection (first call of the day)"),
|
|
54
56
|
entry("token", "token.created", "A personal access token was created"),
|
|
55
57
|
entry("token", "token.revoked", "A personal access token was revoked"),
|
|
56
58
|
entry("access", "access.changed", "Cloudflare Access was turned on or off"),
|
|
@@ -65,7 +67,7 @@ export const EVENT_TYPES = [
|
|
|
65
67
|
entry("provider", "provider.added", "A provider was registered"),
|
|
66
68
|
entry("provider", "provider.removed", "A provider was removed"),
|
|
67
69
|
entry("provider", "provider.updated", "A provider's spec or OAuth client was replaced"),
|
|
68
|
-
entry("provider", "provider.connected", "Someone connected an account at an OAuth provider"),
|
|
70
|
+
entry("provider", "provider.connected", "Someone connected an account at an OAuth provider in an app"),
|
|
69
71
|
entry("provider", "provider.disconnected", "An OAuth provider account was disconnected"),
|
|
70
72
|
entry("provider", "provider.connection_expired", "An OAuth provider refused to refresh a connection; it needs reconnecting"),
|
|
71
73
|
entry("subscription", "subscription.created", "An event subscription was added"),
|
|
@@ -201,9 +203,71 @@ export function isPrivateEventTargetName(host) {
|
|
|
201
203
|
return EVENT_PRIVATE_NAME_SUFFIXES.some((suffix) => host === suffix || host.endsWith(`.${suffix}`));
|
|
202
204
|
}
|
|
203
205
|
/** The sinks a subscription delivers to. */
|
|
204
|
-
export const EVENT_SINKS = ["webhook", "email"];
|
|
206
|
+
export const EVENT_SINKS = ["webhook", "email", "app"];
|
|
205
207
|
/** Whom the email sink mails: the organization's owners, or owners and admins. */
|
|
206
208
|
export const EVENT_EMAIL_RECIPIENTS = ["owners", "admins"];
|
|
209
|
+
/**
|
|
210
|
+
* The `app` sink (docs/design/2026-11-birds-decisions/app-event-sink.md):
|
|
211
|
+
* an app declares `events: { subscribe, why }` in its manifest, the deploy
|
|
212
|
+
* makes the subscription for the app's own organization, and the Gateway
|
|
213
|
+
* delivers over the app's service binding to {@link APP_EVENTS_PATH} with a
|
|
214
|
+
* system token of purpose `events.deliver`.
|
|
215
|
+
*
|
|
216
|
+
* Which events may reach an app is an **allowlist** of families, not a
|
|
217
|
+
* deny-list: a family added to the catalogue later reaches no app until it
|
|
218
|
+
* is added here on purpose. `token.*`, `subscription.*`, `provider.*`,
|
|
219
|
+
* `signin_provider.*`, `cap.*`, `ai.*`, `access.*` and `organization.*` are
|
|
220
|
+
* not on it, and `member.password_reset` is left out of `member.*`.
|
|
221
|
+
*/
|
|
222
|
+
export const APP_EVENTS_PATH = "/__everyapp/events";
|
|
223
|
+
export const APP_SINK_EVENT_FAMILIES = [
|
|
224
|
+
"member",
|
|
225
|
+
"group",
|
|
226
|
+
"app",
|
|
227
|
+
"mcp_app",
|
|
228
|
+
"connection",
|
|
229
|
+
"tool",
|
|
230
|
+
];
|
|
231
|
+
/** Types of an allowed family that still never reach an app. */
|
|
232
|
+
export const APP_SINK_EXCLUDED_TYPES = [
|
|
233
|
+
"member.password_reset",
|
|
234
|
+
];
|
|
235
|
+
/** The most patterns one app's `events.subscribe` may list. */
|
|
236
|
+
export const APP_SINK_PATTERNS_MAX = 25;
|
|
237
|
+
/** The family a type or pattern belongs to: its first segment. */
|
|
238
|
+
function familyOf(typeOrPattern) {
|
|
239
|
+
const dot = typeOrPattern.indexOf(".");
|
|
240
|
+
return dot === -1 ? typeOrPattern : typeOrPattern.slice(0, dot);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Whether an event of this type may be delivered to an app at all: its
|
|
244
|
+
* family is on the allowlist and the type isn't excluded. Checked when the
|
|
245
|
+
* bus queues a delivery and again before each attempt, whatever the
|
|
246
|
+
* subscription's stored patterns say.
|
|
247
|
+
*/
|
|
248
|
+
export function appSinkTypeAllowed(type) {
|
|
249
|
+
if (APP_SINK_EXCLUDED_TYPES.includes(type))
|
|
250
|
+
return false;
|
|
251
|
+
return APP_SINK_EVENT_FAMILIES.includes(familyOf(type));
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* What is wrong with a pattern an app's manifest subscribes to, or null: a
|
|
255
|
+
* well-formed pattern ({@link eventPatternProblem}) inside an allowed
|
|
256
|
+
* family. `*` and any pattern outside the families are refused at deploy.
|
|
257
|
+
*/
|
|
258
|
+
export function appSinkPatternProblem(pattern) {
|
|
259
|
+
const problem = eventPatternProblem(pattern);
|
|
260
|
+
if (problem)
|
|
261
|
+
return problem;
|
|
262
|
+
if (APP_SINK_EXCLUDED_TYPES.includes(pattern)) {
|
|
263
|
+
return `"${pattern}" never reaches an app`;
|
|
264
|
+
}
|
|
265
|
+
if (pattern === "*" ||
|
|
266
|
+
!APP_SINK_EVENT_FAMILIES.includes(familyOf(pattern))) {
|
|
267
|
+
return `"${pattern}" can't reach an app: an app subscribes to ${APP_SINK_EVENT_FAMILIES.map((family) => `${family}.*`).join(", ")} (member.password_reset excepted)`;
|
|
268
|
+
}
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
207
271
|
/**
|
|
208
272
|
* A subscription pattern: `*` (everything but ping), an exact type, or a
|
|
209
273
|
* prefix with `.*` (`member.*`, `app.*`, `app.crm.*`). `app.*` matches the
|
|
@@ -20,7 +20,7 @@ import { type CapabilitySecret } from "./capabilities.js";
|
|
|
20
20
|
export declare const INSTALL_OWNED_GATEWAY_SETTINGS: readonly ["GATEWAY_URL", "APP_BASE_DOMAIN", "BETTER_AUTH_SECRET", "JWT_PRIVATE_KEY", "JWT_PUBLIC_KEY", "GATEWAY_DEPLOYMENT_MODE", "CLOUDFLARE_ACCOUNT_ID", "THIRD_PARTY_DEPLOYS"];
|
|
21
21
|
export declare function isInstallOwnedGatewaySetting(name: string): boolean;
|
|
22
22
|
/** The Gateway's own optional settings `everyapp secret set` changes: nothing a provider reads. */
|
|
23
|
-
export declare const GATEWAY_OWN_SETTINGS: readonly ["
|
|
23
|
+
export declare const GATEWAY_OWN_SETTINGS: readonly ["EMAIL_REST_API_TOKEN", "RESEND_API_KEY", "EMAIL_PROVIDER", "EMAIL_FROM", "EMAIL_FROM_NAME", "MCP_OAUTH_ENABLED", "MCP_DCR_ENABLED", "MCP_ALLOWED_ORIGINS", "MCP_AUDIT_RETENTION_DAYS", "CLOUDFLARE_ACCESS_OIDC_ISSUER", "CLOUDFLARE_ACCESS_OIDC_CLIENT_ID", "CLOUDFLARE_ACCESS_OIDC_CLIENT_SECRET", "CLOUDFLARE_ACCESS_OIDC_LABEL", "CLOUDFLARE_ACCESS_TEAM_DOMAIN", "CLOUDFLARE_ACCESS_AUD", "CLOUDFLARE_ACCESS_APPS_AUD", "EMAIL_PASSWORD_SIGN_IN", "HOSTED_OPEN_SIGNUP", "CF_DEPLOY_TOKEN", "BROWSER_APP_INSTALLS", "DISPATCH_NAMESPACE", "THIRD_PARTY_DOMAIN", "EVENTS_ALLOW_PRIVATE_TARGETS"];
|
|
24
24
|
export type SettableGatewaySetting = Exclude<CapabilitySecret, (typeof INSTALL_OWNED_GATEWAY_SETTINGS)[number]> | (typeof GATEWAY_OWN_SETTINGS)[number];
|
|
25
25
|
/**
|
|
26
26
|
* The Gateway's optional settings `everyapp secret set` changes: every
|
|
@@ -29,20 +29,10 @@ export type SettableGatewaySetting = Exclude<CapabilitySecret, (typeof INSTALL_O
|
|
|
29
29
|
*/
|
|
30
30
|
export declare const SETTABLE_GATEWAY_SETTINGS: readonly SettableGatewaySetting[];
|
|
31
31
|
/**
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* registry
|
|
36
|
-
* names (`everyapp secret set` reads no registry to decide), an app's own
|
|
37
|
-
* secret can never take one (the manifest validator refuses the family),
|
|
38
|
-
* and a remote server can never be given a fixed provider key.
|
|
39
|
-
*/
|
|
40
|
-
export declare const REMOTE_MCP_SECRET_PATTERN: RegExp;
|
|
41
|
-
/** Whether `name` is a remote MCP app's credential name (`TREG_MCP_TOKEN`). */
|
|
42
|
-
export declare function isRemoteMcpSecretName(name: string): boolean;
|
|
43
|
-
/**
|
|
44
|
-
* Whether `everyapp secret set <name>` changes the Gateway: one of the
|
|
45
|
-
* fixed settings, or a remote MCP app's credential name.
|
|
32
|
+
* Whether `everyapp secret set <name>` changes the Gateway because the
|
|
33
|
+
* catalog or the Gateway itself reads it. A registered provider row's
|
|
34
|
+
* settings (a remote MCP app's `<APPID>_MCP_TOKEN` among them) are the
|
|
35
|
+
* registry's (`providerRegistry().settingNames()`), checked at run time.
|
|
46
36
|
*/
|
|
47
37
|
export declare function isSettableGatewaySetting(name: string): boolean;
|
|
48
38
|
/**
|
|
@@ -52,7 +42,7 @@ export declare function isSettableGatewaySetting(name: string): boolean;
|
|
|
52
42
|
* are typed and check their shape; anything else is a credential and
|
|
53
43
|
* stays hidden.
|
|
54
44
|
*/
|
|
55
|
-
export declare const PLAIN_GATEWAY_SETTINGS: readonly ["EMAIL_FROM", "EMAIL_FROM_NAME", "EMAIL_PROVIDER", "EMAIL_PASSWORD_SIGN_IN", "
|
|
45
|
+
export declare const PLAIN_GATEWAY_SETTINGS: readonly ["EMAIL_FROM", "EMAIL_FROM_NAME", "EMAIL_PROVIDER", "EMAIL_PASSWORD_SIGN_IN", "MCP_OAUTH_ENABLED", "MCP_DCR_ENABLED", "MCP_ALLOWED_ORIGINS", "MCP_AUDIT_RETENTION_DAYS", "CLOUDFLARE_ACCESS_OIDC_ISSUER", "CLOUDFLARE_ACCESS_OIDC_CLIENT_ID", "CLOUDFLARE_ACCESS_OIDC_LABEL", "CLOUDFLARE_ACCESS_TEAM_DOMAIN", "CLOUDFLARE_ACCESS_AUD", "CLOUDFLARE_ACCESS_APPS_AUD", "HOSTED_OPEN_SIGNUP", "BROWSER_APP_INSTALLS", "DISPATCH_NAMESPACE", "THIRD_PARTY_DOMAIN", "EVENTS_ALLOW_PRIVATE_TARGETS"];
|
|
56
46
|
/** Whether a settable Gateway setting's value is a plain value, not a credential. */
|
|
57
47
|
export declare function isPlainGatewaySetting(name: string): boolean;
|
|
58
48
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gatewaySettings.d.ts","sourceRoot":"","sources":["../../src/internal/gatewaySettings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAKL,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAM3B;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,mLASjC,CAAC;AAMX,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElE;AAmBD,mGAAmG;AACnG,eAAO,MAAM,oBAAoB,
|
|
1
|
+
{"version":3,"file":"gatewaySettings.d.ts","sourceRoot":"","sources":["../../src/internal/gatewaySettings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAKL,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAM3B;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,mLASjC,CAAC;AAMX,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElE;AAmBD,mGAAmG;AACnG,eAAO,MAAM,oBAAoB,+kBA+BvB,CAAC;AAEX,MAAM,MAAM,sBAAsB,GAC9B,OAAO,CAAC,gBAAgB,EAAE,CAAC,OAAO,8BAA8B,CAAC,CAAC,MAAM,CAAC,CAAC,GAC1E,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1C;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAE,SAAS,sBAAsB,EAItE,CAAC;AAIF;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,0eAoBmB,CAAC;AASvD,qFAAqF;AACrF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;;GAGG;AACH,eAAO,MAAM,4BAA4B,6EAIa,CAAC;AAIvD,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,iGAAiG;AACjG,eAAO,MAAM,yBAAyB,yDAI5B,CAAC;AAEX,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAmBD,iDAAiD;AACjD,eAAO,MAAM,8BAA8B,sFAC0C,CAAC;AAEtF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAM7D;AAED,4EAA4E;AAC5E,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAQ5E"}
|