@faable/deploy-sdk 2.11.0 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/spec/openapi.json CHANGED
@@ -80,6 +80,86 @@
80
80
  "items": {
81
81
  "type": "string",
82
82
  "format": "email"
83
+ },
84
+ "minItems": 1,
85
+ "maxItems": 10
86
+ }
87
+ },
88
+ "additionalProperties": false
89
+ },
90
+ "ProjectInviteResult": {
91
+ "type": "object",
92
+ "required": [
93
+ "project",
94
+ "results"
95
+ ],
96
+ "properties": {
97
+ "project": {
98
+ "$ref": "#/components/schemas/Project"
99
+ },
100
+ "results": {
101
+ "type": "array",
102
+ "items": {
103
+ "type": "object",
104
+ "required": [
105
+ "email",
106
+ "status"
107
+ ],
108
+ "properties": {
109
+ "email": {
110
+ "type": "string"
111
+ },
112
+ "status": {
113
+ "anyOf": [
114
+ {
115
+ "type": "string",
116
+ "enum": [
117
+ "invited"
118
+ ]
119
+ },
120
+ {
121
+ "type": "string",
122
+ "enum": [
123
+ "invited_created_account"
124
+ ]
125
+ },
126
+ {
127
+ "type": "string",
128
+ "enum": [
129
+ "already_member"
130
+ ]
131
+ },
132
+ {
133
+ "type": "string",
134
+ "enum": [
135
+ "failed"
136
+ ]
137
+ }
138
+ ]
139
+ },
140
+ "user_id": {
141
+ "type": "string"
142
+ }
143
+ }
144
+ }
145
+ }
146
+ },
147
+ "additionalProperties": false
148
+ },
149
+ "ProjectModerationResult": {
150
+ "type": "object",
151
+ "required": [
152
+ "count",
153
+ "app_ids"
154
+ ],
155
+ "properties": {
156
+ "count": {
157
+ "type": "integer"
158
+ },
159
+ "app_ids": {
160
+ "type": "array",
161
+ "items": {
162
+ "type": "string"
83
163
  }
84
164
  }
85
165
  }
@@ -121,6 +201,12 @@
121
201
  "type": "string"
122
202
  }
123
203
  },
204
+ "owner_suspended": {
205
+ "type": "boolean"
206
+ },
207
+ "owner_email": {
208
+ "type": "string"
209
+ },
124
210
  "createdAt": {
125
211
  "type": "string",
126
212
  "description": "Project creation date"
@@ -243,12 +329,6 @@
243
329
  },
244
330
  "description": {
245
331
  "type": "string"
246
- },
247
- "collaborators": {
248
- "type": "array",
249
- "items": {
250
- "type": "string"
251
- }
252
332
  }
253
333
  },
254
334
  "additionalProperties": false
@@ -419,6 +499,44 @@
419
499
  "description": "Opaque revision token; changes whenever the app secrets change",
420
500
  "nullable": true,
421
501
  "default": null
502
+ },
503
+ "resource_health": {
504
+ "anyOf": [
505
+ {
506
+ "type": "object",
507
+ "required": [
508
+ "state",
509
+ "deployment",
510
+ "at"
511
+ ],
512
+ "properties": {
513
+ "state": {
514
+ "type": "string",
515
+ "description": "The runtime exceeded its memory limit (OOMKilled)",
516
+ "enum": [
517
+ "memory_exceeded"
518
+ ]
519
+ },
520
+ "deployment": {
521
+ "type": "string",
522
+ "description": "Deployment whose pod tripped the limit"
523
+ },
524
+ "at": {
525
+ "type": "string",
526
+ "description": "ISO time the limit was last observed being hit"
527
+ },
528
+ "container": {
529
+ "type": "string",
530
+ "description": "Container that was OOMKilled"
531
+ }
532
+ },
533
+ "description": "Resource-limit breach observed at runtime"
534
+ },
535
+ {
536
+ "type": "null"
537
+ }
538
+ ],
539
+ "description": "Runtime resource-pressure flag (admin/owner-facing upgrade prompt)"
422
540
  }
423
541
  }
424
542
  },
@@ -428,7 +546,8 @@
428
546
  "AppRuntime": {
429
547
  "enum": [
430
548
  "node",
431
- "php"
549
+ "php",
550
+ "python"
432
551
  ]
433
552
  },
434
553
  "AppMode": {
@@ -523,6 +642,42 @@
523
642
  }
524
643
  ]
525
644
  },
645
+ "detected": {
646
+ "anyOf": [
647
+ {
648
+ "type": "object",
649
+ "required": [
650
+ "buildpack",
651
+ "runtime"
652
+ ],
653
+ "properties": {
654
+ "buildpack": {
655
+ "type": "string"
656
+ },
657
+ "framework": {
658
+ "type": "string"
659
+ },
660
+ "runtime": {
661
+ "type": "object",
662
+ "required": [
663
+ "name"
664
+ ],
665
+ "properties": {
666
+ "name": {
667
+ "type": "string"
668
+ },
669
+ "version": {
670
+ "type": "string"
671
+ }
672
+ }
673
+ }
674
+ }
675
+ },
676
+ {
677
+ "type": "null"
678
+ }
679
+ ]
680
+ },
526
681
  "mode": {
527
682
  "$ref": "#/components/schemas/AppMode"
528
683
  },
@@ -645,6 +800,28 @@
645
800
  ],
646
801
  "description": "Platform GitHub access health, maintained by installation lifecycle webhooks. Absent/null = ok; 'deleted' | 'suspended' | 'repo_removed' = access broken until re-linked."
647
802
  },
803
+ "github_repo_hidden": {
804
+ "anyOf": [
805
+ {
806
+ "type": "string"
807
+ },
808
+ {
809
+ "type": "null"
810
+ }
811
+ ],
812
+ "description": "The linked repository stopped being readable after the app was created, per the GitHub `repository` webhook. Absent/null = visible; 'deleted' | 'privatized' | 'archived' = the source was pulled after deploying (the analyzer re-scores the promoted deployment against our own build artifact)."
813
+ },
814
+ "github_disconnect_reason": {
815
+ "anyOf": [
816
+ {
817
+ "type": "string"
818
+ },
819
+ {
820
+ "type": "null"
821
+ }
822
+ ],
823
+ "description": "Why the platform cleared the repository link automatically. Absent/null = never auto-disconnected (or re-linked since); 'push_flood' = the repo exceeded the hourly push limit and must be re-linked by the user."
824
+ },
648
825
  "deploy_trigger": {
649
826
  "anyOf": [
650
827
  {
@@ -1099,6 +1276,7 @@
1099
1276
  "enum": [
1100
1277
  "node",
1101
1278
  "python",
1279
+ "php",
1102
1280
  "static"
1103
1281
  ]
1104
1282
  },
@@ -1121,7 +1299,8 @@
1121
1299
  "node-full",
1122
1300
  "next-standalone",
1123
1301
  "static",
1124
- "python-venv"
1302
+ "python-venv",
1303
+ "php"
1125
1304
  ]
1126
1305
  },
1127
1306
  "start_command": {
@@ -1149,6 +1328,35 @@
1149
1328
  }
1150
1329
  }
1151
1330
  },
1331
+ "DeploymentDetected": {
1332
+ "type": "object",
1333
+ "required": [
1334
+ "buildpack",
1335
+ "runtime"
1336
+ ],
1337
+ "properties": {
1338
+ "buildpack": {
1339
+ "type": "string"
1340
+ },
1341
+ "framework": {
1342
+ "type": "string"
1343
+ },
1344
+ "runtime": {
1345
+ "type": "object",
1346
+ "required": [
1347
+ "name"
1348
+ ],
1349
+ "properties": {
1350
+ "name": {
1351
+ "type": "string"
1352
+ },
1353
+ "version": {
1354
+ "type": "string"
1355
+ }
1356
+ }
1357
+ }
1358
+ }
1359
+ },
1152
1360
  "Deployment": {
1153
1361
  "type": "object",
1154
1362
  "required": [
@@ -1212,6 +1420,9 @@
1212
1420
  }
1213
1421
  ]
1214
1422
  },
1423
+ "detected": {
1424
+ "$ref": "#/components/schemas/DeploymentDetected"
1425
+ },
1215
1426
  "status": {
1216
1427
  "$ref": "#/components/schemas/DeploymentStatus"
1217
1428
  },
@@ -1355,6 +1566,9 @@
1355
1566
  },
1356
1567
  "type": {
1357
1568
  "type": "string"
1569
+ },
1570
+ "detected": {
1571
+ "$ref": "#/components/schemas/DeploymentDetected"
1358
1572
  }
1359
1573
  }
1360
1574
  },
@@ -1595,6 +1809,7 @@
1595
1809
  "scope",
1596
1810
  "source",
1597
1811
  "action",
1812
+ "match",
1598
1813
  "apply",
1599
1814
  "rules",
1600
1815
  "enabled",
@@ -1671,6 +1886,28 @@
1671
1886
  "enum": [
1672
1887
  "ratelimit"
1673
1888
  ]
1889
+ },
1890
+ {
1891
+ "type": "string",
1892
+ "enum": [
1893
+ "probe"
1894
+ ]
1895
+ }
1896
+ ]
1897
+ },
1898
+ "match": {
1899
+ "anyOf": [
1900
+ {
1901
+ "type": "string",
1902
+ "enum": [
1903
+ "path"
1904
+ ]
1905
+ },
1906
+ {
1907
+ "type": "string",
1908
+ "enum": [
1909
+ "user_agent"
1910
+ ]
1674
1911
  }
1675
1912
  ]
1676
1913
  },
@@ -1895,6 +2132,28 @@
1895
2132
  "enum": [
1896
2133
  "ratelimit"
1897
2134
  ]
2135
+ },
2136
+ {
2137
+ "type": "string",
2138
+ "enum": [
2139
+ "probe"
2140
+ ]
2141
+ }
2142
+ ]
2143
+ },
2144
+ "match": {
2145
+ "anyOf": [
2146
+ {
2147
+ "type": "string",
2148
+ "enum": [
2149
+ "path"
2150
+ ]
2151
+ },
2152
+ {
2153
+ "type": "string",
2154
+ "enum": [
2155
+ "user_agent"
2156
+ ]
1898
2157
  }
1899
2158
  ]
1900
2159
  },
@@ -1978,6 +2237,28 @@
1978
2237
  "enum": [
1979
2238
  "ratelimit"
1980
2239
  ]
2240
+ },
2241
+ {
2242
+ "type": "string",
2243
+ "enum": [
2244
+ "probe"
2245
+ ]
2246
+ }
2247
+ ]
2248
+ },
2249
+ "match": {
2250
+ "anyOf": [
2251
+ {
2252
+ "type": "string",
2253
+ "enum": [
2254
+ "path"
2255
+ ]
2256
+ },
2257
+ {
2258
+ "type": "string",
2259
+ "enum": [
2260
+ "user_agent"
2261
+ ]
1981
2262
  }
1982
2263
  ]
1983
2264
  },
@@ -3022,6 +3303,66 @@
3022
3303
  "apikey": []
3023
3304
  }
3024
3305
  ],
3306
+ "responses": {
3307
+ "200": {
3308
+ "description": "Default Response",
3309
+ "content": {
3310
+ "application/json": {
3311
+ "schema": {
3312
+ "$ref": "#/components/schemas/ProjectInviteResult"
3313
+ }
3314
+ }
3315
+ }
3316
+ }
3317
+ }
3318
+ }
3319
+ },
3320
+ "/project/{id}/collaborator/{user_id}": {
3321
+ "delete": {
3322
+ "operationId": "project/removeCollaborator",
3323
+ "summary": "Remove a collaborator from a project",
3324
+ "tags": [
3325
+ "projects"
3326
+ ],
3327
+ "description": "Remove a collaborator from a project",
3328
+ "parameters": [
3329
+ {
3330
+ "schema": {
3331
+ "type": "string"
3332
+ },
3333
+ "in": "path",
3334
+ "name": "id",
3335
+ "required": true
3336
+ },
3337
+ {
3338
+ "schema": {
3339
+ "type": "string"
3340
+ },
3341
+ "in": "path",
3342
+ "name": "user_id",
3343
+ "required": true
3344
+ }
3345
+ ],
3346
+ "security": [
3347
+ {
3348
+ "faable_user": []
3349
+ },
3350
+ {
3351
+ "faable_cli": []
3352
+ },
3353
+ {
3354
+ "faable_m2m": []
3355
+ },
3356
+ {
3357
+ "faable_machine": []
3358
+ },
3359
+ {
3360
+ "apikey_basic": []
3361
+ },
3362
+ {
3363
+ "apikey": []
3364
+ }
3365
+ ],
3025
3366
  "responses": {
3026
3367
  "200": {
3027
3368
  "description": "Project",
@@ -3036,6 +3377,110 @@
3036
3377
  }
3037
3378
  }
3038
3379
  },
3380
+ "/project/{id}/suspend": {
3381
+ "post": {
3382
+ "operationId": "project/suspend",
3383
+ "summary": "Suspend a project",
3384
+ "tags": [
3385
+ "projects"
3386
+ ],
3387
+ "description": "Take down every app in a project (superadmin)",
3388
+ "parameters": [
3389
+ {
3390
+ "schema": {
3391
+ "type": "string"
3392
+ },
3393
+ "in": "path",
3394
+ "name": "id",
3395
+ "required": true
3396
+ }
3397
+ ],
3398
+ "security": [
3399
+ {
3400
+ "faable_user": []
3401
+ },
3402
+ {
3403
+ "faable_cli": []
3404
+ },
3405
+ {
3406
+ "faable_m2m": []
3407
+ },
3408
+ {
3409
+ "faable_machine": []
3410
+ },
3411
+ {
3412
+ "apikey_basic": []
3413
+ },
3414
+ {
3415
+ "apikey": []
3416
+ }
3417
+ ],
3418
+ "responses": {
3419
+ "200": {
3420
+ "description": "Default Response",
3421
+ "content": {
3422
+ "application/json": {
3423
+ "schema": {
3424
+ "$ref": "#/components/schemas/ProjectModerationResult"
3425
+ }
3426
+ }
3427
+ }
3428
+ }
3429
+ }
3430
+ }
3431
+ },
3432
+ "/project/{id}/restore": {
3433
+ "post": {
3434
+ "operationId": "project/restore",
3435
+ "summary": "Restore a project",
3436
+ "tags": [
3437
+ "projects"
3438
+ ],
3439
+ "description": "Re-enable every app in a project (superadmin)",
3440
+ "parameters": [
3441
+ {
3442
+ "schema": {
3443
+ "type": "string"
3444
+ },
3445
+ "in": "path",
3446
+ "name": "id",
3447
+ "required": true
3448
+ }
3449
+ ],
3450
+ "security": [
3451
+ {
3452
+ "faable_user": []
3453
+ },
3454
+ {
3455
+ "faable_cli": []
3456
+ },
3457
+ {
3458
+ "faable_m2m": []
3459
+ },
3460
+ {
3461
+ "faable_machine": []
3462
+ },
3463
+ {
3464
+ "apikey_basic": []
3465
+ },
3466
+ {
3467
+ "apikey": []
3468
+ }
3469
+ ],
3470
+ "responses": {
3471
+ "200": {
3472
+ "description": "Default Response",
3473
+ "content": {
3474
+ "application/json": {
3475
+ "schema": {
3476
+ "$ref": "#/components/schemas/ProjectModerationResult"
3477
+ }
3478
+ }
3479
+ }
3480
+ }
3481
+ }
3482
+ }
3483
+ },
3039
3484
  "/project": {
3040
3485
  "get": {
3041
3486
  "operationId": "project/list",
@@ -3251,6 +3696,12 @@
3251
3696
  "type": "string"
3252
3697
  }
3253
3698
  },
3699
+ "owner_suspended": {
3700
+ "type": "boolean"
3701
+ },
3702
+ "owner_email": {
3703
+ "type": "string"
3704
+ },
3254
3705
  "createdAt": {
3255
3706
  "type": "string",
3256
3707
  "description": "Project creation date"
@@ -3349,6 +3800,12 @@
3349
3800
  "type": "string"
3350
3801
  }
3351
3802
  },
3803
+ "owner_suspended": {
3804
+ "type": "boolean"
3805
+ },
3806
+ "owner_email": {
3807
+ "type": "string"
3808
+ },
3352
3809
  "createdAt": {
3353
3810
  "type": "string",
3354
3811
  "description": "Project creation date"
@@ -3388,12 +3845,6 @@
3388
3845
  },
3389
3846
  "description": {
3390
3847
  "type": "string"
3391
- },
3392
- "collaborators": {
3393
- "type": "array",
3394
- "items": {
3395
- "type": "string"
3396
- }
3397
3848
  }
3398
3849
  },
3399
3850
  "additionalProperties": false
@@ -3473,6 +3924,12 @@
3473
3924
  "type": "string"
3474
3925
  }
3475
3926
  },
3927
+ "owner_suspended": {
3928
+ "type": "boolean"
3929
+ },
3930
+ "owner_email": {
3931
+ "type": "string"
3932
+ },
3476
3933
  "createdAt": {
3477
3934
  "type": "string",
3478
3935
  "description": "Project creation date"
@@ -3569,6 +4026,12 @@
3569
4026
  "type": "string"
3570
4027
  }
3571
4028
  },
4029
+ "owner_suspended": {
4030
+ "type": "boolean"
4031
+ },
4032
+ "owner_email": {
4033
+ "type": "string"
4034
+ },
3572
4035
  "createdAt": {
3573
4036
  "type": "string",
3574
4037
  "description": "Project creation date"
@@ -3832,6 +4295,42 @@
3832
4295
  }
3833
4296
  ]
3834
4297
  },
4298
+ "detected": {
4299
+ "anyOf": [
4300
+ {
4301
+ "type": "object",
4302
+ "required": [
4303
+ "buildpack",
4304
+ "runtime"
4305
+ ],
4306
+ "properties": {
4307
+ "buildpack": {
4308
+ "type": "string"
4309
+ },
4310
+ "framework": {
4311
+ "type": "string"
4312
+ },
4313
+ "runtime": {
4314
+ "type": "object",
4315
+ "required": [
4316
+ "name"
4317
+ ],
4318
+ "properties": {
4319
+ "name": {
4320
+ "type": "string"
4321
+ },
4322
+ "version": {
4323
+ "type": "string"
4324
+ }
4325
+ }
4326
+ }
4327
+ }
4328
+ },
4329
+ {
4330
+ "type": "null"
4331
+ }
4332
+ ]
4333
+ },
3835
4334
  "mode": {
3836
4335
  "$ref": "#/components/schemas/AppMode"
3837
4336
  },
@@ -3954,6 +4453,28 @@
3954
4453
  ],
3955
4454
  "description": "Platform GitHub access health, maintained by installation lifecycle webhooks. Absent/null = ok; 'deleted' | 'suspended' | 'repo_removed' = access broken until re-linked."
3956
4455
  },
4456
+ "github_repo_hidden": {
4457
+ "anyOf": [
4458
+ {
4459
+ "type": "string"
4460
+ },
4461
+ {
4462
+ "type": "null"
4463
+ }
4464
+ ],
4465
+ "description": "The linked repository stopped being readable after the app was created, per the GitHub `repository` webhook. Absent/null = visible; 'deleted' | 'privatized' | 'archived' = the source was pulled after deploying (the analyzer re-scores the promoted deployment against our own build artifact)."
4466
+ },
4467
+ "github_disconnect_reason": {
4468
+ "anyOf": [
4469
+ {
4470
+ "type": "string"
4471
+ },
4472
+ {
4473
+ "type": "null"
4474
+ }
4475
+ ],
4476
+ "description": "Why the platform cleared the repository link automatically. Absent/null = never auto-disconnected (or re-linked since); 'push_flood' = the repo exceeded the hourly push limit and must be re-linked by the user."
4477
+ },
3957
4478
  "deploy_trigger": {
3958
4479
  "anyOf": [
3959
4480
  {
@@ -4127,6 +4648,42 @@
4127
4648
  }
4128
4649
  ]
4129
4650
  },
4651
+ "detected": {
4652
+ "anyOf": [
4653
+ {
4654
+ "type": "object",
4655
+ "required": [
4656
+ "buildpack",
4657
+ "runtime"
4658
+ ],
4659
+ "properties": {
4660
+ "buildpack": {
4661
+ "type": "string"
4662
+ },
4663
+ "framework": {
4664
+ "type": "string"
4665
+ },
4666
+ "runtime": {
4667
+ "type": "object",
4668
+ "required": [
4669
+ "name"
4670
+ ],
4671
+ "properties": {
4672
+ "name": {
4673
+ "type": "string"
4674
+ },
4675
+ "version": {
4676
+ "type": "string"
4677
+ }
4678
+ }
4679
+ }
4680
+ }
4681
+ },
4682
+ {
4683
+ "type": "null"
4684
+ }
4685
+ ]
4686
+ },
4130
4687
  "mode": {
4131
4688
  "$ref": "#/components/schemas/AppMode"
4132
4689
  },
@@ -4218,27 +4775,49 @@
4218
4775
  "notify_deploy_success": {
4219
4776
  "anyOf": [
4220
4777
  {
4221
- "type": "boolean"
4778
+ "type": "boolean"
4779
+ },
4780
+ {
4781
+ "type": "null"
4782
+ }
4783
+ ],
4784
+ "description": "Success deploy emails (first deploy + every promote). Absent/null = enabled; false = muted. Failure emails are never gated by this."
4785
+ },
4786
+ "status": {
4787
+ "$ref": "#/components/schemas/AppStatus"
4788
+ },
4789
+ "repository": {
4790
+ "type": "string"
4791
+ },
4792
+ "github_branch": {
4793
+ "type": "string"
4794
+ },
4795
+ "github_installation_id": {
4796
+ "type": "string"
4797
+ },
4798
+ "github_installation_state": {
4799
+ "anyOf": [
4800
+ {
4801
+ "type": "string"
4802
+ },
4803
+ {
4804
+ "type": "null"
4805
+ }
4806
+ ],
4807
+ "description": "Platform GitHub access health, maintained by installation lifecycle webhooks. Absent/null = ok; 'deleted' | 'suspended' | 'repo_removed' = access broken until re-linked."
4808
+ },
4809
+ "github_repo_hidden": {
4810
+ "anyOf": [
4811
+ {
4812
+ "type": "string"
4222
4813
  },
4223
4814
  {
4224
4815
  "type": "null"
4225
4816
  }
4226
4817
  ],
4227
- "description": "Success deploy emails (first deploy + every promote). Absent/null = enabled; false = muted. Failure emails are never gated by this."
4228
- },
4229
- "status": {
4230
- "$ref": "#/components/schemas/AppStatus"
4231
- },
4232
- "repository": {
4233
- "type": "string"
4234
- },
4235
- "github_branch": {
4236
- "type": "string"
4818
+ "description": "The linked repository stopped being readable after the app was created, per the GitHub `repository` webhook. Absent/null = visible; 'deleted' | 'privatized' | 'archived' = the source was pulled after deploying (the analyzer re-scores the promoted deployment against our own build artifact)."
4237
4819
  },
4238
- "github_installation_id": {
4239
- "type": "string"
4240
- },
4241
- "github_installation_state": {
4820
+ "github_disconnect_reason": {
4242
4821
  "anyOf": [
4243
4822
  {
4244
4823
  "type": "string"
@@ -4247,7 +4826,7 @@
4247
4826
  "type": "null"
4248
4827
  }
4249
4828
  ],
4250
- "description": "Platform GitHub access health, maintained by installation lifecycle webhooks. Absent/null = ok; 'deleted' | 'suspended' | 'repo_removed' = access broken until re-linked."
4829
+ "description": "Why the platform cleared the repository link automatically. Absent/null = never auto-disconnected (or re-linked since); 'push_flood' = the repo exceeded the hourly push limit and must be re-linked by the user."
4251
4830
  },
4252
4831
  "deploy_trigger": {
4253
4832
  "anyOf": [
@@ -4441,6 +5020,42 @@
4441
5020
  }
4442
5021
  ]
4443
5022
  },
5023
+ "detected": {
5024
+ "anyOf": [
5025
+ {
5026
+ "type": "object",
5027
+ "required": [
5028
+ "buildpack",
5029
+ "runtime"
5030
+ ],
5031
+ "properties": {
5032
+ "buildpack": {
5033
+ "type": "string"
5034
+ },
5035
+ "framework": {
5036
+ "type": "string"
5037
+ },
5038
+ "runtime": {
5039
+ "type": "object",
5040
+ "required": [
5041
+ "name"
5042
+ ],
5043
+ "properties": {
5044
+ "name": {
5045
+ "type": "string"
5046
+ },
5047
+ "version": {
5048
+ "type": "string"
5049
+ }
5050
+ }
5051
+ }
5052
+ }
5053
+ },
5054
+ {
5055
+ "type": "null"
5056
+ }
5057
+ ]
5058
+ },
4444
5059
  "mode": {
4445
5060
  "$ref": "#/components/schemas/AppMode"
4446
5061
  },
@@ -4563,6 +5178,28 @@
4563
5178
  ],
4564
5179
  "description": "Platform GitHub access health, maintained by installation lifecycle webhooks. Absent/null = ok; 'deleted' | 'suspended' | 'repo_removed' = access broken until re-linked."
4565
5180
  },
5181
+ "github_repo_hidden": {
5182
+ "anyOf": [
5183
+ {
5184
+ "type": "string"
5185
+ },
5186
+ {
5187
+ "type": "null"
5188
+ }
5189
+ ],
5190
+ "description": "The linked repository stopped being readable after the app was created, per the GitHub `repository` webhook. Absent/null = visible; 'deleted' | 'privatized' | 'archived' = the source was pulled after deploying (the analyzer re-scores the promoted deployment against our own build artifact)."
5191
+ },
5192
+ "github_disconnect_reason": {
5193
+ "anyOf": [
5194
+ {
5195
+ "type": "string"
5196
+ },
5197
+ {
5198
+ "type": "null"
5199
+ }
5200
+ ],
5201
+ "description": "Why the platform cleared the repository link automatically. Absent/null = never auto-disconnected (or re-linked since); 'push_flood' = the repo exceeded the hourly push limit and must be re-linked by the user."
5202
+ },
4566
5203
  "deploy_trigger": {
4567
5204
  "anyOf": [
4568
5205
  {
@@ -4716,6 +5353,42 @@
4716
5353
  }
4717
5354
  ]
4718
5355
  },
5356
+ "detected": {
5357
+ "anyOf": [
5358
+ {
5359
+ "type": "object",
5360
+ "required": [
5361
+ "buildpack",
5362
+ "runtime"
5363
+ ],
5364
+ "properties": {
5365
+ "buildpack": {
5366
+ "type": "string"
5367
+ },
5368
+ "framework": {
5369
+ "type": "string"
5370
+ },
5371
+ "runtime": {
5372
+ "type": "object",
5373
+ "required": [
5374
+ "name"
5375
+ ],
5376
+ "properties": {
5377
+ "name": {
5378
+ "type": "string"
5379
+ },
5380
+ "version": {
5381
+ "type": "string"
5382
+ }
5383
+ }
5384
+ }
5385
+ }
5386
+ },
5387
+ {
5388
+ "type": "null"
5389
+ }
5390
+ ]
5391
+ },
4719
5392
  "mode": {
4720
5393
  "$ref": "#/components/schemas/AppMode"
4721
5394
  },
@@ -4838,6 +5511,28 @@
4838
5511
  ],
4839
5512
  "description": "Platform GitHub access health, maintained by installation lifecycle webhooks. Absent/null = ok; 'deleted' | 'suspended' | 'repo_removed' = access broken until re-linked."
4840
5513
  },
5514
+ "github_repo_hidden": {
5515
+ "anyOf": [
5516
+ {
5517
+ "type": "string"
5518
+ },
5519
+ {
5520
+ "type": "null"
5521
+ }
5522
+ ],
5523
+ "description": "The linked repository stopped being readable after the app was created, per the GitHub `repository` webhook. Absent/null = visible; 'deleted' | 'privatized' | 'archived' = the source was pulled after deploying (the analyzer re-scores the promoted deployment against our own build artifact)."
5524
+ },
5525
+ "github_disconnect_reason": {
5526
+ "anyOf": [
5527
+ {
5528
+ "type": "string"
5529
+ },
5530
+ {
5531
+ "type": "null"
5532
+ }
5533
+ ],
5534
+ "description": "Why the platform cleared the repository link automatically. Absent/null = never auto-disconnected (or re-linked since); 'push_flood' = the repo exceeded the hourly push limit and must be re-linked by the user."
5535
+ },
4841
5536
  "deploy_trigger": {
4842
5537
  "anyOf": [
4843
5538
  {
@@ -6355,6 +7050,9 @@
6355
7050
  }
6356
7051
  ]
6357
7052
  },
7053
+ "detected": {
7054
+ "$ref": "#/components/schemas/DeploymentDetected"
7055
+ },
6358
7056
  "status": {
6359
7057
  "$ref": "#/components/schemas/DeploymentStatus"
6360
7058
  },
@@ -6488,6 +7186,9 @@
6488
7186
  }
6489
7187
  ]
6490
7188
  },
7189
+ "detected": {
7190
+ "$ref": "#/components/schemas/DeploymentDetected"
7191
+ },
6491
7192
  "status": {
6492
7193
  "$ref": "#/components/schemas/DeploymentStatus"
6493
7194
  },
@@ -6536,6 +7237,9 @@
6536
7237
  },
6537
7238
  "type": {
6538
7239
  "type": "string"
7240
+ },
7241
+ "detected": {
7242
+ "$ref": "#/components/schemas/DeploymentDetected"
6539
7243
  }
6540
7244
  }
6541
7245
  }
@@ -6640,6 +7344,9 @@
6640
7344
  }
6641
7345
  ]
6642
7346
  },
7347
+ "detected": {
7348
+ "$ref": "#/components/schemas/DeploymentDetected"
7349
+ },
6643
7350
  "status": {
6644
7351
  "$ref": "#/components/schemas/DeploymentStatus"
6645
7352
  },
@@ -6771,6 +7478,9 @@
6771
7478
  }
6772
7479
  ]
6773
7480
  },
7481
+ "detected": {
7482
+ "$ref": "#/components/schemas/DeploymentDetected"
7483
+ },
6774
7484
  "status": {
6775
7485
  "$ref": "#/components/schemas/DeploymentStatus"
6776
7486
  },
@@ -7822,6 +8532,190 @@
7822
8532
  }
7823
8533
  }
7824
8534
  },
8535
+ "/analyzer/scan": {
8536
+ "get": {
8537
+ "operationId": "analyzer/listScans",
8538
+ "summary": "List analyzer scans",
8539
+ "tags": [
8540
+ "analyzer"
8541
+ ],
8542
+ "description": "List analyzer scan results, newest first (superadmin). The abuse-detection corpus + takedown audit trail.",
8543
+ "parameters": [
8544
+ {
8545
+ "schema": {
8546
+ "anyOf": [
8547
+ {
8548
+ "type": "string",
8549
+ "enum": [
8550
+ "clean"
8551
+ ]
8552
+ },
8553
+ {
8554
+ "type": "string",
8555
+ "enum": [
8556
+ "review"
8557
+ ]
8558
+ },
8559
+ {
8560
+ "type": "string",
8561
+ "enum": [
8562
+ "quarantine"
8563
+ ]
8564
+ },
8565
+ {
8566
+ "type": "string",
8567
+ "enum": [
8568
+ "skipped"
8569
+ ]
8570
+ }
8571
+ ]
8572
+ },
8573
+ "in": "query",
8574
+ "name": "verdict",
8575
+ "required": false
8576
+ },
8577
+ {
8578
+ "schema": {
8579
+ "type": "string"
8580
+ },
8581
+ "in": "query",
8582
+ "name": "app_id",
8583
+ "required": false
8584
+ },
8585
+ {
8586
+ "schema": {
8587
+ "type": "string"
8588
+ },
8589
+ "in": "query",
8590
+ "name": "user_id",
8591
+ "required": false
8592
+ },
8593
+ {
8594
+ "schema": {
8595
+ "type": "integer",
8596
+ "minimum": 1,
8597
+ "maximum": 200
8598
+ },
8599
+ "in": "query",
8600
+ "name": "limit",
8601
+ "required": false
8602
+ }
8603
+ ],
8604
+ "security": [
8605
+ {
8606
+ "faable_user": []
8607
+ },
8608
+ {
8609
+ "faable_cli": []
8610
+ },
8611
+ {
8612
+ "faable_m2m": []
8613
+ },
8614
+ {
8615
+ "faable_machine": []
8616
+ },
8617
+ {
8618
+ "apikey_basic": []
8619
+ },
8620
+ {
8621
+ "apikey": []
8622
+ }
8623
+ ],
8624
+ "responses": {
8625
+ "200": {
8626
+ "description": "Default Response"
8627
+ }
8628
+ }
8629
+ }
8630
+ },
8631
+ "/analyzer/stats": {
8632
+ "get": {
8633
+ "operationId": "analyzer/stats",
8634
+ "summary": "Analyzer stats",
8635
+ "tags": [
8636
+ "analyzer"
8637
+ ],
8638
+ "description": "Analyzer detection stats: counts per verdict + top signatures (superadmin).",
8639
+ "security": [
8640
+ {
8641
+ "faable_user": []
8642
+ },
8643
+ {
8644
+ "faable_cli": []
8645
+ },
8646
+ {
8647
+ "faable_m2m": []
8648
+ },
8649
+ {
8650
+ "faable_machine": []
8651
+ },
8652
+ {
8653
+ "apikey_basic": []
8654
+ },
8655
+ {
8656
+ "apikey": []
8657
+ }
8658
+ ],
8659
+ "responses": {
8660
+ "200": {
8661
+ "description": "Default Response"
8662
+ }
8663
+ }
8664
+ }
8665
+ },
8666
+ "/analyzer/rescan/{app_id}": {
8667
+ "post": {
8668
+ "operationId": "analyzer/rescan",
8669
+ "summary": "Rescan a deployment",
8670
+ "tags": [
8671
+ "analyzer"
8672
+ ],
8673
+ "description": "Re-scan an app's promoted deployment (or ?deployment_id=…). Forces a fresh scan + enforcement; use after a signature update. Superadmin.",
8674
+ "parameters": [
8675
+ {
8676
+ "schema": {
8677
+ "type": "string"
8678
+ },
8679
+ "in": "query",
8680
+ "name": "deployment_id",
8681
+ "required": false
8682
+ },
8683
+ {
8684
+ "schema": {
8685
+ "type": "string"
8686
+ },
8687
+ "in": "path",
8688
+ "name": "app_id",
8689
+ "required": true
8690
+ }
8691
+ ],
8692
+ "security": [
8693
+ {
8694
+ "faable_user": []
8695
+ },
8696
+ {
8697
+ "faable_cli": []
8698
+ },
8699
+ {
8700
+ "faable_m2m": []
8701
+ },
8702
+ {
8703
+ "faable_machine": []
8704
+ },
8705
+ {
8706
+ "apikey_basic": []
8707
+ },
8708
+ {
8709
+ "apikey": []
8710
+ }
8711
+ ],
8712
+ "responses": {
8713
+ "200": {
8714
+ "description": "Default Response"
8715
+ }
8716
+ }
8717
+ }
8718
+ },
7825
8719
  "/usage/summary": {
7826
8720
  "get": {
7827
8721
  "operationId": "usage/summary",