foil-server 0.3.3

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 (54) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +154 -0
  4. data/lib/foil/server/client.rb +472 -0
  5. data/lib/foil/server/crypto_support.rb +49 -0
  6. data/lib/foil/server/errors.rb +21 -0
  7. data/lib/foil/server/gate_delivery.rb +325 -0
  8. data/lib/foil/server/sealed_token.rb +78 -0
  9. data/lib/foil/server/types.rb +5 -0
  10. data/lib/foil/server/version.rb +5 -0
  11. data/lib/foil/server.rb +31 -0
  12. data/spec/LICENSE +21 -0
  13. data/spec/README.md +160 -0
  14. data/spec/fixtures/api/fingerprints/detail.json +70 -0
  15. data/spec/fixtures/api/fingerprints/list.json +37 -0
  16. data/spec/fixtures/api/gate/agent-token-revoke.json +3 -0
  17. data/spec/fixtures/api/gate/agent-token-verify.json +12 -0
  18. data/spec/fixtures/api/gate/login-session-consume.json +10 -0
  19. data/spec/fixtures/api/gate/login-session-create.json +12 -0
  20. data/spec/fixtures/api/gate/registry-detail.json +45 -0
  21. data/spec/fixtures/api/gate/registry-list.json +47 -0
  22. data/spec/fixtures/api/gate/service-create.json +49 -0
  23. data/spec/fixtures/api/gate/service-detail.json +49 -0
  24. data/spec/fixtures/api/gate/service-disable.json +49 -0
  25. data/spec/fixtures/api/gate/service-update.json +49 -0
  26. data/spec/fixtures/api/gate/services-list.json +51 -0
  27. data/spec/fixtures/api/gate/session-ack.json +10 -0
  28. data/spec/fixtures/api/gate/session-create.json +13 -0
  29. data/spec/fixtures/api/gate/session-poll.json +36 -0
  30. data/spec/fixtures/api/organizations/api-key-create.json +27 -0
  31. data/spec/fixtures/api/organizations/api-key-list.json +31 -0
  32. data/spec/fixtures/api/organizations/api-key-revoke.json +25 -0
  33. data/spec/fixtures/api/organizations/api-key-rotate.json +27 -0
  34. data/spec/fixtures/api/organizations/api-key-update.json +29 -0
  35. data/spec/fixtures/api/organizations/organization-create.json +14 -0
  36. data/spec/fixtures/api/organizations/organization-update.json +14 -0
  37. data/spec/fixtures/api/organizations/organization.json +14 -0
  38. data/spec/fixtures/api/sessions/detail.json +434 -0
  39. data/spec/fixtures/api/sessions/list.json +36 -0
  40. data/spec/fixtures/errors/invalid-api-key.json +10 -0
  41. data/spec/fixtures/errors/missing-api-key.json +10 -0
  42. data/spec/fixtures/errors/not-found.json +10 -0
  43. data/spec/fixtures/errors/validation-error.json +20 -0
  44. data/spec/fixtures/gate-delivery/approved-webhook-payload.valid.json +19 -0
  45. data/spec/fixtures/gate-delivery/delivery-request.json +9 -0
  46. data/spec/fixtures/gate-delivery/env-policy.json +40 -0
  47. data/spec/fixtures/gate-delivery/vector.v1.json +28 -0
  48. data/spec/fixtures/gate-delivery/webhook-signature.json +9 -0
  49. data/spec/fixtures/manifest.json +185 -0
  50. data/spec/fixtures/sealed-token/invalid.json +4 -0
  51. data/spec/fixtures/sealed-token/vector.v1.json +54 -0
  52. data/spec/openapi.json +20482 -0
  53. data/spec/sealed-token.md +114 -0
  54. metadata +96 -0
@@ -0,0 +1,29 @@
1
+ {
2
+ "data": {
3
+ "object": "api_key",
4
+ "id": "key_6789abcdefghjkmnpqrstvwxyz",
5
+ "type": "publishable",
6
+ "name": "Updated Web App",
7
+ "environment": "live",
8
+ "status": "active",
9
+ "allowed_origins": [
10
+ "https://example.com",
11
+ "https://app.example.com"
12
+ ],
13
+ "scopes": [
14
+ "sessions:list",
15
+ "sessions:read"
16
+ ],
17
+ "rate_limit": null,
18
+ "key_preview": "pk_live_[example]...",
19
+ "display_key": "pk_live_[example_publishable_key]",
20
+ "last_used_at": "2026-03-24T19:30:00.000Z",
21
+ "created_at": "2026-03-24T19:00:00.000Z",
22
+ "rotated_at": null,
23
+ "revoked_at": null,
24
+ "grace_expires_at": null
25
+ },
26
+ "meta": {
27
+ "request_id": "req_0123456789abcdef0123456789abcdef"
28
+ }
29
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "data": {
3
+ "object": "organization",
4
+ "id": "org_56789abcdefghjkmnpqrstvwxy",
5
+ "name": "Example Organization",
6
+ "slug": "example-organization",
7
+ "status": "active",
8
+ "created_at": "2026-03-24T19:00:00.000Z",
9
+ "updated_at": "2026-03-24T19:10:00.000Z"
10
+ },
11
+ "meta": {
12
+ "request_id": "req_0123456789abcdef0123456789abcdef"
13
+ }
14
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "data": {
3
+ "object": "organization",
4
+ "id": "org_56789abcdefghjkmnpqrstvwxy",
5
+ "name": "Example Organization",
6
+ "slug": "example-organization",
7
+ "status": "suspended",
8
+ "created_at": "2026-03-24T19:00:00.000Z",
9
+ "updated_at": "2026-03-24T19:12:00.000Z"
10
+ },
11
+ "meta": {
12
+ "request_id": "req_0123456789abcdef0123456789abcdef"
13
+ }
14
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "data": {
3
+ "object": "organization",
4
+ "id": "org_56789abcdefghjkmnpqrstvwxy",
5
+ "name": "Example Organization",
6
+ "slug": "example-organization",
7
+ "status": "active",
8
+ "created_at": "2026-03-24T19:00:00.000Z",
9
+ "updated_at": "2026-03-24T19:10:00.000Z"
10
+ },
11
+ "meta": {
12
+ "request_id": "req_0123456789abcdef0123456789abcdef"
13
+ }
14
+ }
@@ -0,0 +1,434 @@
1
+ {
2
+ "data": {
3
+ "object": "session",
4
+ "id": "sid_0123456789abcdefghjkmnpqrs",
5
+ "created_at": "2026-03-24T20:00:00.000Z",
6
+ "decision": {
7
+ "event_id": "evt_23456789abcdefghjkmnpqrstv",
8
+ "automation_status": "automated",
9
+ "risk_score": 94,
10
+ "evaluation_phase": "behavioral",
11
+ "decision_status": "final",
12
+ "evaluated_at": "2026-03-24T20:00:05.000Z"
13
+ },
14
+ "highlights": [
15
+ {
16
+ "key": "browser_automation",
17
+ "effect": "increases_risk",
18
+ "importance": "high",
19
+ "summary": "Browser automation markers were detected.",
20
+ "evidence": [
21
+ {
22
+ "signal": "webdriver_detected",
23
+ "name": "WebDriver detected"
24
+ },
25
+ {
26
+ "signal": "anti_detect_browser_indicators",
27
+ "name": "Anti-detect browser indicators"
28
+ }
29
+ ]
30
+ },
31
+ {
32
+ "key": "network_anonymity",
33
+ "effect": "increases_risk",
34
+ "importance": "medium",
35
+ "summary": "This session originated from a VPN-associated network.",
36
+ "evidence": [
37
+ {
38
+ "signal": "vpn_associated_ip",
39
+ "name": "VPN-associated IP"
40
+ }
41
+ ]
42
+ },
43
+ {
44
+ "key": "runtime_anomalies",
45
+ "effect": "increases_risk",
46
+ "importance": "medium",
47
+ "summary": "Runtime integrity checks found suspicious environment traits.",
48
+ "evidence": [
49
+ {
50
+ "signal": "virtualization_indicators",
51
+ "name": "Virtualization indicators"
52
+ },
53
+ {
54
+ "signal": "developer_tools_detected",
55
+ "name": "Developer tools detected"
56
+ },
57
+ {
58
+ "signal": "privacy_hardening_indicators",
59
+ "name": "Privacy hardening indicators"
60
+ }
61
+ ]
62
+ },
63
+ {
64
+ "key": "browser_profile_consistent",
65
+ "effect": "reduces_risk",
66
+ "importance": "medium",
67
+ "summary": "Browser identity and device capabilities are internally consistent for a desktop Chromium environment."
68
+ },
69
+ {
70
+ "key": "known_visitor_fingerprint",
71
+ "effect": "context",
72
+ "importance": "medium",
73
+ "summary": "This visitor fingerprint has been seen before.",
74
+ "evidence": [
75
+ {
76
+ "signal": "returning_visitor_fingerprint",
77
+ "name": "Seen 14 times"
78
+ }
79
+ ]
80
+ }
81
+ ],
82
+ "attribution": {
83
+ "labels": [
84
+ {
85
+ "kind": "actor",
86
+ "value": "automation",
87
+ "label": "Automation",
88
+ "confidence": 97
89
+ },
90
+ {
91
+ "kind": "provider",
92
+ "value": "browserless",
93
+ "label": "Browserless",
94
+ "confidence": 92
95
+ },
96
+ {
97
+ "kind": "tool",
98
+ "value": "playwright",
99
+ "label": "Playwright",
100
+ "confidence": 89
101
+ },
102
+ {
103
+ "kind": "evasion",
104
+ "value": "stealth",
105
+ "label": "Stealth",
106
+ "confidence": 73
107
+ },
108
+ {
109
+ "kind": "organization",
110
+ "value": "Browserless",
111
+ "label": "Browserless",
112
+ "confidence": 68
113
+ }
114
+ ],
115
+ "behaviors": [
116
+ {
117
+ "channel": "typing",
118
+ "value": "synthetic-typing",
119
+ "label": "Synthetic Typing",
120
+ "confidence": 86
121
+ }
122
+ ]
123
+ },
124
+ "web_bot_auth": {
125
+ "status": "verified",
126
+ "domain": "browserless.io"
127
+ },
128
+ "network": {
129
+ "ip_address": "203.0.113.9",
130
+ "ip_version": "ipv4",
131
+ "status": "ready",
132
+ "summary": "This IP appears associated with VPN traffic.",
133
+ "location": {
134
+ "city": "San Francisco",
135
+ "region": "California",
136
+ "country": "United States",
137
+ "country_code": "US",
138
+ "latitude": 37.7749,
139
+ "longitude": -122.4194,
140
+ "timezone": "America/Los_Angeles",
141
+ "postal_code": "94103",
142
+ "accuracy_radius_km": 10
143
+ },
144
+ "routing": {
145
+ "asn": "64512",
146
+ "organization": "Example Networks"
147
+ },
148
+ "anonymity": {
149
+ "vpn": true,
150
+ "proxy": false,
151
+ "tor": false,
152
+ "relay": false,
153
+ "hosting": false,
154
+ "residential_proxy": false,
155
+ "callback_proxy": false,
156
+ "provider": "Example VPN"
157
+ },
158
+ "reputation": {
159
+ "listed": true,
160
+ "categories": [
161
+ "vpn"
162
+ ],
163
+ "suspicious_network": false
164
+ },
165
+ "evidence": {
166
+ "risk_signals": [
167
+ "vpn"
168
+ ],
169
+ "operator_tags": [
170
+ "vpn"
171
+ ],
172
+ "client_types": [
173
+ "consumer"
174
+ ],
175
+ "client_count": 3
176
+ },
177
+ "evaluated_at": "2026-03-24T20:00:05.000Z"
178
+ },
179
+ "runtime_integrity": {
180
+ "tampering": "high_risk",
181
+ "developer_tools": "high_risk",
182
+ "emulation": "clean",
183
+ "virtualization": "high_risk",
184
+ "privacy_hardening": "notice",
185
+ "identity_spoofing": "clean",
186
+ "replay": "clean",
187
+ "outdated_environment": "clean"
188
+ },
189
+ "native_runtime_integrity": null,
190
+ "native_app": null,
191
+ "native_carrier": null,
192
+ "native_motion_print": null,
193
+ "device_identity": null,
194
+ "install_id": null,
195
+ "visitor_fingerprint": {
196
+ "object": "visitor_fingerprint",
197
+ "id": "vid_456789abcdefghjkmnpqrstvwx",
198
+ "confidence": 93,
199
+ "identified_at": "2026-03-24T20:00:01.000Z",
200
+ "lifecycle": {
201
+ "first_seen_at": "2026-03-01T18:22:11.000Z",
202
+ "last_seen_at": "2026-03-24T20:00:05.000Z",
203
+ "seen_count": 14
204
+ }
205
+ },
206
+ "connection_fingerprint": {
207
+ "ja4": {
208
+ "hash": "t13d1516h2_8daaf6152771_02713d6af862",
209
+ "profile": "chrome",
210
+ "family": "chromium",
211
+ "product": "edge",
212
+ "confidence": "exact",
213
+ "match_source": "full_ja4",
214
+ "deterministic": true,
215
+ "reference": {
216
+ "label": "Edge",
217
+ "source": "master_db",
218
+ "protocol": "t",
219
+ "tls_version": "13",
220
+ "sni": "d",
221
+ "alpn": "h2",
222
+ "cipher_count": {
223
+ "min": 15,
224
+ "max": 15
225
+ },
226
+ "ext_count": {
227
+ "min": 16,
228
+ "max": 16
229
+ },
230
+ "sample_size": 1,
231
+ "verified": true
232
+ }
233
+ },
234
+ "http2": {
235
+ "akamai_fingerprint": "1:65536;4:131072;5:16384|12517377|0|m,p,a,s",
236
+ "profile": "chrome"
237
+ },
238
+ "user_agent_alignment": "match"
239
+ },
240
+ "previous_decisions": [
241
+ {
242
+ "event_id": "evt_3456789abcdefghjkmnpqrstvw",
243
+ "automation_status": "uncertain",
244
+ "risk_score": 41,
245
+ "evaluation_phase": "snapshot",
246
+ "decision_status": "preliminary",
247
+ "evaluated_at": "2026-03-24T20:00:01.000Z"
248
+ }
249
+ ],
250
+ "request": {
251
+ "url": "https://example.com/signup",
252
+ "referrer": "https://example.com/",
253
+ "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.6312.86 Safari/537.36"
254
+ },
255
+ "browser": {
256
+ "name": "Chromium",
257
+ "version": "123.0.0.0",
258
+ "major_version": "123",
259
+ "engine": "blink"
260
+ },
261
+ "device": {
262
+ "form_factor": "desktop",
263
+ "operating_system": {
264
+ "name": "macOS",
265
+ "version": "14.4.0"
266
+ },
267
+ "architecture": "arm",
268
+ "screen": {
269
+ "size": "1440x900",
270
+ "color_depth": 24,
271
+ "pixel_ratio": 2,
272
+ "orientation_type": "landscape-primary"
273
+ },
274
+ "locale": {
275
+ "timezone": "America/Los_Angeles",
276
+ "primary_language": "en-US",
277
+ "languages": [
278
+ "en-US",
279
+ "en"
280
+ ]
281
+ },
282
+ "capabilities": {
283
+ "touch": {
284
+ "available": false,
285
+ "max_touch_points": 0
286
+ },
287
+ "storage": {
288
+ "cookies": true,
289
+ "local_storage": true,
290
+ "indexed_db": true,
291
+ "service_worker": true,
292
+ "window_name": true
293
+ },
294
+ "webgpu": {
295
+ "available": false
296
+ },
297
+ "platform_authenticator": {
298
+ "available": true,
299
+ "conditional_mediation": true
300
+ },
301
+ "media_devices": {
302
+ "available": true
303
+ },
304
+ "speech_synthesis": {
305
+ "available": false
306
+ }
307
+ }
308
+ },
309
+ "analysis_coverage": {
310
+ "browser": true,
311
+ "device": true,
312
+ "network": true,
313
+ "runtime": true,
314
+ "behavioral": true,
315
+ "visitor_identity": true
316
+ },
317
+ "signals_fired": [
318
+ {
319
+ "signal": "webdriver_detected",
320
+ "role": "risk",
321
+ "category": "environment",
322
+ "strength": "definitive",
323
+ "signal_score": 100
324
+ },
325
+ {
326
+ "signal": "anti_detect_browser_indicators",
327
+ "role": "risk",
328
+ "category": "environment",
329
+ "strength": "strong",
330
+ "signal_score": 84
331
+ },
332
+ {
333
+ "signal": "software_rendered_graphics_path",
334
+ "role": "risk",
335
+ "category": "fingerprint",
336
+ "strength": "strong",
337
+ "signal_score": 73
338
+ },
339
+ {
340
+ "signal": "virtualization_indicators",
341
+ "role": "risk",
342
+ "category": "environment",
343
+ "strength": "strong",
344
+ "signal_score": 61
345
+ }
346
+ ],
347
+ "client_telemetry": {
348
+ "navigator": {
349
+ "platform": "macOS",
350
+ "vendor": "Google Inc.",
351
+ "hardware_concurrency": null,
352
+ "device_memory": null,
353
+ "max_touch_points": 0,
354
+ "pdf_viewer_enabled": true,
355
+ "cookie_enabled": true,
356
+ "product_sub": "20030107",
357
+ "primary_language": "en-US",
358
+ "languages": [
359
+ "en-US",
360
+ "en"
361
+ ],
362
+ "mime_types_count": 5,
363
+ "plugins": [
364
+ "PDF Viewer",
365
+ "Chrome PDF Viewer"
366
+ ]
367
+ },
368
+ "storage": {
369
+ "cookies": true,
370
+ "local_storage": true,
371
+ "session_storage": true,
372
+ "indexed_db": true,
373
+ "service_worker": true,
374
+ "window_name": true
375
+ },
376
+ "canvas": {
377
+ "hash": 123456,
378
+ "geometry_hash": 998877,
379
+ "text_hash": 112233,
380
+ "winding": null,
381
+ "noise_detected": true,
382
+ "offscreen_consistent": true
383
+ },
384
+ "graphics": {
385
+ "webgl": {
386
+ "vendor": "Google Inc.",
387
+ "renderer": "ANGLE (Apple, ANGLE Metal Renderer)",
388
+ "version": "WebGL 1.0",
389
+ "shading_language_version": "WebGL GLSL ES 1.0",
390
+ "parameters_hash": "params_123",
391
+ "extensions_hash": 333444,
392
+ "extension_parameters_hash": "webgl2_456",
393
+ "shader_precision_hash": 777888
394
+ },
395
+ "webgpu": {
396
+ "available": false,
397
+ "adapter_vendor": "Apple",
398
+ "adapter_architecture": "metal",
399
+ "fallback_adapter": false,
400
+ "features_hash": 0,
401
+ "limits_hash": 0
402
+ }
403
+ },
404
+ "audio": {
405
+ "hash": 124.0434,
406
+ "sample_rate": 48000,
407
+ "channel_count": null,
408
+ "voice_count": 3,
409
+ "local_voice_count": 2,
410
+ "default_voice_lang": "en-US",
411
+ "noise_detected": true
412
+ },
413
+ "fonts": {
414
+ "detected_count": 2,
415
+ "tested_count": null,
416
+ "enumeration_hash": 3649417752,
417
+ "metrics_hash": 223344,
418
+ "preferences_hash": null,
419
+ "emoji_hash": 112233
420
+ },
421
+ "media": {
422
+ "device_count": 1,
423
+ "counts_by_kind": {
424
+ "audiooutput": 1
425
+ },
426
+ "blank_label_count": 1,
427
+ "topology_hash": 123
428
+ }
429
+ }
430
+ },
431
+ "meta": {
432
+ "request_id": "req_0123456789abcdef0123456789abcdef"
433
+ }
434
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "data": [
3
+ {
4
+ "object": "session",
5
+ "id": "sid_0123456789abcdefghjkmnpqrs",
6
+ "created_at": "2026-03-24T20:00:00.000Z",
7
+ "latest_decision": {
8
+ "event_id": "evt_23456789abcdefghjkmnpqrstv",
9
+ "verdict": "human",
10
+ "risk_score": 9,
11
+ "phase": "behavioral",
12
+ "is_provisional": false,
13
+ "manipulation": {
14
+ "score": 0,
15
+ "verdict": "none"
16
+ },
17
+ "evaluation_duration_ms": 142,
18
+ "evaluated_at": "2026-03-24T20:00:05.000Z"
19
+ },
20
+ "visitor_fingerprint": {
21
+ "object": "visitor_fingerprint",
22
+ "id": "vid_456789abcdefghjkmnpqrstvwx",
23
+ "confidence": 94,
24
+ "identified_at": "2026-03-24T20:00:05.000Z"
25
+ }
26
+ }
27
+ ],
28
+ "pagination": {
29
+ "limit": 50,
30
+ "has_more": true,
31
+ "next_cursor": "cur_sessions_page_2"
32
+ },
33
+ "meta": {
34
+ "request_id": "req_0123456789abcdef0123456789abcdef"
35
+ }
36
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "error": {
3
+ "code": "auth.invalid_api_key",
4
+ "message": "The bearer token was not recognized. Verify that the token is active and matches the correct environment before retrying.",
5
+ "status": 401,
6
+ "retryable": false,
7
+ "request_id": "req_0123456789abcdef0123456789abcdef",
8
+ "docs_url": "https://usefoil.com/docs/api-reference/introduction"
9
+ }
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "error": {
3
+ "code": "auth.missing_api_key",
4
+ "message": "Missing Authorization header. Send Authorization: Bearer <token> to authenticate this request.",
5
+ "status": 401,
6
+ "retryable": false,
7
+ "request_id": "req_0123456789abcdef0123456789abcdef",
8
+ "docs_url": "https://usefoil.com/docs/api-reference/introduction"
9
+ }
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "error": {
3
+ "code": "request.not_found",
4
+ "message": "No session with id \"sid_0123456789abcdefghjkmnpqrs\" was found. Verify the identifier and retry.",
5
+ "status": 404,
6
+ "retryable": false,
7
+ "request_id": "req_0123456789abcdef0123456789abcdef",
8
+ "docs_url": "https://usefoil.com/docs/api-reference/sessions"
9
+ }
10
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "error": {
3
+ "code": "request.validation_failed",
4
+ "message": "Invalid session list query. Use limit between 1 and 200 and the supported cursor/search/verdict filters only.",
5
+ "status": 422,
6
+ "retryable": false,
7
+ "request_id": "req_0123456789abcdef0123456789abcdef",
8
+ "details": {
9
+ "fields": [
10
+ {
11
+ "name": "limit",
12
+ "issue": "invalid_integer",
13
+ "expected": "integer between 1 and 200",
14
+ "received": "999"
15
+ }
16
+ ],
17
+ "parameter_set": "sessions"
18
+ }
19
+ }
20
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "service_id": "foil",
3
+ "gate_session_id": "gate_0123456789abcdefghjkmnpqrs",
4
+ "gate_account_id": "gacct_0123456789abcdefghjkmnpqrs",
5
+ "account_name": "Acme",
6
+ "metadata": {
7
+ "plan": "pro"
8
+ },
9
+ "foil": {
10
+ "verdict": "human",
11
+ "score": 0.12
12
+ },
13
+ "delivery": {
14
+ "version": 1,
15
+ "algorithm": "x25519-hkdf-sha256/aes-256-gcm",
16
+ "key_id": "LyGqfpvB0SCaX4P0inVpMJTAjCNJVWq_3OE87it2ZYo",
17
+ "public_key": "bn6szfMIS-7pLl01PqvssrrGRoW1SVTkUuqeg0hfrW0"
18
+ }
19
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "delivery": {
3
+ "version": 1,
4
+ "algorithm": "x25519-hkdf-sha256/aes-256-gcm",
5
+ "key_id": "LyGqfpvB0SCaX4P0inVpMJTAjCNJVWq_3OE87it2ZYo",
6
+ "public_key": "bn6szfMIS-7pLl01PqvssrrGRoW1SVTkUuqeg0hfrW0"
7
+ },
8
+ "derived_key_id": "LyGqfpvB0SCaX4P0inVpMJTAjCNJVWq_3OE87it2ZYo"
9
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "derive_agent_token_env_key": [
3
+ {
4
+ "service_id": "foil",
5
+ "expected": "FOIL_GATE_AGENT_TOKEN"
6
+ },
7
+ {
8
+ "service_id": "acme-prod",
9
+ "expected": "ACME_PROD_GATE_AGENT_TOKEN"
10
+ }
11
+ ],
12
+ "is_gate_managed_env_var_key": [
13
+ {
14
+ "key": "FOIL_AGENT_TOKEN",
15
+ "managed": true
16
+ },
17
+ {
18
+ "key": "ACME_PROD_GATE_AGENT_TOKEN",
19
+ "managed": true
20
+ },
21
+ {
22
+ "key": "ACME_API_KEY",
23
+ "managed": false
24
+ }
25
+ ],
26
+ "is_blocked_gate_env_var_key": [
27
+ {
28
+ "key": "PATH",
29
+ "blocked": true
30
+ },
31
+ {
32
+ "key": "npm_config_registry",
33
+ "blocked": true
34
+ },
35
+ {
36
+ "key": "FOIL_SECRET_KEY",
37
+ "blocked": false
38
+ }
39
+ ]
40
+ }