@itmetsam/samurai-framework 0.1.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.
Files changed (175) hide show
  1. package/.claude/settings.local.json +7 -0
  2. package/.env.example +3 -0
  3. package/.github/actions/setup/action.yml +16 -0
  4. package/.github/workflows/ci.yml +71 -0
  5. package/.trunk/configs/.markdownlint.yaml +2 -0
  6. package/.trunk/configs/.yamllint.yaml +7 -0
  7. package/.trunk/configs/svgo.config.mjs +14 -0
  8. package/.trunk/trunk.yaml +34 -0
  9. package/docs/superpowers/bidi-roadmap.md +60 -0
  10. package/docs/superpowers/plans/2026-09-29-auto-wait.md +1827 -0
  11. package/docs/superpowers/plans/2026-09-29-expect.md +1350 -0
  12. package/docs/superpowers/plans/2026-10-01-ci.md +350 -0
  13. package/docs/superpowers/plans/2026-10-01-test-api-alignment.md +1821 -0
  14. package/docs/superpowers/recorder-roadmap.md +52 -0
  15. package/docs/superpowers/specs/2026-09-29-auto-wait-design.md +185 -0
  16. package/docs/superpowers/specs/2026-09-29-bidi-foundation-design.md +130 -0
  17. package/docs/superpowers/specs/2026-09-29-contexts-and-storage-design.md +88 -0
  18. package/docs/superpowers/specs/2026-09-29-downloads-and-file-dialogs-design.md +94 -0
  19. package/docs/superpowers/specs/2026-09-29-emulation-design.md +88 -0
  20. package/docs/superpowers/specs/2026-09-29-expect-design.md +130 -0
  21. package/docs/superpowers/specs/2026-09-29-locate-nodes-design.md +90 -0
  22. package/docs/superpowers/specs/2026-09-29-logs-and-errors-design.md +87 -0
  23. package/docs/superpowers/specs/2026-09-29-navigation-waits-design.md +83 -0
  24. package/docs/superpowers/specs/2026-09-29-network-data-design.md +78 -0
  25. package/docs/superpowers/specs/2026-09-29-network-interception-design.md +91 -0
  26. package/docs/superpowers/specs/2026-09-29-network-tracking-design.md +86 -0
  27. package/docs/superpowers/specs/2026-09-29-page-api-design.md +90 -0
  28. package/docs/superpowers/specs/2026-09-29-preload-scripts-design.md +82 -0
  29. package/docs/superpowers/specs/2026-09-29-script-call-function-design.md +107 -0
  30. package/docs/superpowers/specs/2026-09-29-set-files-design.md +62 -0
  31. package/docs/superpowers/specs/2026-09-29-user-prompts-design.md +75 -0
  32. package/docs/superpowers/specs/2026-10-01-ci-design.md +106 -0
  33. package/docs/superpowers/specs/2026-10-01-test-api-alignment-design.md +241 -0
  34. package/package.json +27 -0
  35. package/public/logo-dark.svg +236 -0
  36. package/public/logo-light.svg +262 -0
  37. package/samurai.config.ts +7 -0
  38. package/src/api.ts +4 -0
  39. package/src/assert/assertion-error.test.ts +55 -0
  40. package/src/assert/assertion-error.ts +62 -0
  41. package/src/assert/expect-locator.test.ts +217 -0
  42. package/src/assert/expect.test.ts +73 -0
  43. package/src/assert/expect.ts +299 -0
  44. package/src/browser/browser-context.browser-test.ts +201 -0
  45. package/src/browser/browser-context.test.ts +407 -0
  46. package/src/browser/browser-context.ts +208 -0
  47. package/src/browser/browser-finder.ts +110 -0
  48. package/src/browser/browser.test.ts +88 -0
  49. package/src/browser/browser.ts +515 -0
  50. package/src/browser/context-tree.test.ts +86 -0
  51. package/src/browser/context-tree.ts +70 -0
  52. package/src/browser/dialog.browser-test.ts +144 -0
  53. package/src/browser/dialog.test.ts +322 -0
  54. package/src/browser/dialog.ts +83 -0
  55. package/src/browser/download.test.ts +161 -0
  56. package/src/browser/download.ts +172 -0
  57. package/src/browser/downloads-dir.test.ts +75 -0
  58. package/src/browser/downloads-dir.ts +39 -0
  59. package/src/browser/emulation.browser-test.ts +186 -0
  60. package/src/browser/emulation.test.ts +200 -0
  61. package/src/browser/emulation.ts +204 -0
  62. package/src/browser/file-chooser.test.ts +142 -0
  63. package/src/browser/file-chooser.ts +99 -0
  64. package/src/browser/file-paths.ts +18 -0
  65. package/src/browser/goto.browser-test.ts +44 -0
  66. package/src/browser/navigation-error.ts +26 -0
  67. package/src/browser/navigation.browser-test.ts +172 -0
  68. package/src/browser/page-api.browser-test.ts +228 -0
  69. package/src/browser/page-logs.browser-test.ts +119 -0
  70. package/src/browser/page-logs.test.ts +212 -0
  71. package/src/browser/page-logs.ts +208 -0
  72. package/src/browser/page-wait.ts +19 -0
  73. package/src/browser/page.test.ts +1567 -0
  74. package/src/browser/page.ts +1176 -0
  75. package/src/browser/pdf.ts +62 -0
  76. package/src/browser/screenshot.ts +65 -0
  77. package/src/browser/transfers.browser-test.ts +180 -0
  78. package/src/config/config.ts +33 -0
  79. package/src/config/default.ts +5 -0
  80. package/src/config/fixtures.test.ts +137 -0
  81. package/src/config/mask.test.ts +143 -0
  82. package/src/config/mask.ts +87 -0
  83. package/src/config/run-settings.test.ts +163 -0
  84. package/src/config/run-settings.ts +114 -0
  85. package/src/config/secrets.ts +70 -0
  86. package/src/config/variables.ts +31 -0
  87. package/src/index.ts +10 -0
  88. package/src/locator/action-timeout-error.test.ts +83 -0
  89. package/src/locator/action-timeout-error.ts +72 -0
  90. package/src/locator/element-state.test.ts +181 -0
  91. package/src/locator/element-state.ts +159 -0
  92. package/src/locator/locate-nodes.browser-test.ts +169 -0
  93. package/src/locator/locator-actions.test.ts +355 -0
  94. package/src/locator/locator-chain.test.ts +292 -0
  95. package/src/locator/locator.browser-test.ts +137 -0
  96. package/src/locator/locator.test.ts +179 -0
  97. package/src/locator/locator.ts +656 -0
  98. package/src/locator/selector-errors.ts +18 -0
  99. package/src/locator/selector.test.ts +124 -0
  100. package/src/locator/selector.ts +107 -0
  101. package/src/locator/set-files.browser-test.ts +141 -0
  102. package/src/locator/set-files.test.ts +191 -0
  103. package/src/locator/text-locator.test.ts +118 -0
  104. package/src/locator/text-locator.ts +38 -0
  105. package/src/logger/index.test.ts +28 -0
  106. package/src/logger/index.ts +40 -0
  107. package/src/network/data-collector.test.ts +111 -0
  108. package/src/network/data-collector.ts +92 -0
  109. package/src/network/network-data.browser-test.ts +192 -0
  110. package/src/network/network-tracker.browser-test.ts +151 -0
  111. package/src/network/network-tracker.test.ts +307 -0
  112. package/src/network/network-tracker.ts +286 -0
  113. package/src/network/network-wait.ts +28 -0
  114. package/src/network/response.test.ts +93 -0
  115. package/src/network/response.ts +58 -0
  116. package/src/network/router.browser-test.ts +260 -0
  117. package/src/network/router.test.ts +528 -0
  118. package/src/network/router.ts +420 -0
  119. package/src/network/url-match.test.ts +69 -0
  120. package/src/network/url-match.ts +41 -0
  121. package/src/runner/page-logs-report.test.ts +144 -0
  122. package/src/runner/page-logs-report.ts +82 -0
  123. package/src/runner/prepare-run.test.ts +33 -0
  124. package/src/runner/prepare-run.ts +36 -0
  125. package/src/runner/registry.test.ts +59 -0
  126. package/src/runner/registry.ts +46 -0
  127. package/src/runner/reporter.test.ts +73 -0
  128. package/src/runner/reporter.ts +109 -0
  129. package/src/runner/test-error.test.ts +39 -0
  130. package/src/runner/test-error.ts +20 -0
  131. package/src/runner/test-runner.ts +184 -0
  132. package/src/script/call-function.browser-test.ts +112 -0
  133. package/src/script/call-function.test.ts +174 -0
  134. package/src/script/call-function.ts +113 -0
  135. package/src/script/element-handle.ts +11 -0
  136. package/src/script/helpers.test.ts +116 -0
  137. package/src/script/helpers.ts +68 -0
  138. package/src/script/preload.browser-test.ts +144 -0
  139. package/src/script/preload.test.ts +180 -0
  140. package/src/script/preload.ts +102 -0
  141. package/src/script/serialize.test.ts +182 -0
  142. package/src/script/serialize.ts +203 -0
  143. package/src/testing/browser-fixture.ts +18 -0
  144. package/src/testing/fake-websocket.ts +72 -0
  145. package/src/testing/stub-connector.ts +154 -0
  146. package/src/tests/index.spec.ts +30 -0
  147. package/src/transport/bidi-connection.test.ts +155 -0
  148. package/src/transport/bidi-connection.ts +256 -0
  149. package/src/transport/bidi-error.ts +23 -0
  150. package/src/transport/foundation.browser-test.ts +73 -0
  151. package/src/transport/subscriptions.test.ts +140 -0
  152. package/src/transport/subscriptions.ts +110 -0
  153. package/src/types/bidi-commands.test-d.ts +55 -0
  154. package/src/types/bidi-modules/browser.d.ts +103 -0
  155. package/src/types/bidi-modules/browsing-context.d.ts +430 -0
  156. package/src/types/bidi-modules/emulation.d.ts +280 -0
  157. package/src/types/bidi-modules/input.d.ts +201 -0
  158. package/src/types/bidi-modules/log.d.ts +49 -0
  159. package/src/types/bidi-modules/network.d.ts +358 -0
  160. package/src/types/bidi-modules/permissions.d.ts +19 -0
  161. package/src/types/bidi-modules/script.d.ts +543 -0
  162. package/src/types/bidi-modules/session.d.ts +135 -0
  163. package/src/types/bidi-modules/storage.d.ts +92 -0
  164. package/src/types/bidi-modules/web-extensions.d.ts +9 -0
  165. package/src/types/bidi-protocols/command.d.ts +7 -0
  166. package/src/types/bidi-protocols/error.d.ts +38 -0
  167. package/src/types/bidi-protocols/event.d.ts +17 -0
  168. package/src/types/bidi.d.ts +65 -0
  169. package/src/types/browser.d.ts +1 -0
  170. package/src/types/config.d.ts +157 -0
  171. package/src/types/env.d.ts +5 -0
  172. package/src/types/test.d.ts +95 -0
  173. package/src/wait/wait-until.test.ts +117 -0
  174. package/src/wait/wait-until.ts +86 -0
  175. package/tsconfig.json +44 -0
@@ -0,0 +1,358 @@
1
+ import type { EmptyResult, Extensible } from "../bidi.js";
2
+ import type { UserContext } from "./browser.js";
3
+ import type { BrowsingContext, Navigation } from "./browsing-context.js";
4
+ import type { StackTrace } from "./script.js";
5
+
6
+ /** Commands available in the WebDriver BiDi network module. */
7
+ export interface NetworkCommands {
8
+ /** Blocks requests in the given phases until they are continued, answered or failed. */
9
+ "network.addIntercept": {
10
+ params: {
11
+ phases: InterceptPhase[];
12
+ contexts?: BrowsingContext[] | undefined;
13
+ urlPatterns?: UrlPattern[] | undefined;
14
+ };
15
+ result: AddInterceptResult;
16
+ };
17
+ "network.removeIntercept": { params: { intercept: Intercept }; result: RemoveInterceptResult };
18
+ /** Lets a blocked request go on, optionally modified. */
19
+ "network.continueRequest": {
20
+ params: {
21
+ request: Request;
22
+ body?: BytesValue | undefined;
23
+ cookies?: Cookie[] | undefined;
24
+ headers?: Header[] | undefined;
25
+ method?: string | undefined;
26
+ url?: string | undefined;
27
+ };
28
+ result: ContinueRequestResult;
29
+ };
30
+ /** Lets a blocked response go on, optionally modified. */
31
+ "network.continueResponse": {
32
+ params: {
33
+ request: Request;
34
+ cookies?: Cookie[] | undefined;
35
+ credentials?: AuthCredentials | undefined;
36
+ headers?: Header[] | undefined;
37
+ reasonPhrase?: string | undefined;
38
+ statusCode?: number | undefined;
39
+ };
40
+ result: ContinueResponseResult;
41
+ };
42
+ "network.continueWithAuth": {
43
+ params:
44
+ | { request: Request; action: "default" | "cancel" }
45
+ | { request: Request; action: "provideCredentials"; credentials: AuthCredentials };
46
+ result: ContinueWithAuthResult;
47
+ };
48
+ /** Answers a blocked request without contacting the server. */
49
+ "network.provideResponse": {
50
+ params: {
51
+ request: Request;
52
+ body?: BytesValue | undefined;
53
+ cookies?: Cookie[] | undefined;
54
+ headers?: Header[] | undefined;
55
+ reasonPhrase?: string | undefined;
56
+ statusCode?: number | undefined;
57
+ };
58
+ result: ProvideResponseResult;
59
+ };
60
+ "network.failRequest": { params: { request: Request }; result: FailRequestResult };
61
+ "network.setCacheBehavior": {
62
+ params: { cacheBehavior: "default" | "bypass"; contexts?: BrowsingContext[] | undefined };
63
+ result: SetCacheBehaviorResult;
64
+ };
65
+ /** Starts retaining response bodies for later `network.getData`. */
66
+ "network.addDataCollector": {
67
+ params: {
68
+ dataTypes: DataType[];
69
+ maxEncodedDataSize: number;
70
+ collectorType?: "blob" | undefined;
71
+ contexts?: BrowsingContext[] | undefined;
72
+ userContexts?: UserContext[] | undefined;
73
+ };
74
+ result: AddDataCollectorResult;
75
+ };
76
+ "network.removeDataCollector": { params: { collector: Collector }; result: RemoveDataCollectorResult };
77
+ "network.getData": {
78
+ params: {
79
+ dataType: DataType;
80
+ request: Request;
81
+ collector?: Collector | undefined;
82
+ disown?: boolean | undefined;
83
+ };
84
+ result: GetDataResult;
85
+ };
86
+ "network.disownData": {
87
+ params: { dataType: DataType; collector: Collector; request: Request };
88
+ result: DisownDataResult;
89
+ };
90
+ }
91
+
92
+ export type InterceptPhase = "beforeRequestSent" | "responseStarted" | "authRequired";
93
+ export type DataType = "request" | "response";
94
+ export type AuthCredentials = { type: "password"; username: string; password: string };
95
+ export type UrlPattern =
96
+ | { type: "string"; pattern: string }
97
+ | {
98
+ type: "pattern";
99
+ protocol?: string;
100
+ hostname?: string;
101
+ port?: string;
102
+ pathname?: string;
103
+ search?: string;
104
+ };
105
+
106
+ /** Events emitted by the network module, keyed by method name. */
107
+ export interface NetworkEvents {
108
+ "network.authRequired": { params: AuthRequiredParameters };
109
+ "network.beforeRequestSent": { params: BeforeRequestSentParameters };
110
+ "network.fetchError": { params: FetchErrorParameters };
111
+ "network.responseCompleted": { params: ResponseCompletedParameters };
112
+ "network.responseStarted": { params: ResponseStartedParameters };
113
+ }
114
+
115
+ /** Union of all events emitted by the network module. */
116
+ export type NetworkEvent =
117
+ | AuthRequired
118
+ | BeforeRequestSent
119
+ | FetchError
120
+ | ResponseCompleted
121
+ | ResponseStarted;
122
+
123
+ /** Unique identifier for a network request. */
124
+ export type Request = string;
125
+
126
+ /** A value that can be encoded as a plain string or as base64. */
127
+ export type BytesValue = StringValue | Base64Value;
128
+
129
+ /** A plaintext bytes value. */
130
+ export interface StringValue {
131
+ type: "string";
132
+ value: string;
133
+ }
134
+
135
+ /** A base64-encoded bytes value. */
136
+ export interface Base64Value {
137
+ type: "base64";
138
+ value: string;
139
+ }
140
+
141
+ /** An HTTP header name-value pair. */
142
+ export interface Header {
143
+ name: string;
144
+ value: BytesValue;
145
+ }
146
+
147
+ /** The SameSite attribute of a cookie, controlling cross-site sending behavior. */
148
+ export type SameSite = "strict" | "lax" | "none" | "default";
149
+
150
+ /** A network cookie with all its attributes. */
151
+ export interface Cookie extends Extensible {
152
+ name: string;
153
+ value: BytesValue;
154
+ domain: string;
155
+ path: string;
156
+ size: number;
157
+ httpOnly: boolean;
158
+ secure: boolean;
159
+ sameSite: SameSite;
160
+ /** Cookie expiry as Unix timestamp in seconds, if set. */
161
+ expiry?: number;
162
+ }
163
+
164
+ /** Detailed timing information for a fetch/network request, following the Resource Timing API. */
165
+ export interface FetchTimingInfo {
166
+ timeOrigin: number;
167
+ requestTime: number;
168
+ redirectStart: number;
169
+ redirectEnd: number;
170
+ fetchStart: number;
171
+ dnsStart: number;
172
+ dnsEnd: number;
173
+ connectStart: number;
174
+ connectEnd: number;
175
+ tlsStart: number;
176
+ requestStart: number;
177
+ responseStart: number;
178
+ responseEnd: number;
179
+ }
180
+
181
+ /** Full details about an outgoing network request. */
182
+ export interface RequestData {
183
+ request: Request;
184
+ url: string;
185
+ method: string;
186
+ headers: Header[];
187
+ cookies: Cookie[];
188
+ headersSize: number;
189
+ /** Body size in bytes, or `null` if not applicable. */
190
+ bodySize: number | null;
191
+ destination: string;
192
+ initiatorType: string | null;
193
+ timings: FetchTimingInfo;
194
+ }
195
+
196
+ /** Unique identifier for an active network intercept. */
197
+ export type Intercept = string;
198
+
199
+ /** Common parameters included in all network events. */
200
+ export interface BaseParameters {
201
+ context: BrowsingContext | null;
202
+ /** Whether this request is currently blocked by an active intercept. */
203
+ isBlocked: boolean;
204
+ navigation: Navigation | null;
205
+ redirectCount: Number;
206
+ request: RequestData;
207
+ timestamp: number;
208
+ userContext?: UserContext | null;
209
+ /** Active intercepts that match this request, if any. */
210
+ intercepts?: Intercept[];
211
+ }
212
+
213
+ /** Size metadata for a response body. */
214
+ export interface ResponseContent {
215
+ size: number;
216
+ }
217
+
218
+ /** An HTTP authentication challenge from a server. */
219
+ export interface AuthChallenge {
220
+ scheme: string;
221
+ realm: string;
222
+ }
223
+
224
+ /** Full details about a network response. */
225
+ export interface ResponseData {
226
+ url: string;
227
+ protocol: string;
228
+ status: number;
229
+ statusText: string;
230
+ fromCache: boolean;
231
+ headers: Header[];
232
+ mimeType: string;
233
+ bytesReceived: number;
234
+ headersSize: number | null;
235
+ bodySize: number | null;
236
+ content: ResponseContent;
237
+ authChallenges?: AuthChallenge[];
238
+ }
239
+
240
+ /** Parameters for the `network.authRequired` event. */
241
+ export interface AuthRequiredParameters extends BaseParameters {
242
+ response: ResponseData;
243
+ }
244
+
245
+ /** Emitted when a server responds with an authentication challenge (HTTP 401/407). */
246
+ export interface AuthRequired {
247
+ method: "network.authRequired";
248
+ params: AuthRequiredParameters;
249
+ }
250
+
251
+ /** Information about what initiated a network request. */
252
+ export interface NetworkInitiator {
253
+ columnNumber?: number;
254
+ lineNumber?: number;
255
+ request?: Request;
256
+ stackTrace?: StackTrace;
257
+ type?: "parser" | "script" | "preflight" | "other";
258
+ }
259
+
260
+ /** Parameters for the `network.beforeRequestSent` event. */
261
+ export interface BeforeRequestSentParameters extends BaseParameters {
262
+ initiator?: NetworkInitiator;
263
+ }
264
+
265
+ /** Emitted before a network request is sent, allowing inspection or interception. */
266
+ export interface BeforeRequestSent {
267
+ method: "network.beforeRequestSent";
268
+ params: BeforeRequestSentParameters;
269
+ }
270
+
271
+ /** Parameters for the `network.fetchError` event. */
272
+ export interface FetchErrorParameters extends BaseParameters {
273
+ errorText: string;
274
+ }
275
+
276
+ /** Emitted when a network request fails due to a network-level error. */
277
+ export interface FetchError {
278
+ method: "network.fetchError";
279
+ params: FetchErrorParameters;
280
+ }
281
+
282
+ /** Parameters for the `network.responseCompleted` event. */
283
+ export interface ResponseCompletedParameters extends BaseParameters {
284
+ response: ResponseData;
285
+ }
286
+
287
+ /** Emitted when a network response has been fully received. */
288
+ export interface ResponseCompleted {
289
+ method: "network.responseCompleted";
290
+ params: ResponseCompletedParameters;
291
+ }
292
+
293
+ /** Parameters for the `network.responseStarted` event. */
294
+ export interface ResponseStartedParameters extends BaseParameters {
295
+ network: ResponseData;
296
+ }
297
+
298
+ /** Emitted when the response headers have been received and the response has started. */
299
+ export interface ResponseStarted {
300
+ method: "network.responseStarted";
301
+ params: ResponseStartedParameters;
302
+ }
303
+
304
+ /** Union of all possible result types returned by network module commands. */
305
+ export type NetworkResult =
306
+ | AddDataCollectorResult
307
+ | AddInterceptResult
308
+ | ContinueRequestResult
309
+ | ContinueResponseResult
310
+ | ContinueWithAuthResult
311
+ | DisownDataResult
312
+ | FailRequestResult
313
+ | GetDataResult
314
+ | ProvideResponseResult
315
+ | RemoveDataCollectorResult
316
+ | RemoveInterceptResult
317
+ | SetCacheBehaviorResult
318
+ | SetExtraHeadersResult;
319
+
320
+ /** Unique identifier for an active network data collector. */
321
+ export type Collector = string;
322
+
323
+ /** Result of `network.addDataCollector`, containing the ID of the new collector. */
324
+ export interface AddDataCollectorResult {
325
+ collector: Collector;
326
+ }
327
+
328
+ /** Result of `network.addIntercept`, containing the ID of the new intercept. */
329
+ export interface AddInterceptResult {
330
+ intercept: Intercept;
331
+ }
332
+
333
+ /** Result of `network.continueRequest`. */
334
+ export type ContinueRequestResult = EmptyResult;
335
+ /** Result of `network.continueResponse`. */
336
+ export type ContinueResponseResult = EmptyResult;
337
+ /** Result of `network.continueWithAuth`. */
338
+ export type ContinueWithAuthResult = EmptyResult;
339
+ /** Result of `network.disownData` (releases collected data). */
340
+ export type DisownDataResult = EmptyResult;
341
+ /** Result of `network.failRequest`. */
342
+ export type FailRequestResult = EmptyResult;
343
+
344
+ /** Result of `network.getData`, containing the collected bytes. */
345
+ export interface GetDataResult {
346
+ bytes: BytesValue;
347
+ }
348
+
349
+ /** Result of `network.provideResponse`. */
350
+ export type ProvideResponseResult = EmptyResult;
351
+ /** Result of `network.removeDataCollector`. */
352
+ export type RemoveDataCollectorResult = EmptyResult;
353
+ /** Result of `network.removeIntercept`. */
354
+ export type RemoveInterceptResult = EmptyResult;
355
+ /** Result of `network.setCacheBehavior`. */
356
+ export type SetCacheBehaviorResult = EmptyResult;
357
+ /** Result of `network.setExtraHeaders`. */
358
+ export type SetExtraHeadersResult = EmptyResult;
@@ -0,0 +1,19 @@
1
+ import type { EmptyResult } from "../bidi.js";
2
+ import type { UserContext } from "./browser.js";
3
+
4
+ /** Commands available in the WebDriver BiDi permissions module. */
5
+ export interface PermissionsCommands {
6
+ /** Grants, denies or resets a permission for an origin (in one user context, or the default one). */
7
+ "permissions.setPermission": {
8
+ params: {
9
+ descriptor: { name: string };
10
+ state: PermissionState;
11
+ origin: string;
12
+ embeddedOrigin?: string | undefined;
13
+ userContext?: UserContext | undefined;
14
+ };
15
+ result: EmptyResult;
16
+ };
17
+ }
18
+
19
+ export type PermissionState = "granted" | "denied" | "prompt";