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

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 (181) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +62 -64
  3. package/dist/cloudflare/catalogSettings.generated.d.ts +84 -0
  4. package/dist/cloudflare/catalogSettings.generated.d.ts.map +1 -0
  5. package/dist/cloudflare/catalogSettings.generated.js +175 -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 +391 -63
  13. package/dist/cloudflare/worker.d.ts.map +1 -1
  14. package/dist/cloudflare/worker.js +394 -108
  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 +205 -0
  25. package/dist/internal/aiDefault.d.ts.map +1 -0
  26. package/dist/internal/aiDefault.js +335 -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 +19 -6
  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 +2261 -815
  37. package/dist/internal/capabilities.d.ts.map +1 -1
  38. package/dist/internal/capabilities.js +122 -1034
  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 +2008 -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 +458 -0
  52. package/dist/internal/catalog/infra.d.ts.map +1 -0
  53. package/dist/internal/catalog/infra.js +608 -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 +65 -3
  61. package/dist/internal/events.d.ts.map +1 -1
  62. package/dist/internal/events.js +110 -5
  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/oauthBuiltIns.d.ts +101 -0
  75. package/dist/internal/oauthBuiltIns.d.ts.map +1 -0
  76. package/dist/internal/oauthBuiltIns.js +122 -0
  77. package/dist/internal/oauthClient.d.ts +8 -50
  78. package/dist/internal/oauthClient.d.ts.map +1 -1
  79. package/dist/internal/oauthClient.js +2 -177
  80. package/dist/internal/oauthPresets.d.ts +32 -0
  81. package/dist/internal/oauthPresets.d.ts.map +1 -0
  82. package/dist/internal/oauthPresets.js +253 -0
  83. package/dist/internal/oauthScopes.d.ts +43 -100
  84. package/dist/internal/oauthScopes.d.ts.map +1 -1
  85. package/dist/internal/oauthScopes.js +83 -382
  86. package/dist/internal/oauthSpec.d.ts +103 -0
  87. package/dist/internal/oauthSpec.d.ts.map +1 -0
  88. package/dist/internal/oauthSpec.js +520 -0
  89. package/dist/internal/protocol.d.ts +97 -5
  90. package/dist/internal/protocol.d.ts.map +1 -1
  91. package/dist/internal/protocol.js +89 -1
  92. package/dist/internal/providerRegistry.d.ts +17 -6
  93. package/dist/internal/providerRegistry.d.ts.map +1 -1
  94. package/dist/internal/providerRegistry.js +71 -8
  95. package/dist/internal/providerSpec.d.ts +18 -7
  96. package/dist/internal/providerSpec.d.ts.map +1 -1
  97. package/dist/internal/providerSpec.js +420 -34
  98. package/dist/internal/remoteMcp.d.ts.map +1 -1
  99. package/dist/internal/remoteMcp.js +1 -5
  100. package/dist/internal/signInProviders.d.ts +104 -0
  101. package/dist/internal/signInProviders.d.ts.map +1 -0
  102. package/dist/internal/signInProviders.js +245 -0
  103. package/dist/internal/tools.d.ts +5 -4
  104. package/dist/internal/tools.d.ts.map +1 -1
  105. package/dist/internal/tools.js +4 -3
  106. package/dist/manifest.d.ts +267 -0
  107. package/dist/manifest.d.ts.map +1 -0
  108. package/dist/manifest.js +30 -0
  109. package/dist/server/ai.d.ts +111 -0
  110. package/dist/server/ai.d.ts.map +1 -0
  111. package/dist/server/ai.js +145 -0
  112. package/dist/server/aiBinding.d.ts +68 -0
  113. package/dist/server/aiBinding.d.ts.map +1 -0
  114. package/dist/server/aiBinding.js +294 -0
  115. package/dist/server/attribution.d.ts +18 -5
  116. package/dist/server/attribution.d.ts.map +1 -1
  117. package/dist/server/attribution.js +19 -5
  118. package/dist/server/connectUrl.d.ts +16 -0
  119. package/dist/server/connectUrl.d.ts.map +1 -0
  120. package/dist/server/connectUrl.js +40 -0
  121. package/dist/server/context.d.ts +68 -0
  122. package/dist/server/context.d.ts.map +1 -0
  123. package/dist/server/context.js +117 -0
  124. package/dist/server/emailBinding.d.ts +72 -0
  125. package/dist/server/emailBinding.d.ts.map +1 -0
  126. package/dist/server/emailBinding.js +124 -0
  127. package/dist/server/emit.d.ts +1 -1
  128. package/dist/server/emit.d.ts.map +1 -1
  129. package/dist/server/emit.js +7 -7
  130. package/dist/server/env.d.ts +44 -0
  131. package/dist/server/env.d.ts.map +1 -0
  132. package/dist/server/env.js +1 -0
  133. package/dist/server/eventsEndpoint.d.ts +48 -0
  134. package/dist/server/eventsEndpoint.d.ts.map +1 -0
  135. package/dist/server/eventsEndpoint.js +145 -0
  136. package/dist/server/everyApp.d.ts +40 -11
  137. package/dist/server/everyApp.d.ts.map +1 -1
  138. package/dist/server/everyApp.js +116 -6
  139. package/dist/server/fromMcpTools.d.ts +89 -0
  140. package/dist/server/fromMcpTools.d.ts.map +1 -0
  141. package/dist/server/fromMcpTools.js +192 -0
  142. package/dist/server/gatewayFetch.d.ts +42 -18
  143. package/dist/server/gatewayFetch.d.ts.map +1 -1
  144. package/dist/server/gatewayFetch.js +138 -19
  145. package/dist/server/gatewayUrl.d.ts +13 -0
  146. package/dist/server/gatewayUrl.d.ts.map +1 -0
  147. package/dist/server/gatewayUrl.js +34 -0
  148. package/dist/server/index.d.ts +16 -4
  149. package/dist/server/index.d.ts.map +1 -1
  150. package/dist/server/index.js +13 -3
  151. package/dist/server/integrationFetch.d.ts +92 -73
  152. package/dist/server/integrationFetch.d.ts.map +1 -1
  153. package/dist/server/integrationFetch.js +206 -319
  154. package/dist/server/listMembers.d.ts +1 -1
  155. package/dist/server/listMembers.d.ts.map +1 -1
  156. package/dist/server/listMembers.js +8 -11
  157. package/dist/server/refusal.d.ts +55 -0
  158. package/dist/server/refusal.d.ts.map +1 -0
  159. package/dist/server/refusal.js +193 -0
  160. package/dist/server/sendEmail.d.ts +1 -1
  161. package/dist/server/sendEmail.d.ts.map +1 -1
  162. package/dist/server/sendEmail.js +7 -7
  163. package/dist/server/tools.d.ts +7 -2
  164. package/dist/server/tools.d.ts.map +1 -1
  165. package/dist/server/tools.js +2 -1
  166. package/dist/server/toolsEndpoint.d.ts +3 -1
  167. package/dist/server/toolsEndpoint.d.ts.map +1 -1
  168. package/dist/server/toolsEndpoint.js +19 -7
  169. package/dist/server/webhooks.d.ts +56 -0
  170. package/dist/server/webhooks.d.ts.map +1 -0
  171. package/dist/server/webhooks.js +205 -0
  172. package/dist/tanstack-start/index.d.ts +9 -0
  173. package/dist/tanstack-start/index.d.ts.map +1 -0
  174. package/dist/tanstack-start/index.js +29 -0
  175. package/dist/testing/index.d.ts +93 -0
  176. package/dist/testing/index.d.ts.map +1 -0
  177. package/dist/testing/index.js +156 -0
  178. package/package.json +35 -14
  179. package/dist/server/authorizeUrl.d.ts +0 -43
  180. package/dist/server/authorizeUrl.d.ts.map +0 -1
  181. package/dist/server/authorizeUrl.js +0 -110
@@ -7,12 +7,15 @@
7
7
  * this derives the fallback's view of each, and holds the one response
8
8
  * rewrite the gateway has (Workers AI's numeric tokens).
9
9
  */
10
- import { CAPABILITIES, CAPABILITY_IDS, } from "./capabilities.js";
10
+ import { CAPABILITIES, CAPABILITY_IDS, authSettingNames, } from "./capabilities.js";
11
+ import { resolveDevProvider } from "./devProviders.js";
11
12
  /** The fallback's view of one `ai` catalog entry. */
12
13
  export function devAiProviderSpec(capability) {
13
14
  const { basePath, normalize } = capability;
14
15
  return {
15
16
  origin: capability.origin,
17
+ ...(capability.chat ? { chat: capability.chat } : {}),
18
+ ...(capability.embeddings ? { embeddings: capability.embeddings } : {}),
16
19
  keyEnv: capability.auth.secret,
17
20
  auth: capability.auth,
18
21
  docs: capability.docs,
@@ -30,18 +33,28 @@ export function devAiProviderSpec(capability) {
30
33
  }
31
34
  export const DEV_AI_PROVIDERS = Object.fromEntries(CAPABILITY_IDS.flatMap((id) => {
32
35
  const capability = CAPABILITIES[id];
33
- return capability.mode === "ai"
36
+ // The proxy entry (AI Gateway) serves no models: never a dev target.
37
+ return capability.mode === "ai" &&
38
+ !("kind" in capability && capability.kind === "proxy")
34
39
  ? [[id, devAiProviderSpec(capability)]]
35
40
  : [];
36
41
  }));
37
- export function devAiProvider(name) {
38
- return Object.hasOwn(DEV_AI_PROVIDERS, name)
39
- ? DEV_AI_PROVIDERS[name]
42
+ export function devAiProvider(name,
43
+ /** The dev Worker's bindings: a registered `ai` spec under `.everyapp/providers/<id>.json` resolves from them. */
44
+ values) {
45
+ if (Object.hasOwn(DEV_AI_PROVIDERS, name)) {
46
+ return DEV_AI_PROVIDERS[name];
47
+ }
48
+ if (!values)
49
+ return undefined;
50
+ const resolved = resolveDevProvider(values, name);
51
+ return resolved.found && resolved.capability.mode === "ai"
52
+ ? devAiProviderSpec(resolved.capability)
40
53
  : undefined;
41
54
  }
42
55
  /** Every setting a provider needs, its key first: the names `.dev.vars` and the gateway use. */
43
56
  export function aiProviderSettings(spec) {
44
- return [spec.keyEnv, ...(spec.alsoNeeds ?? [])];
57
+ return [...authSettingNames(spec.auth), ...(spec.alsoNeeds ?? [])];
45
58
  }
46
59
  /**
47
60
  * An `ai` entry's `basePath` with each `{SETTING}` filled from the
@@ -15,7 +15,10 @@
15
15
  * member is set; only for an app that picks among the set members at run
16
16
  * time). Each may say `why` it is needed and where it comes from
17
17
  * (`docs`, an https URL); for providers and capabilities the registries
18
- * here supply a default.
18
+ * here supply a default. An app's plain settings (`settings`: a host, a
19
+ * project id, a region) are held like its secrets, on its Worker, but are
20
+ * values rather than keys: each says what it takes (a URL, a number, one
21
+ * of a list) and may give a default.
19
22
  *
20
23
  * Everything in this module is pure and tenant-neutral: a manifest ships
21
24
  * in a release, and what is set is asked of the caller (`isSet`), which
@@ -23,6 +26,7 @@
23
26
  * the app Worker's secret names.
24
27
  */
25
28
  import { type ApiKeyCapability, type CapabilityLookup } from "./capabilities.js";
29
+ import { type IsSet } from "./aiDefault.js";
26
30
  /** A provider as `providers` lists it: its id, or an entry with a need. */
27
31
  export interface ProviderEntry extends SettingNeedFields {
28
32
  id: string;
@@ -31,6 +35,32 @@ export interface ProviderEntry extends SettingNeedFields {
31
35
  export interface SecretEntry extends SettingNeedFields {
32
36
  name: string;
33
37
  }
38
+ /** What a plain setting's value is: text by default, or a URL, a number, a switch. */
39
+ export type SettingValueType = "text" | "url" | "number" | "boolean";
40
+ /**
41
+ * An app's plain setting as `settings` lists it: a value that isn't a
42
+ * secret (a PostHog host, a project id, a region) and differs per
43
+ * install, set like a secret with `everyapp configure <app>` and read
44
+ * from `env` as a string.
45
+ */
46
+ export interface SettingEntry {
47
+ name: string;
48
+ why?: string;
49
+ docs?: string;
50
+ optional?: boolean;
51
+ /** What it takes; `text` when not given. */
52
+ type?: SettingValueType;
53
+ /** The values it may take, for a `text` setting that is one of a list. */
54
+ values?: readonly string[];
55
+ /** What the deploy sets it to while nobody has set it. */
56
+ default?: string;
57
+ }
58
+ /** What a plain setting's value must be: what `configure` checks and every surface says. */
59
+ export interface SettingValueRule {
60
+ type: SettingValueType;
61
+ values?: string[];
62
+ default?: string;
63
+ }
34
64
  /** What any declaration may say about its need. */
35
65
  export interface SettingNeedFields {
36
66
  /** Why the app needs it, for whoever sets it (200 characters at most). */
@@ -60,14 +90,21 @@ export interface SettingsManifestLike {
60
90
  readonly [id: string]: unknown;
61
91
  };
62
92
  readonly secrets?: ReadonlyArray<string | SecretEntry>;
93
+ readonly settings?: ReadonlyArray<SettingEntry>;
63
94
  readonly ai?: {
64
95
  readonly routes?: readonly string[];
96
+ /** The app needs the Gateway's default chat model (`/api/ai/default`): `true`, or an entry with its need. */
97
+ readonly chat?: boolean | SettingNeedFields;
65
98
  };
66
99
  /** A remote MCP app's registration (./remoteMcp.ts): its credential is a required Gateway setting. */
67
100
  readonly remote?: unknown;
68
101
  readonly name?: string;
69
102
  }
70
- export type SettingKind = "provider" | "capability" | "secret" | "ai-routes"
103
+ export type SettingKind = "provider" | "capability" | "secret"
104
+ /** An app's plain setting (`settings`): a value on its Worker, not a key. */
105
+ | "setting" | "ai-routes"
106
+ /** The Gateway's default model provider (`ai.chat`): one key of any provider in the order, or the operator's choice. */
107
+ | "ai-default"
71
108
  /** A remote MCP app's credential (./remoteMcp.ts): one Gateway setting named by the row. */
72
109
  | "remote-mcp";
73
110
  /** Which Worker holds a setting: the Gateway's, or the app's own. */
@@ -80,6 +117,13 @@ export type SettingNeed = {
80
117
  kind: "anyOf";
81
118
  group: string;
82
119
  };
120
+ /** What `appSettings` may be told about the Gateway, for the default model provider. */
121
+ export interface AppSettingsOptions {
122
+ /** The operator's stored default provider (`everyapp ai default`), or none. */
123
+ aiDefault?: string | null;
124
+ /** What is set, to put the configured provider first; absent, the order decides. */
125
+ isSet?: IsSet;
126
+ }
83
127
  /** One thing the app needs set, as the manifest declares it. */
84
128
  export interface AppSetting {
85
129
  kind: SettingKind;
@@ -88,8 +132,14 @@ export interface AppSetting {
88
132
  /** "OpenRouter", "DataForSEO", "MAIN_SECRET", "AI proxy routes". */
89
133
  label: string;
90
134
  holder: SettingHolder;
91
- /** Every one of these must be set for the setting to count as set. */
135
+ /** Every one of these must be set for the setting to count as set (or any one group of `alternatives`). */
92
136
  names: string[];
137
+ /**
138
+ * For the default model provider: the settings of each provider that
139
+ * could serve it, any one group of which, all set, makes the setting
140
+ * set; `names` is the first group, what to ask for.
141
+ */
142
+ alternatives?: string[][];
93
143
  /** Read when set, never required (a capability's optional settings). */
94
144
  alsoReads: string[];
95
145
  need: SettingNeed;
@@ -111,6 +161,12 @@ export interface AppSetting {
111
161
  * has no guide, so this is what an agent reads for it.
112
162
  */
113
163
  hint?: string;
164
+ /**
165
+ * For an app's plain setting (`kind: "setting"`): what its value must
166
+ * be, and its default. A setting without one is a credential, never
167
+ * shown.
168
+ */
169
+ value?: SettingValueRule;
114
170
  }
115
171
  /** A setting with whether it is set, and whether that keeps the app closed. */
116
172
  export interface EvaluatedSetting extends AppSetting {
@@ -148,6 +204,28 @@ export declare function providerIds(manifest: Pick<SettingsManifestLike, "provid
148
204
  export declare function secretEntries(manifest: Pick<SettingsManifestLike, "secrets">): SecretEntry[];
149
205
  /** The names of the app's own secrets, in order. */
150
206
  export declare function secretNames(manifest: Pick<SettingsManifestLike, "secrets">): string[];
207
+ /** The app's plain settings the manifest lists, each as an entry. */
208
+ export declare function settingEntries(manifest: Pick<SettingsManifestLike, "settings">): SettingEntry[];
209
+ /** The names of the app's plain settings, in order. */
210
+ export declare function settingNames(manifest: Pick<SettingsManifestLike, "settings">): string[];
211
+ /**
212
+ * Every name the manifest puts on the app's own Workers: its secrets,
213
+ * then its plain settings. What `secret set` routes to the app and what
214
+ * `apps.secret_names` records.
215
+ */
216
+ export declare function appWorkerNames(manifest: Pick<SettingsManifestLike, "secrets" | "settings">): string[];
217
+ /** A plain setting's rule, from its entry. */
218
+ export declare function settingValueRule(entry: SettingEntry): SettingValueRule;
219
+ /**
220
+ * What a plain setting takes, completing "Takes …": "an http or https
221
+ * URL", "one of us or eu", with ", default <value>" when it has one.
222
+ */
223
+ export declare function settingValueTakes(rule: SettingValueRule): string;
224
+ /**
225
+ * Why `value` won't do for a plain setting (one sentence), or null when
226
+ * it will: never empty, and of its type, or one of its values exactly.
227
+ */
228
+ export declare function settingValueProblem(rule: Pick<SettingValueRule, "type" | "values">, value: string): string | null;
151
229
  /**
152
230
  * Every setting the manifest declares, in manifest order: its AI
153
231
  * providers, its capabilities, the AI proxy's extra routes when `ai.routes`
@@ -157,7 +235,7 @@ export declare function secretNames(manifest: Pick<SettingsManifestLike, "secret
157
235
  * which is always set. `lookup` is where ids are found: the catalog alone
158
236
  * by default, or a gateway's registry with its registered rows.
159
237
  */
160
- export declare function appSettings(manifest: SettingsManifestLike, lookup?: CapabilityLookup): AppSetting[];
238
+ export declare function appSettings(manifest: SettingsManifestLike, lookup?: CapabilityLookup, options?: AppSettingsOptions): AppSetting[];
161
239
  export interface EvaluateOptions {
162
240
  /**
163
241
  * A capability's own readiness rule, where names alone don't say (the
@@ -1 +1 @@
1
- {"version":3,"file":"appSettings.d.ts","sourceRoot":"","sources":["../../src/internal/appSettings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAKL,KAAK,gBAAgB,EAErB,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAW3B,2EAA2E;AAC3E,MAAM,WAAW,aAAc,SAAQ,iBAAiB;IACtD,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,yEAAyE;AACzE,MAAM,WAAW,WAAY,SAAQ,iBAAiB;IACpD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,mDAAmD;AACnD,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wFAAwF;AACxF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC;IAC3D,QAAQ,CAAC,YAAY,CAAC,EAAE;QAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAC3D,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC;IACvD,QAAQ,CAAC,EAAE,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;IACtD,sGAAsG;IACtG,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,WAAW,GACnB,UAAU,GACV,YAAY,GACZ,QAAQ,GACR,WAAW;AACb,4FAA4F;GAC1F,YAAY,CAAC;AAEjB,qEAAqE;AACrE,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,KAAK,CAAC;AAE9C,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAErC,gEAAgE;AAChE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,WAAW,CAAC;IAClB,kGAAkG;IAClG,EAAE,EAAE,MAAM,CAAC;IACX,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,CAAC;IACtB,sEAAsE;IACtE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,wEAAwE;IACxE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,+EAA+E;AAC/E,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD;;;OAGG;IACH,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC;IACpB,gIAAgI;IAChI,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,mDAAmD;AACnD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,GAAG,EAAE,OAAO,CAAC;CACd;AAED,0FAA0F;AAC1F,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,KAAK,EAAE,OAAO,CAAC;IACf,yFAAyF;IACzF,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,gEAAgE;IAChE,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAED,qEAAqE;AACrE,wBAAgB,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,SAAS,GAAG,WAAW,CAOxE;AAgBD,gFAAgF;AAChF,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,GAChD,aAAa,EAAE,CAQjB;AAED,qDAAqD;AACrD,wBAAgB,WAAW,CACzB,QAAQ,EAAE,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,GAChD,MAAM,EAAE,CAEV;AAED,wFAAwF;AACxF,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,GAC9C,WAAW,EAAE,CAQf;AAED,oDAAoD;AACpD,wBAAgB,WAAW,CACzB,QAAQ,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,GAC9C,MAAM,EAAE,CAEV;AA4GD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,GAAE,gBAA0B,GACjC,UAAU,EAAE,CAmGd;AAgBD,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;CACjE;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,SAAS,UAAU,EAAE,EAC/B,KAAK,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI,EAC9D,OAAO,GAAE,eAAoB,GAC5B,iBAAiB,CAkCnB;AAED,0CAA0C;AAC1C,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,QAAQ,CAAC,EACnD,EACE,GAAG,EACH,KAAK,EACL,QAAgB,GACjB,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACpD,YAAY,GAAG,IAAI,CAgBrB;AAED,4FAA4F;AAC5F,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;AAElE;;;;;;;;GAQG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAClE,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;CAC9B;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE;IACP,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GACA,QAAQ,CAeV;AAED,sFAAsF;AACtF,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,MAAM,GAAE,gBAA0B,GACjC,MAAM,CAER;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,MAAM,EACV,MAAM,GAAE,gBAA0B,GACjC,gBAAgB,GAAG,SAAS,CAG9B"}
1
+ {"version":3,"file":"appSettings.d.ts","sourceRoot":"","sources":["../../src/internal/appSettings.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,10 @@
15
15
  * member is set; only for an app that picks among the set members at run
16
16
  * time). Each may say `why` it is needed and where it comes from
17
17
  * (`docs`, an https URL); for providers and capabilities the registries
18
- * here supply a default.
18
+ * here supply a default. An app's plain settings (`settings`: a host, a
19
+ * project id, a region) are held like its secrets, on its Worker, but are
20
+ * values rather than keys: each says what it takes (a URL, a number, one
21
+ * of a list) and may give a default.
19
22
  *
20
23
  * Everything in this module is pure and tenant-neutral: a manifest ships
21
24
  * in a release, and what is set is asked of the caller (`isSet`), which
@@ -23,6 +26,7 @@
23
26
  * the app Worker's secret names.
24
27
  */
25
28
  import { CATALOG, capabilitySettings, } from "./capabilities.js";
29
+ import { aiDefaultSetupHint, aiRequiredSettings, resolveAiDefault, } from "./aiDefault.js";
26
30
  import { isInstallOwnedGatewaySetting, isSettableGatewaySetting, } from "./gatewaySettings.js";
27
31
  import { remoteMcpAuthLabel, remoteMcpOf, remoteMcpSecretOf, } from "./remoteMcp.js";
28
32
  /** The need an entry declares; required unless it says otherwise. */
@@ -80,13 +84,123 @@ export function secretEntries(manifest) {
80
84
  export function secretNames(manifest) {
81
85
  return secretEntries(manifest).map((entry) => entry.name);
82
86
  }
87
+ /** The app's plain settings the manifest lists, each as an entry. */
88
+ export function settingEntries(manifest) {
89
+ return (manifest.settings ?? []).flatMap((entry) => {
90
+ if (!entry || typeof entry !== "object" || typeof entry.name !== "string") {
91
+ return [];
92
+ }
93
+ const record = entry;
94
+ const type = record["type"];
95
+ const values = record["values"];
96
+ return [
97
+ {
98
+ name: entry.name,
99
+ ...needFields(entry),
100
+ ...(type === "url" ||
101
+ type === "number" ||
102
+ type === "boolean" ||
103
+ type === "text"
104
+ ? { type }
105
+ : {}),
106
+ ...(Array.isArray(values) &&
107
+ values.every((value) => typeof value === "string")
108
+ ? { values: values }
109
+ : {}),
110
+ ...(typeof record["default"] === "string"
111
+ ? { default: record["default"] }
112
+ : {}),
113
+ },
114
+ ];
115
+ });
116
+ }
117
+ /** The names of the app's plain settings, in order. */
118
+ export function settingNames(manifest) {
119
+ return settingEntries(manifest).map((entry) => entry.name);
120
+ }
121
+ /**
122
+ * Every name the manifest puts on the app's own Workers: its secrets,
123
+ * then its plain settings. What `secret set` routes to the app and what
124
+ * `apps.secret_names` records.
125
+ */
126
+ export function appWorkerNames(manifest) {
127
+ return [...secretNames(manifest), ...settingNames(manifest)];
128
+ }
129
+ /** A plain setting's rule, from its entry. */
130
+ export function settingValueRule(entry) {
131
+ return {
132
+ type: entry.type ?? "text",
133
+ ...(entry.values?.length ? { values: [...entry.values] } : {}),
134
+ ...(entry.default !== undefined ? { default: entry.default } : {}),
135
+ };
136
+ }
137
+ /** `a, b or c`. */
138
+ function either(values) {
139
+ return values.length < 2
140
+ ? (values[0] ?? "")
141
+ : `${values.slice(0, -1).join(", ")} or ${values.at(-1)}`;
142
+ }
143
+ /**
144
+ * What a plain setting takes, completing "Takes …": "an http or https
145
+ * URL", "one of us or eu", with ", default <value>" when it has one.
146
+ */
147
+ export function settingValueTakes(rule) {
148
+ const what = rule.values?.length
149
+ ? `${rule.values.length > 2 ? "one of " : ""}${either(rule.values)}`
150
+ : {
151
+ text: "any text",
152
+ url: "an http or https URL",
153
+ number: "a number",
154
+ boolean: "true or false",
155
+ }[rule.type];
156
+ return rule.default !== undefined ? `${what}, default ${rule.default}` : what;
157
+ }
158
+ /**
159
+ * Why `value` won't do for a plain setting (one sentence), or null when
160
+ * it will: never empty, and of its type, or one of its values exactly.
161
+ */
162
+ export function settingValueProblem(rule, value) {
163
+ const trimmed = value.trim();
164
+ if (!trimmed)
165
+ return "Enter a value.";
166
+ if (rule.values?.length) {
167
+ return rule.values.includes(trimmed)
168
+ ? null
169
+ : `Not ${rule.values.length > 2 ? "one of " : ""}${either(rule.values)}.`;
170
+ }
171
+ switch (rule.type) {
172
+ case "text":
173
+ return null;
174
+ case "url": {
175
+ let url = null;
176
+ try {
177
+ url = new URL(trimmed);
178
+ }
179
+ catch {
180
+ url = null;
181
+ }
182
+ return url && (url.protocol === "http:" || url.protocol === "https:")
183
+ ? null
184
+ : `"${trimmed}" isn't an http or https URL.`;
185
+ }
186
+ case "number":
187
+ return /^-?\d+(\.\d+)?$/.test(trimmed)
188
+ ? null
189
+ : `"${trimmed}" isn't a number.`;
190
+ case "boolean":
191
+ return trimmed === "true" || trimmed === "false"
192
+ ? null
193
+ : "Not true or false.";
194
+ }
195
+ }
83
196
  /**
84
197
  * The Gateway settings an AI provider needs, the install's left out (set
85
198
  * already). A catalog provider's names are settable by definition; a
86
199
  * registered row's are its own, so they count too.
87
200
  */
88
201
  function providerNames(capability) {
89
- return capabilitySettings(capability).filter((name) => !isInstallOwnedGatewaySetting(name));
202
+ // An optional key (AI Gateway's own token) is never a need.
203
+ return aiRequiredSettings(capability).filter((name) => !isInstallOwnedGatewaySetting(name));
90
204
  }
91
205
  /** A capability's Gateway settings: what it needs, and what it also reads. */
92
206
  function capabilityNames(capability) {
@@ -101,26 +215,21 @@ function capabilityNames(capability) {
101
215
  names: settable(capability.settings),
102
216
  alsoReads: settable(capability.optionalSettings),
103
217
  };
104
- case "oauth_client": {
105
- const names = [
106
- capability.secrets.clientId,
107
- ...(capability.secrets.clientSecret
108
- ? [capability.secrets.clientSecret]
109
- : []),
110
- ];
111
- const host = capability.hostSetting ? [capability.hostSetting] : [];
112
- // An instance setting with a default is read when set; without one
113
- // the provider has no origin until it is set.
114
- return capability.defaultOrigin
115
- ? { names, alsoReads: host }
116
- : { names: [...names, ...host], alsoReads: [] };
117
- }
218
+ case "oauth_client":
219
+ return {
220
+ names: [
221
+ capability.secrets.clientId,
222
+ ...(capability.secrets.clientSecret
223
+ ? [capability.secrets.clientSecret]
224
+ : []),
225
+ ],
226
+ alsoReads: [],
227
+ };
118
228
  }
119
229
  }
120
230
  /**
121
231
  * Where a capability's key or client comes from, when the registry knows:
122
- * an API-key provider's access page, or an OAuth client's console (a path
123
- * on the default instance for a provider with no fixed host).
232
+ * an API-key provider's access page, or an OAuth client's console.
124
233
  */
125
234
  function capabilityDocs(capability) {
126
235
  switch (capability.mode) {
@@ -128,11 +237,7 @@ function capabilityDocs(capability) {
128
237
  case "ai":
129
238
  return capability.docs;
130
239
  case "oauth_client":
131
- if (capability.console.startsWith("https://"))
132
- return capability.console;
133
- return capability.defaultOrigin
134
- ? `${capability.defaultOrigin}${capability.console}`
135
- : undefined;
240
+ return capability.console;
136
241
  case "service":
137
242
  return undefined;
138
243
  }
@@ -173,13 +278,53 @@ function withNeed(setting, entry, defaults = {}) {
173
278
  * which is always set. `lookup` is where ids are found: the catalog alone
174
279
  * by default, or a gateway's registry with its registered rows.
175
280
  */
176
- export function appSettings(manifest, lookup = CATALOG) {
281
+ export function appSettings(manifest, lookup = CATALOG, options = {}) {
177
282
  const settings = [];
283
+ const chat = manifest.ai?.chat;
284
+ if (chat === true || (chat && typeof chat === "object")) {
285
+ // The default resolves on what is set: with nothing set, the first of
286
+ // the order (or the operator's choice) and its settings are what to
287
+ // ask for; with one configured, that provider's. `isSet` here only
288
+ // orders the candidates; evaluateAppSettings decides what is set.
289
+ const resolution = resolveAiDefault({
290
+ provider: options.aiDefault ?? null,
291
+ isSet: options.isSet ?? (() => false),
292
+ lookup,
293
+ });
294
+ const settable = (names) => names.filter((name) => !isInstallOwnedGatewaySetting(name));
295
+ const provider = lookup.get(resolution.provider);
296
+ settings.push(withNeed({
297
+ kind: "ai-default",
298
+ id: "ai-default",
299
+ label: `A chat model (${resolution.label})`,
300
+ holder: "gateway",
301
+ names: settable(resolution.settings),
302
+ alsoReads: [],
303
+ alternatives: resolution.candidates
304
+ .map((candidate) => settable(candidate.settings))
305
+ .filter((names) => names.length > 0),
306
+ }, chat === true ? undefined : chat, {
307
+ ...(provider?.mode === "ai" ? { docs: provider.docs } : {}),
308
+ setup: "setup/ai.md",
309
+ hint: aiDefaultSetupHint(resolution),
310
+ }));
311
+ }
312
+ // The default's settings: an optional pin that needs only those is the
313
+ // same row (one key, set once), so it isn't listed twice. A required
314
+ // pin stays: it needs that provider's key even while another provider
315
+ // serves the default.
316
+ const defaultNames = settings.find((setting) => setting.kind === "ai-default")?.names;
178
317
  for (const entry of providerEntries(manifest)) {
179
318
  const capability = lookup.get(entry.id);
180
319
  if (capability?.mode !== "ai")
181
320
  continue;
182
321
  const names = providerNames(capability);
322
+ if (defaultNames &&
323
+ needOf(entry).kind === "optional" &&
324
+ names.length > 0 &&
325
+ names.every((name) => defaultNames.includes(name))) {
326
+ continue;
327
+ }
183
328
  settings.push(withNeed({
184
329
  kind: "provider",
185
330
  id: entry.id,
@@ -255,19 +400,49 @@ export function appSettings(manifest, lookup = CATALOG) {
255
400
  alsoReads: [],
256
401
  }, entry));
257
402
  }
403
+ for (const entry of settingEntries(manifest)) {
404
+ // A setting with a default is never unset for long: the deploy writes it.
405
+ const need = entry.default !== undefined ? { ...entry, optional: true } : entry;
406
+ settings.push({
407
+ ...withNeed({
408
+ kind: "setting",
409
+ id: entry.name,
410
+ label: entry.name,
411
+ holder: "app",
412
+ names: [entry.name],
413
+ alsoReads: [],
414
+ }, need),
415
+ value: settingValueRule(entry),
416
+ });
417
+ }
258
418
  return settings;
259
419
  }
260
420
  /** Whether each name of `setting` is set: all → true, one unset → false, else unknown. */
261
421
  function settingIsSet(setting, isSet) {
422
+ const groupIsSet = (names) => {
423
+ let unknown = false;
424
+ for (const name of names) {
425
+ const state = isSet(setting.holder, name);
426
+ if (state === false)
427
+ return false;
428
+ if (state === null)
429
+ unknown = true;
430
+ }
431
+ return unknown ? null : true;
432
+ };
433
+ if (!setting.alternatives?.length)
434
+ return groupIsSet(setting.names);
435
+ // Any one provider configured makes the default serve; unknown only
436
+ // when no group is set and one couldn't be read.
262
437
  let unknown = false;
263
- for (const name of setting.names) {
264
- const state = isSet(setting.holder, name);
265
- if (state === false)
266
- return false;
438
+ for (const names of setting.alternatives) {
439
+ const state = groupIsSet(names);
440
+ if (state === true)
441
+ return true;
267
442
  if (state === null)
268
443
  unknown = true;
269
444
  }
270
- return unknown ? null : true;
445
+ return unknown ? null : false;
271
446
  }
272
447
  /**
273
448
  * Every setting against what is set. `isSet` answers per holder and name:
@@ -0,0 +1,108 @@
1
+ /**
2
+ * The audit log's shared reading of an event row: who did it, what it was
3
+ * about, and what the type means in plain words. Admin → Activity → Audit,
4
+ * `everyapp workspace audit` and `everyapp_workspace_audit` all show the
5
+ * same columns, so the three derive them here, from the stored `actor`
6
+ * and `data` (the catalogue's builders decide what those hold; the
7
+ * gateway's `summarize` writes the one-line summary from the same data).
8
+ * Nothing here reads a secret, a tool's arguments or result, or a mail
9
+ * body: the rows never hold one.
10
+ */
11
+ import { type EventGroup, type EventTypeInfo } from "./events.js";
12
+ /** Who caused an audit event, as every surface shows it. */
13
+ export interface AuditActor {
14
+ /** `user`, `agent`, `app`, `operator`, `gateway`, or what the row says. */
15
+ kind: string;
16
+ /** The user id, the credential id (an agent), the app id, the operator's id; null for the gateway. */
17
+ id: string | null;
18
+ email: string | null;
19
+ /** A member's name, or the AI app's name for an agent. */
20
+ name: string | null;
21
+ }
22
+ /** What an audit event is about, picked from its `data` by the keys the catalogue uses. */
23
+ export interface AuditSubject {
24
+ app?: {
25
+ id: string;
26
+ name: string | null;
27
+ };
28
+ user?: {
29
+ id: string;
30
+ email: string | null;
31
+ name: string | null;
32
+ };
33
+ group?: {
34
+ id: string;
35
+ name: string | null;
36
+ };
37
+ provider?: {
38
+ id: string;
39
+ name: string | null;
40
+ };
41
+ mcpApp?: {
42
+ id: string;
43
+ name: string | null;
44
+ };
45
+ subscription?: {
46
+ id: string;
47
+ name: string | null;
48
+ };
49
+ /** `member.invited`: whom. */
50
+ invitation?: {
51
+ email: string;
52
+ role: string | null;
53
+ };
54
+ /** Setting names an event lists (never a value): unmet, changed, added, removed. */
55
+ settings?: string[];
56
+ tool?: string;
57
+ /** The AI app of a connection or a blocked call. */
58
+ client?: string;
59
+ /** A personal access token's name. */
60
+ token?: string;
61
+ }
62
+ /** The stored `actor` (a JSON string or the parsed object) as the surfaces show it. */
63
+ export declare function auditActorOf(actor: unknown): AuditActor;
64
+ /**
65
+ * The Who cell: a person by name or email, "agent · Claude" for an AI
66
+ * client, "CLI · <operator>" for the operator's command line, "app · crm"
67
+ * for an app's own event, "Gateway" for what the gateway did by itself.
68
+ */
69
+ export declare function auditActorLabel(actor: AuditActor): string;
70
+ /** The plain-words label for a type: the catalogue's description, or "App event" for an app's own. */
71
+ export declare function auditTypeLabel(type: string): string;
72
+ /** What the event is about, from its stored `data`. */
73
+ export declare function auditSubjectOf(type: string, data: unknown): AuditSubject;
74
+ /** The Subject cell: the first thing the event is about, by name, then what else it names. */
75
+ export declare function auditSubjectLabel(subject: AuditSubject): string;
76
+ /**
77
+ * What the audit log leaves out unless asked for by type: `ping` (a test)
78
+ * and `tool.*` (the tool-calls view lists every call, blocked or not).
79
+ */
80
+ export declare const AUDIT_DEFAULT_EXCLUDED: readonly string[];
81
+ /**
82
+ * Whether an event of `type` is in the audit log's default view, or
83
+ * matches the type filter given (an exact type, or a prefix like
84
+ * `member.*`; `*` is everything, the excluded included).
85
+ */
86
+ export declare function auditTypeMatches(type: string, filter: string | undefined): boolean;
87
+ /** The SQL the filter translates to: `type = ?` or `type LIKE 'prefix.%'`; null for `*`. */
88
+ export declare function auditTypeCondition(filter: string): {
89
+ op: "eq";
90
+ value: string;
91
+ } | {
92
+ op: "prefix";
93
+ value: string;
94
+ } | null;
95
+ /** A type-filter value someone typed, cleaned, or null for none. */
96
+ export declare function auditTypeFilterOf(value: unknown): string | undefined;
97
+ export interface AuditTypeGroup {
98
+ group: EventGroup;
99
+ label: string;
100
+ /** `member.*` */
101
+ pattern: string;
102
+ types: EventTypeInfo[];
103
+ }
104
+ /** The groups' plain-words headings, as the Add-subscription dialog names them. */
105
+ export declare const AUDIT_GROUP_LABELS: Partial<Record<EventGroup, string>>;
106
+ /** The catalogue grouped for a type filter, in catalogue order, `ping` left out. */
107
+ export declare function auditTypeGroups(types?: readonly EventTypeInfo[]): AuditTypeGroup[];
108
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/internal/audit.ts"],"names":[],"mappings":"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"}