@every-app/sdk 0.3.0-rc.1 → 0.3.0-rc.10

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.
Files changed (163) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -1
  3. package/dist/cloudflare/catalogSettings.generated.d.ts +81 -0
  4. package/dist/cloudflare/catalogSettings.generated.d.ts.map +1 -0
  5. package/dist/cloudflare/catalogSettings.generated.js +174 -0
  6. package/dist/cloudflare/index.d.ts +3 -2
  7. package/dist/cloudflare/index.d.ts.map +1 -1
  8. package/dist/cloudflare/index.js +4 -1
  9. package/dist/cloudflare/sentinel.d.ts +60 -2
  10. package/dist/cloudflare/sentinel.d.ts.map +1 -1
  11. package/dist/cloudflare/sentinel.js +37 -2
  12. package/dist/cloudflare/worker.d.ts +357 -63
  13. package/dist/cloudflare/worker.d.ts.map +1 -1
  14. package/dist/cloudflare/worker.js +363 -104
  15. package/dist/dev/index.d.ts +1 -1
  16. package/dist/dev/index.d.ts.map +1 -1
  17. package/dist/dev/index.js +1 -1
  18. package/dist/dev/keypair.d.ts +2 -0
  19. package/dist/dev/keypair.d.ts.map +1 -1
  20. package/dist/dev/keypair.js +2 -0
  21. package/dist/index.d.ts +6 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +5 -0
  24. package/dist/internal/aiDefault.d.ts +204 -0
  25. package/dist/internal/aiDefault.d.ts.map +1 -0
  26. package/dist/internal/aiDefault.js +334 -0
  27. package/dist/internal/aiProviders.d.ts +7 -2
  28. package/dist/internal/aiProviders.d.ts.map +1 -1
  29. package/dist/internal/aiProviders.js +17 -4
  30. package/dist/internal/appSettings.d.ts +82 -4
  31. package/dist/internal/appSettings.d.ts.map +1 -1
  32. package/dist/internal/appSettings.js +204 -29
  33. package/dist/internal/audit.d.ts +108 -0
  34. package/dist/internal/audit.d.ts.map +1 -0
  35. package/dist/internal/audit.js +235 -0
  36. package/dist/internal/capabilities.d.ts +2268 -438
  37. package/dist/internal/capabilities.d.ts.map +1 -1
  38. package/dist/internal/capabilities.js +128 -539
  39. package/dist/internal/catalog/commerce.d.ts +394 -0
  40. package/dist/internal/catalog/commerce.d.ts.map +1 -0
  41. package/dist/internal/catalog/commerce.js +477 -0
  42. package/dist/internal/catalog/comms.d.ts +375 -0
  43. package/dist/internal/catalog/comms.d.ts.map +1 -0
  44. package/dist/internal/catalog/comms.js +520 -0
  45. package/dist/internal/catalog/index.d.ts +1973 -0
  46. package/dist/internal/catalog/index.d.ts.map +1 -0
  47. package/dist/internal/catalog/index.js +19 -0
  48. package/dist/internal/catalog/inference.d.ts +393 -0
  49. package/dist/internal/catalog/inference.d.ts.map +1 -0
  50. package/dist/internal/catalog/inference.js +460 -0
  51. package/dist/internal/catalog/infra.d.ts +423 -0
  52. package/dist/internal/catalog/infra.d.ts.map +1 -0
  53. package/dist/internal/catalog/infra.js +543 -0
  54. package/dist/internal/catalog/search.d.ts +400 -0
  55. package/dist/internal/catalog/search.d.ts.map +1 -0
  56. package/dist/internal/catalog/search.js +463 -0
  57. package/dist/internal/devProviders.d.ts +2 -2
  58. package/dist/internal/devProviders.d.ts.map +1 -1
  59. package/dist/internal/devProviders.js +19 -1
  60. package/dist/internal/events.d.ts +13 -2
  61. package/dist/internal/events.d.ts.map +1 -1
  62. package/dist/internal/events.js +47 -4
  63. package/dist/internal/gatewaySettings.d.ts +3 -2
  64. package/dist/internal/gatewaySettings.d.ts.map +1 -1
  65. package/dist/internal/gatewaySettings.js +12 -6
  66. package/dist/internal/identity.d.ts +41 -4
  67. package/dist/internal/identity.d.ts.map +1 -1
  68. package/dist/internal/identity.js +48 -10
  69. package/dist/internal/index.d.ts +6 -1
  70. package/dist/internal/index.d.ts.map +1 -1
  71. package/dist/internal/index.js +6 -1
  72. package/dist/internal/members.d.ts +3 -2
  73. package/dist/internal/members.d.ts.map +1 -1
  74. package/dist/internal/oauthClient.d.ts +10 -12
  75. package/dist/internal/oauthClient.d.ts.map +1 -1
  76. package/dist/internal/oauthClient.js +20 -81
  77. package/dist/internal/oauthPresets.d.ts +33 -0
  78. package/dist/internal/oauthPresets.d.ts.map +1 -0
  79. package/dist/internal/oauthPresets.js +1064 -0
  80. package/dist/internal/oauthScopes.d.ts +56 -1
  81. package/dist/internal/oauthScopes.d.ts.map +1 -1
  82. package/dist/internal/oauthScopes.js +98 -4
  83. package/dist/internal/oauthSpec.d.ts +102 -0
  84. package/dist/internal/oauthSpec.d.ts.map +1 -0
  85. package/dist/internal/oauthSpec.js +789 -0
  86. package/dist/internal/protocol.d.ts +64 -1
  87. package/dist/internal/protocol.d.ts.map +1 -1
  88. package/dist/internal/protocol.js +51 -1
  89. package/dist/internal/providerRegistry.d.ts +77 -6
  90. package/dist/internal/providerRegistry.d.ts.map +1 -1
  91. package/dist/internal/providerRegistry.js +178 -8
  92. package/dist/internal/providerSpec.d.ts +18 -7
  93. package/dist/internal/providerSpec.d.ts.map +1 -1
  94. package/dist/internal/providerSpec.js +442 -34
  95. package/dist/internal/signInProviders.d.ts +104 -0
  96. package/dist/internal/signInProviders.d.ts.map +1 -0
  97. package/dist/internal/signInProviders.js +245 -0
  98. package/dist/manifest.d.ts +238 -0
  99. package/dist/manifest.d.ts.map +1 -0
  100. package/dist/manifest.js +30 -0
  101. package/dist/server/ai.d.ts +111 -0
  102. package/dist/server/ai.d.ts.map +1 -0
  103. package/dist/server/ai.js +145 -0
  104. package/dist/server/aiBinding.d.ts +68 -0
  105. package/dist/server/aiBinding.d.ts.map +1 -0
  106. package/dist/server/aiBinding.js +294 -0
  107. package/dist/server/attribution.d.ts +9 -5
  108. package/dist/server/attribution.d.ts.map +1 -1
  109. package/dist/server/attribution.js +12 -4
  110. package/dist/server/authorizeUrl.d.ts +1 -1
  111. package/dist/server/authorizeUrl.d.ts.map +1 -1
  112. package/dist/server/authorizeUrl.js +2 -6
  113. package/dist/server/connectUrl.d.ts +21 -0
  114. package/dist/server/connectUrl.d.ts.map +1 -0
  115. package/dist/server/connectUrl.js +37 -0
  116. package/dist/server/context.d.ts +68 -0
  117. package/dist/server/context.d.ts.map +1 -0
  118. package/dist/server/context.js +117 -0
  119. package/dist/server/emailBinding.d.ts +72 -0
  120. package/dist/server/emailBinding.d.ts.map +1 -0
  121. package/dist/server/emailBinding.js +124 -0
  122. package/dist/server/emit.d.ts +1 -1
  123. package/dist/server/emit.d.ts.map +1 -1
  124. package/dist/server/emit.js +7 -7
  125. package/dist/server/env.d.ts +44 -0
  126. package/dist/server/env.d.ts.map +1 -0
  127. package/dist/server/env.js +1 -0
  128. package/dist/server/everyApp.d.ts +27 -7
  129. package/dist/server/everyApp.d.ts.map +1 -1
  130. package/dist/server/everyApp.js +106 -5
  131. package/dist/server/fromMcpTools.d.ts +89 -0
  132. package/dist/server/fromMcpTools.d.ts.map +1 -0
  133. package/dist/server/fromMcpTools.js +192 -0
  134. package/dist/server/gatewayFetch.d.ts +42 -18
  135. package/dist/server/gatewayFetch.d.ts.map +1 -1
  136. package/dist/server/gatewayFetch.js +138 -19
  137. package/dist/server/gatewayUrl.d.ts +13 -0
  138. package/dist/server/gatewayUrl.d.ts.map +1 -0
  139. package/dist/server/gatewayUrl.js +34 -0
  140. package/dist/server/index.d.ts +15 -4
  141. package/dist/server/index.d.ts.map +1 -1
  142. package/dist/server/index.js +12 -2
  143. package/dist/server/integrationFetch.d.ts +70 -39
  144. package/dist/server/integrationFetch.d.ts.map +1 -1
  145. package/dist/server/integrationFetch.js +244 -82
  146. package/dist/server/listMembers.d.ts +1 -1
  147. package/dist/server/listMembers.d.ts.map +1 -1
  148. package/dist/server/listMembers.js +8 -11
  149. package/dist/server/refusal.d.ts +55 -0
  150. package/dist/server/refusal.d.ts.map +1 -0
  151. package/dist/server/refusal.js +193 -0
  152. package/dist/server/sendEmail.d.ts +1 -1
  153. package/dist/server/sendEmail.d.ts.map +1 -1
  154. package/dist/server/sendEmail.js +7 -7
  155. package/dist/server/toolsEndpoint.d.ts.map +1 -1
  156. package/dist/server/toolsEndpoint.js +11 -5
  157. package/dist/tanstack-start/index.d.ts +9 -0
  158. package/dist/tanstack-start/index.d.ts.map +1 -0
  159. package/dist/tanstack-start/index.js +29 -0
  160. package/dist/testing/index.d.ts +93 -0
  161. package/dist/testing/index.d.ts.map +1 -0
  162. package/dist/testing/index.js +156 -0
  163. package/package.json +35 -14
@@ -0,0 +1,463 @@
1
+ export const SEARCH = {
2
+ firecrawl: {
3
+ mode: "api_key",
4
+ label: "Firecrawl",
5
+ description: "Scrapes, crawls, maps and searches the web, returning clean markdown or structured data.",
6
+ auth: {
7
+ kind: "bearer",
8
+ secret: "FIRECRAWL_API_KEY",
9
+ },
10
+ docs: "https://www.firecrawl.dev/app/api-keys",
11
+ api: "https://docs.firecrawl.dev/api-reference/introduction",
12
+ hosts: ["api.firecrawl.dev"],
13
+ data: "per-call",
14
+ access: ["read", "write"],
15
+ readMethods: ["GET", "POST"],
16
+ writeMethods: ["DELETE"],
17
+ accountWidePaths: [
18
+ ["team"],
19
+ ["crawl", "active"],
20
+ ["monitor"],
21
+ ["agent"],
22
+ ["interact"],
23
+ ["support", "ask"],
24
+ ],
25
+ hint: "An API key from Firecrawl's API keys page; the Gateway sends it as a bearer token. Scrape, crawl, map, search and extract are POSTs and job status is a GET; cancelling a crawl or batch (DELETE) needs write.",
26
+ secrets: [
27
+ {
28
+ name: "FIRECRAWL_API_KEY",
29
+ hint: "An API key from Firecrawl's API keys page; it starts with fc-.",
30
+ },
31
+ ],
32
+ smoke: {
33
+ method: "GET",
34
+ path: "/v2/team/credit-usage",
35
+ expect: [200],
36
+ free: true,
37
+ note: "Remaining credits; account-wide, so the Gateway refuses it for apps: run it from the person's terminal.",
38
+ },
39
+ cost: {
40
+ unit: "result",
41
+ note: "Credits: 1 per page scraped or crawled, 1 per map call, 2 per 10 search results; JSON extraction and other options add more.",
42
+ },
43
+ rate: {
44
+ note: "Per team per minute, by plan: /scrape 10 on Free, 100 Hobby, 500 Standard, 5,000 Growth; /crawl 2, 20, 100, 1,000.",
45
+ },
46
+ example: "scrape https://example.com/pricing into markdown",
47
+ verified: {
48
+ on: "2026-10-25",
49
+ how: "docs",
50
+ },
51
+ tags: ["scrape", "crawl", "search"],
52
+ },
53
+ exa: {
54
+ mode: "api_key",
55
+ label: "Exa",
56
+ description: "Web search built for AI: search results, page contents, similar links and cited answers.",
57
+ auth: {
58
+ kind: "header",
59
+ secret: "EXA_API_KEY",
60
+ header: "x-api-key",
61
+ },
62
+ docs: "https://dashboard.exa.ai/api-keys",
63
+ api: "https://exa.ai/docs/reference/search",
64
+ hosts: ["api.exa.ai"],
65
+ data: "per-call",
66
+ access: ["read"],
67
+ readMethods: ["POST"],
68
+ accountWidePaths: [["websets"], ["monitors"], ["agent"], ["batches"]],
69
+ hint: "An API key from the Exa dashboard (the free tier gives $10 of credit a month); the Gateway sends it in the x-api-key header. Search, contents, find-similar and answer are POSTs.",
70
+ secrets: [
71
+ {
72
+ name: "EXA_API_KEY",
73
+ hint: "An API key from the API keys page of the Exa dashboard.",
74
+ },
75
+ ],
76
+ smoke: {
77
+ method: "GET",
78
+ path: "/websets/v0/teams/me",
79
+ expect: [200],
80
+ free: true,
81
+ note: "Team info under the Websets API (the docs page leaves out the /websets prefix); account-wide, so run it from the person's terminal.",
82
+ },
83
+ cost: {
84
+ unit: "call",
85
+ usd: 0.007,
86
+ note: "Search $7 per 1k (auto and fast; lite $4), contents $1 per 1k pages, answer $5 per 1k; up to 10 results included.",
87
+ },
88
+ rate: {
89
+ perSecond: 10,
90
+ note: "Per team: /search and /answer 10 QPS, deep search 5, /contents 100.",
91
+ },
92
+ example: "find recent articles about solid-state batteries",
93
+ verified: {
94
+ on: "2026-10-25",
95
+ how: "docs",
96
+ },
97
+ tags: ["search"],
98
+ },
99
+ tavily: {
100
+ mode: "api_key",
101
+ label: "Tavily",
102
+ description: "Web search, page extraction, crawling and site maps for AI agents, plus research reports.",
103
+ auth: {
104
+ kind: "bearer",
105
+ secret: "TAVILY_API_KEY",
106
+ },
107
+ docs: "https://app.tavily.com",
108
+ api: "https://docs.tavily.com/documentation/api-reference/endpoint/search",
109
+ hosts: ["api.tavily.com"],
110
+ data: "per-call",
111
+ access: ["read"],
112
+ readMethods: ["GET", "POST"],
113
+ accountWidePaths: [["usage"], ["logs"], ["org-usage"]],
114
+ hint: "An API key from app.tavily.com (1,000 free credits a month); the Gateway sends it as a bearer token. Search, extract, crawl, map and research are POSTs; a research result is a GET.",
115
+ secrets: [
116
+ {
117
+ name: "TAVILY_API_KEY",
118
+ hint: "An API key from the Tavily dashboard; it starts with tvly-.",
119
+ },
120
+ ],
121
+ smoke: {
122
+ method: "GET",
123
+ path: "/usage",
124
+ expect: [200],
125
+ free: true,
126
+ note: "Key and account usage, not an endpoint that costs credits; account-wide, so run it from the person's terminal (10 calls per 10 minutes).",
127
+ },
128
+ cost: {
129
+ unit: "call",
130
+ usd: 0.008,
131
+ note: "Pay as you go $0.008 per credit: basic search 1 credit, advanced 2; extract 1 credit per 5 URLs; map 1 per 10 pages.",
132
+ },
133
+ rate: {
134
+ perMinute: 100,
135
+ note: "Development keys 100 per minute, production keys 1,000; crawl 100 and research 20 per minute for both.",
136
+ },
137
+ example: "search the web for this week's news on EU AI rules",
138
+ verified: {
139
+ on: "2026-10-25",
140
+ how: "docs",
141
+ },
142
+ tags: ["search", "scrape"],
143
+ },
144
+ // Unverified: Serper publishes no API reference; the request shape is read from its playground.
145
+ serper: {
146
+ mode: "api_key",
147
+ label: "Serper",
148
+ description: "Google search results as JSON: web, news, images, places, shopping, scholar and patents.",
149
+ auth: {
150
+ kind: "header",
151
+ secret: "SERPER_API_KEY",
152
+ header: "X-API-KEY",
153
+ },
154
+ docs: "https://serper.dev/api-keys",
155
+ api: "https://serper.dev/playground",
156
+ hosts: ["google.serper.dev", "scrape.serper.dev"],
157
+ data: "per-call",
158
+ access: ["read"],
159
+ readMethods: ["POST"],
160
+ accountWidePaths: [],
161
+ hint: 'An API key from serper.dev (2,500 free queries to start); the Gateway sends it in the X-API-KEY header. Every search is a POST to google.serper.dev/<type> (search, news, images, places, …) with a JSON body such as {"q": "…"}.',
162
+ secrets: [
163
+ {
164
+ name: "SERPER_API_KEY",
165
+ hint: "The API key on serper.dev's API keys page.",
166
+ },
167
+ ],
168
+ cost: {
169
+ unit: "call",
170
+ usd: 0.001,
171
+ note: "Prepaid credits, one per successful query: $1.00 per 1k on the 50k pack, down to $0.30 per 1k on the largest.",
172
+ },
173
+ rate: {
174
+ perSecond: 50,
175
+ note: "Starter credits 50 queries per second; Standard 100, Scale 200, Ultimate 300.",
176
+ },
177
+ example: "get the top Google results for best project management software",
178
+ verified: false,
179
+ tags: ["search", "serp"],
180
+ },
181
+ "brave-search": {
182
+ mode: "api_key",
183
+ label: "Brave Search",
184
+ description: "Brave's independent web index: web, news, images, videos, places, LLM context and answers.",
185
+ auth: {
186
+ kind: "header",
187
+ secret: "BRAVE_SEARCH_API_KEY",
188
+ header: "X-Subscription-Token",
189
+ },
190
+ docs: "https://api-dashboard.search.brave.com/app/keys",
191
+ api: "https://api-dashboard.search.brave.com/documentation",
192
+ hosts: ["api.search.brave.com"],
193
+ data: "per-call",
194
+ access: ["read"],
195
+ readMethods: ["GET", "POST"],
196
+ accountWidePaths: [],
197
+ hint: "Activate a plan (it includes $5 of free credit a month), then create a key under API Keys; the Gateway sends it in the X-Subscription-Token header. Searches are GETs (POST works too); answers are a POST to /res/v1/chat/completions.",
198
+ secrets: [
199
+ {
200
+ name: "BRAVE_SEARCH_API_KEY",
201
+ hint: "A key from the API Keys section of the Brave Search API dashboard, made after activating a plan.",
202
+ },
203
+ ],
204
+ cost: {
205
+ unit: "call",
206
+ usd: 0.005,
207
+ note: "Search $5 per 1k requests; Answers $4 per 1k plus $5 per million tokens; $5 free credit a month; only successful calls count.",
208
+ },
209
+ rate: {
210
+ perSecond: 50,
211
+ note: "Search plan 50 queries per second; Answers 2 per second.",
212
+ },
213
+ example: "search the web for the latest Cloudflare Workers release notes",
214
+ verified: {
215
+ on: "2026-10-25",
216
+ how: "docs",
217
+ },
218
+ tags: ["search"],
219
+ },
220
+ apify: {
221
+ mode: "api_key",
222
+ label: "Apify",
223
+ description: "Runs Apify Actors (ready-made scrapers and automations) and reads their datasets and stores.",
224
+ auth: {
225
+ kind: "bearer",
226
+ secret: "APIFY_API_TOKEN",
227
+ },
228
+ docs: "https://console.apify.com/settings/integrations",
229
+ api: "https://docs.apify.com/api/v2",
230
+ hosts: ["api.apify.com"],
231
+ data: "account",
232
+ access: ["read", "write"],
233
+ readMethods: ["GET", "HEAD"],
234
+ writeMethods: ["POST", "PUT", "DELETE"],
235
+ accountWidePaths: [
236
+ ["users"],
237
+ ["webhooks"],
238
+ ["webhook-dispatches"],
239
+ ["env-vars"],
240
+ ],
241
+ hint: "The API token from Apify Console, Settings > API & Integrations; the Gateway sends it as a bearer token. Reading Actors, runs and datasets needs read; starting a run is a POST, so it needs write.",
242
+ secrets: [
243
+ {
244
+ name: "APIFY_API_TOKEN",
245
+ hint: "The API token under Settings > API & Integrations in Apify Console.",
246
+ },
247
+ ],
248
+ smoke: {
249
+ method: "GET",
250
+ path: "/v2/users/me",
251
+ expect: [200],
252
+ free: true,
253
+ note: "The docs' verify call; account-wide, so the Gateway refuses it for apps: run it from the person's terminal.",
254
+ },
255
+ rate: {
256
+ perSecond: 60,
257
+ note: "60 requests per second per resource (one Actor, run, dataset or store); 250,000 requests per minute per user overall.",
258
+ },
259
+ example: "run the Google Maps scraper Actor for coffee shops in Austin and list the results",
260
+ verified: {
261
+ on: "2026-10-25",
262
+ how: "docs",
263
+ },
264
+ tags: ["scrape", "automation"],
265
+ },
266
+ deepgram: {
267
+ mode: "api_key",
268
+ label: "Deepgram",
269
+ description: "Speech to text, text to speech and text analysis.",
270
+ auth: {
271
+ kind: "bearer",
272
+ secret: "DEEPGRAM_API_KEY",
273
+ scheme: "Token",
274
+ },
275
+ docs: "https://console.deepgram.com/",
276
+ api: "https://developers.deepgram.com/reference/deepgram-api-overview",
277
+ hosts: [
278
+ "api.deepgram.com",
279
+ "api.eu.deepgram.com",
280
+ "api.au.deepgram.com",
281
+ "api.in.deepgram.com",
282
+ ],
283
+ data: "per-call",
284
+ access: ["read"],
285
+ readMethods: ["GET", "POST"],
286
+ accountWidePaths: [["projects"], ["auth", "grant"]],
287
+ hint: "An API key from the Deepgram Console; the Gateway sends it as Authorization: Token <key>, and the EU, Australia and India hosts take the same key. Transcription (/v1/listen), speech (/v1/speak) and text analysis (/v1/read) are POSTs.",
288
+ secrets: [
289
+ {
290
+ name: "DEEPGRAM_API_KEY",
291
+ hint: "A project API key created in the Deepgram Console.",
292
+ },
293
+ ],
294
+ smoke: {
295
+ method: "GET",
296
+ path: "/v1/models",
297
+ expect: [200],
298
+ free: true,
299
+ note: "Lists the public models; it needs the key and processes no audio.",
300
+ },
301
+ cost: {
302
+ unit: "call",
303
+ note: "Nova-3 pre-recorded $0.0043 per audio minute (pay as you go); Aura-2 speech $0.030 per 1k characters; $200 free credit.",
304
+ },
305
+ rate: {
306
+ note: "Concurrency per project on pay as you go: 50 pre-recorded transcriptions, 15 text-to-speech requests.",
307
+ },
308
+ example: "transcribe this podcast episode and label the speakers",
309
+ verified: {
310
+ on: "2026-10-25",
311
+ how: "docs",
312
+ },
313
+ tags: ["speech", "transcription"],
314
+ },
315
+ elevenlabs: {
316
+ mode: "api_key",
317
+ label: "ElevenLabs",
318
+ description: "Text to speech, speech to text, sound effects, music and voice changing.",
319
+ auth: {
320
+ kind: "header",
321
+ secret: "ELEVENLABS_API_KEY",
322
+ header: "xi-api-key",
323
+ },
324
+ docs: "https://elevenlabs.io/app/settings/api-keys",
325
+ api: "https://elevenlabs.io/docs/api-reference/introduction",
326
+ hosts: ["api.elevenlabs.io"],
327
+ data: "per-call",
328
+ access: ["read"],
329
+ readMethods: ["GET", "POST"],
330
+ accountWidePaths: [
331
+ ["v1", "user"],
332
+ ["v1", "usage"],
333
+ ["v1", "workspace"],
334
+ ["v1", "workspaces"],
335
+ ["v1", "service-accounts"],
336
+ ["v1", "history"],
337
+ ["v1", "single-use-token"],
338
+ ["v1", "convai"],
339
+ ["v1", "dubbing"],
340
+ ["v1", "studio"],
341
+ ["v1", "pronunciation-dictionaries"],
342
+ ["v1", "voices", "add"],
343
+ ["v1", "voices", "pvc"],
344
+ ["v1", "voices", "collections"],
345
+ ["edit"],
346
+ ["replicate-to-isolated-environment"],
347
+ ["v1", "text-to-voice"],
348
+ ["v1", "audio-native"],
349
+ ["v1", "productions"],
350
+ ["v1", "speech-engine"],
351
+ ["v1", "music", "finetunes"],
352
+ ["v1", "flows"],
353
+ ["v1", "assets"],
354
+ ["v1", "audio-isolation", "history"],
355
+ ],
356
+ hint: "An API key from ElevenLabs' API keys page; the Gateway sends it in the xi-api-key header. Speech, transcription and sound generation are POSTs; listing voices and models are GETs.",
357
+ secrets: [
358
+ {
359
+ name: "ELEVENLABS_API_KEY",
360
+ hint: "An API key from ElevenLabs' API keys page; it can be scoped to the endpoints the app uses and given a credit cap.",
361
+ },
362
+ ],
363
+ smoke: {
364
+ method: "GET",
365
+ path: "/v1/models",
366
+ expect: [200],
367
+ free: true,
368
+ note: "The first request in ElevenLabs' authentication docs; it generates nothing.",
369
+ },
370
+ example: "read this paragraph aloud in a calm narrator voice",
371
+ verified: {
372
+ on: "2026-10-25",
373
+ how: "docs",
374
+ },
375
+ tags: ["speech", "audio"],
376
+ },
377
+ // `account`, not per-call: GET /v2/transcript lists every transcript on the account and shares its segment with /v2/transcript/<id>.
378
+ assemblyai: {
379
+ mode: "api_key",
380
+ label: "AssemblyAI",
381
+ description: "Transcribes recorded audio and video, with speaker labels, redaction and subtitles.",
382
+ auth: {
383
+ kind: "header",
384
+ secret: "ASSEMBLYAI_API_KEY",
385
+ header: "Authorization",
386
+ },
387
+ docs: "https://www.assemblyai.com/dashboard/home",
388
+ api: "https://www.assemblyai.com/docs",
389
+ hosts: ["api.assemblyai.com", "api.eu.assemblyai.com"],
390
+ data: "account",
391
+ access: ["read", "write"],
392
+ readMethods: ["GET", "POST"],
393
+ writeMethods: ["DELETE"],
394
+ accountWidePaths: [],
395
+ hint: "The API key from your AssemblyAI dashboard; the Gateway sends it as the whole Authorization header, with no Bearer word. Audio is submitted with a POST to /v2/transcript and the app polls GET /v2/transcript/<id>; deleting a transcript needs write.",
396
+ secrets: [
397
+ {
398
+ name: "ASSEMBLYAI_API_KEY",
399
+ hint: "The API key on your AssemblyAI dashboard.",
400
+ },
401
+ ],
402
+ smoke: {
403
+ method: "GET",
404
+ path: "/v2/transcript?limit=1",
405
+ expect: [200],
406
+ free: true,
407
+ note: "Lists the account's latest transcript; it transcribes nothing.",
408
+ },
409
+ cost: {
410
+ unit: "call",
411
+ note: "Per hour of audio submitted: Universal-3.5 Pro $0.21, Universal-2 $0.15; the free tier covers up to 185 hours of pre-recorded audio.",
412
+ },
413
+ rate: {
414
+ perMinute: 4000,
415
+ note: "20,000 requests per 5 minutes per account; 5 transcriptions in parallel on free accounts, 200 or more on paid.",
416
+ },
417
+ example: "transcribe this sales call recording with speaker labels",
418
+ verified: {
419
+ on: "2026-10-25",
420
+ how: "docs",
421
+ },
422
+ tags: ["speech", "transcription"],
423
+ },
424
+ newsapi: {
425
+ mode: "api_key",
426
+ label: "NewsAPI",
427
+ description: "Searches news articles and live headlines from over 150,000 sources.",
428
+ auth: {
429
+ kind: "header",
430
+ secret: "NEWSAPI_API_KEY",
431
+ header: "X-Api-Key",
432
+ },
433
+ docs: "https://newsapi.org/register",
434
+ api: "https://newsapi.org/docs",
435
+ hosts: ["newsapi.org"],
436
+ data: "per-call",
437
+ access: ["read"],
438
+ readMethods: ["GET"],
439
+ accountWidePaths: [],
440
+ hint: "An API key from newsapi.org/register; the Gateway sends it in the X-Api-Key header. The free Developer plan allows 100 requests a day, delays articles by 24 hours and is for development only; production needs a paid plan.",
441
+ secrets: [
442
+ {
443
+ name: "NEWSAPI_API_KEY",
444
+ hint: "The API key NewsAPI shows after you register.",
445
+ },
446
+ ],
447
+ cost: {
448
+ unit: "call",
449
+ usd: 0.0018,
450
+ note: "Developer plan free (100 requests a day, development only); Business $449 a month for 250,000 requests, then $0.0018 each.",
451
+ },
452
+ rate: {
453
+ perDay: 100,
454
+ note: "Developer plan; Business includes 250,000 requests a month, Advanced 2,000,000.",
455
+ },
456
+ example: "find today's top business headlines in the US",
457
+ verified: {
458
+ on: "2026-10-25",
459
+ how: "docs",
460
+ },
461
+ tags: ["news"],
462
+ },
463
+ };
@@ -16,7 +16,7 @@
16
16
  * doesn't parse is ignored until an app asks for its id, which then gets
17
17
  * a ConfigurationError naming the file.
18
18
  */
19
- import type { ApiKeyCapability } from "./capabilities.js";
19
+ import { type RegistrableCapability } from "./providerSpec.js";
20
20
  /** The dev Worker's binding holding the specs (a copy is in ../cloudflare/worker.ts, kept in step by a test). */
21
21
  export declare const DEV_PROVIDERS_ENV = "EVERYAPP_DEV_PROVIDERS";
22
22
  /** Where the specs live in an app, relative to its directory. */
@@ -33,7 +33,7 @@ export declare function devProviderFile(id: string): string;
33
33
  /** A registered provider resolved for local development, or why it can't be. */
34
34
  export type DevProviderLookup = {
35
35
  found: true;
36
- capability: ApiKeyCapability;
36
+ capability: RegistrableCapability;
37
37
  file: string;
38
38
  } | {
39
39
  found: false;
@@ -1 +1 @@
1
- {"version":3,"file":"devProviders.d.ts","sourceRoot":"","sources":["../../src/internal/devProviders.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,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,gBAAgB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC3D;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,CA+BnB"}
1
+ {"version":3,"file":"devProviders.d.ts","sourceRoot":"","sources":["../../src/internal/devProviders.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,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,EAAE,MAAM,CAAA;CAAE,GAChE;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,CA+BnB"}
@@ -1,4 +1,22 @@
1
- import { describeSpecProblems, parseProviderSpec } from "./providerSpec.js";
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
+ import { describeSpecProblems, parseProviderSpec, } from "./providerSpec.js";
2
20
  /** The dev Worker's binding holding the specs (a copy is in ../cloudflare/worker.ts, kept in step by a test). */
3
21
  export const DEV_PROVIDERS_ENV = "EVERYAPP_DEV_PROVIDERS";
4
22
  /** Where the specs live in an app, relative to its directory. */
@@ -9,7 +9,7 @@
9
9
  * apps/every-app-gateway/src/server/events/catalogue.ts; this module knows
10
10
  * the names, versions and one-line descriptions only.
11
11
  */
12
- export type EventGroup = "member" | "app" | "cap" | "tool" | "connection" | "token" | "access" | "mcp_app" | "provider" | "ping";
12
+ export type EventGroup = "member" | "organization" | "app" | "cap" | "group" | "tool" | "connection" | "token" | "access" | "signin_provider" | "mcp_app" | "provider" | "subscription" | "ai" | "ping";
13
13
  export interface EventTypeInfo {
14
14
  /** `member.joined`, `cap.reached`, … */
15
15
  readonly type: string;
@@ -56,8 +56,19 @@ export declare const EVENT_SUBSCRIPTIONS_MAX = 25;
56
56
  /** A webhook signing secret's length. */
57
57
  export declare const EVENT_SECRET_MIN_LENGTH = 16;
58
58
  export declare const EVENT_SECRET_MAX_LENGTH = 128;
59
- /** Events and deliveries are kept this long. */
59
+ /**
60
+ * Deliveries (the queue and its log) are kept this long. Events themselves
61
+ * are the audit log and live longer ({@link AUDIT_RETENTION_DAYS}).
62
+ */
60
63
  export declare const EVENT_RETENTION_DAYS = 30;
64
+ /**
65
+ * Events are kept this long: Admin → Activity → Audit, `everyapp workspace
66
+ * audit` and `everyapp_workspace_audit` read them back. A constant, not a
67
+ * setting.
68
+ */
69
+ export declare const AUDIT_RETENTION_DAYS = 90;
70
+ /** The most audit rows one page carries, on every surface. */
71
+ export declare const AUDIT_PAGE_MAX = 200;
61
72
  /** A subscription's URL. */
62
73
  export declare const EVENT_URL_MAX_LENGTH = 2048;
63
74
  /** A subscription's name. */
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/internal/events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/internal/events.ts"],"names":[],"mappings":"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"}
@@ -24,29 +24,58 @@ export const EVENT_TYPES = [
24
24
  entry("member", "member.reactivated", "A member was reactivated"),
25
25
  entry("member", "member.removed", "A member was removed"),
26
26
  entry("member", "member.password_reset", "A member reset their password"),
27
+ entry("member", "member.invitation_cancelled", "A pending invitation was cancelled"),
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"),
27
30
  entry("app", "app.installed", "An app was installed on the Gateway"),
28
31
  entry("app", "app.updated", "An app was redeployed"),
32
+ entry("app", "app.live", "An app went live on the Gateway"),
29
33
  entry("app", "app.removed", "An app was removed from the Gateway"),
30
34
  entry("app", "app.needs_setup", "An app needs a setting before it opens"),
31
35
  entry("app", "app.ready", "An app has every setting it needs"),
32
36
  entry("app", "app.paused_cap", "An app is paused: its monthly cap is reached"),
33
37
  entry("app", "app.tools_changed", "An app's AI tools changed"),
38
+ entry("app", "app.renamed", "An app's name or description changed"),
39
+ entry("app", "app.settings_changed", "An app's settings were set or unset (names only)"),
40
+ entry("app", "app.access_changed", "Who can open an app changed"),
41
+ entry("app", "app.email_changed", "An app's email senders or inbound changed"),
34
42
  entry("cap", "cap.warning", "An app is at 80% of its monthly cap"),
35
43
  entry("cap", "cap.reached", "An app reached its monthly cap"),
36
44
  entry("cap", "cap.raised", "An app's monthly cap, or the workspace default, was raised or removed"),
45
+ entry("cap", "cap.changed", "An app's monthly cap, or the workspace default, was set or lowered"),
46
+ entry("group", "group.created", "A group was created"),
47
+ entry("group", "group.updated", "A group was renamed or described"),
48
+ entry("group", "group.removed", "A group was removed"),
49
+ entry("group", "group.members_changed", "A group's members changed"),
50
+ entry("group", "group.apps_changed", "The apps a group opens changed"),
37
51
  entry("tool", "tool.blocked", "An AI client's tool call was blocked"),
38
52
  entry("tool", "tool.error", "An AI client's tool call failed"),
39
53
  entry("connection", "connection.created", "An AI app was connected"),
40
54
  entry("connection", "connection.revoked", "An AI app connection was revoked"),
55
+ entry("connection", "connection.used", "Linked dev used the Gateway's services (first call of the day)"),
41
56
  entry("token", "token.created", "A personal access token was created"),
42
57
  entry("token", "token.revoked", "A personal access token was revoked"),
43
58
  entry("access", "access.changed", "Cloudflare Access was turned on or off"),
59
+ entry("signin_provider", "signin_provider.added", "A sign-in provider (Continue with Google, …) was turned on"),
60
+ entry("signin_provider", "signin_provider.removed", "A sign-in provider was turned off"),
44
61
  entry("mcp_app", "mcp_app.added", "An MCP app was added"),
45
62
  entry("mcp_app", "mcp_app.removed", "An MCP app was removed"),
46
63
  entry("mcp_app", "mcp_app.enabled", "An MCP app is being served again"),
47
64
  entry("mcp_app", "mcp_app.disabled", "An MCP app stopped being served"),
48
- entry("provider", "provider.added", "An API provider was registered"),
49
- entry("provider", "provider.removed", "An API provider was removed"),
65
+ entry("mcp_app", "mcp_app.updated", "An MCP app's risk default, name or description changed"),
66
+ entry("mcp_app", "mcp_app.tool_changed", "One tool of an MCP app was overridden: its risk, or on/off"),
67
+ entry("provider", "provider.added", "A provider was registered"),
68
+ entry("provider", "provider.removed", "A provider was removed"),
69
+ entry("provider", "provider.updated", "A provider's spec or OAuth client was replaced"),
70
+ entry("provider", "provider.connected", "Someone connected an account at an OAuth provider"),
71
+ entry("provider", "provider.disconnected", "An OAuth provider account was disconnected"),
72
+ entry("provider", "provider.connection_expired", "An OAuth provider refused to refresh a connection; it needs reconnecting"),
73
+ entry("subscription", "subscription.created", "An event subscription was added"),
74
+ entry("subscription", "subscription.updated", "An event subscription was changed, paused or resumed"),
75
+ entry("subscription", "subscription.removed", "An event subscription was removed"),
76
+ entry("subscription", "subscription.redelivered", "A delivery was queued again by hand"),
77
+ entry("ai", "ai.default_changed", "The default model provider changed"),
78
+ entry("ai", "ai.model_changed", "A provider's default model changed"),
50
79
  entry("ping", "ping", "A test event, sent to one subscription on request"),
51
80
  ];
52
81
  const typesByName = new Map(EVENT_TYPES.map((info) => [info.type, info]));
@@ -99,8 +128,19 @@ export const EVENT_SUBSCRIPTIONS_MAX = 25;
99
128
  /** A webhook signing secret's length. */
100
129
  export const EVENT_SECRET_MIN_LENGTH = 16;
101
130
  export const EVENT_SECRET_MAX_LENGTH = 128;
102
- /** Events and deliveries are kept this long. */
131
+ /**
132
+ * Deliveries (the queue and its log) are kept this long. Events themselves
133
+ * are the audit log and live longer ({@link AUDIT_RETENTION_DAYS}).
134
+ */
103
135
  export const EVENT_RETENTION_DAYS = 30;
136
+ /**
137
+ * Events are kept this long: Admin → Activity → Audit, `everyapp workspace
138
+ * audit` and `everyapp_workspace_audit` read them back. A constant, not a
139
+ * setting.
140
+ */
141
+ export const AUDIT_RETENTION_DAYS = 90;
142
+ /** The most audit rows one page carries, on every surface. */
143
+ export const AUDIT_PAGE_MAX = 200;
104
144
  /** A subscription's URL. */
105
145
  export const EVENT_URL_MAX_LENGTH = 2048;
106
146
  /** A subscription's name. */
@@ -172,8 +212,11 @@ export const EVENT_EMAIL_RECIPIENTS = ["owners", "admins"];
172
212
  * gateway's app events and every app's own.
173
213
  */
174
214
  export function eventPatternMatches(pattern, type) {
215
+ // Everything but a test ping and the bus's own housekeeping: a webhook
216
+ // hears about subscriptions only when it names `subscription.*`, so a
217
+ // catch-all's first delivery is the event it was made for, not itself.
175
218
  if (pattern === "*")
176
- return type !== "ping";
219
+ return type !== "ping" && !type.startsWith("subscription.");
177
220
  if (pattern.endsWith(".*")) {
178
221
  return type.startsWith(pattern.slice(0, -1));
179
222
  }