@crvouga/atlas 0.17.0 → 1.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.
- package/CHANGELOG.md +12 -0
- package/README.md +52 -8
- package/dist/core/src/cli.d.ts +1 -1
- package/dist/core/src/cli.js +1 -1
- package/dist/reports/src/garbage.d.ts +39 -0
- package/dist/reports/src/garbage.js +82 -0
- package/dist/reports/src/report-index.d.ts +6 -0
- package/dist/reports/src/report-index.js +14 -0
- package/dist/schema/src/index.d.ts +1 -0
- package/dist/schema/src/index.js +1 -0
- package/dist/schema/src/server-config.d.ts +7 -49
- package/dist/schema/src/server-config.js +8 -21
- package/dist/schema/src/user-state.d.ts +115 -0
- package/dist/schema/src/user-state.js +54 -0
- package/dist/server/src/app.d.ts +16 -2
- package/dist/server/src/app.js +62 -0
- package/dist/server/src/config.d.ts +16 -21
- package/dist/server/src/config.js +48 -57
- package/dist/server/src/dev.d.ts +1 -1
- package/dist/server/src/dev.js +20 -7
- package/dist/server/src/index.d.ts +5 -1
- package/dist/server/src/index.js +5 -1
- package/dist/server/src/main.d.ts +23 -7
- package/dist/server/src/main.js +72 -26
- package/dist/server/src/openapi.js +24 -5
- package/dist/server/src/projects.js +89 -14
- package/dist/server/src/settings.d.ts +23 -7
- package/dist/server/src/settings.js +50 -60
- package/dist/server/src/storage.d.ts +68 -0
- package/dist/server/src/storage.js +125 -0
- package/dist/server/src/user-state.d.ts +31 -0
- package/dist/server/src/user-state.js +74 -0
- package/docs/agents.md +1 -1
- package/docs/deploying.md +38 -39
- package/docs/reference/cli.md +12 -7
- package/docs/reference/http-api.md +30 -2
- package/docs/reference/reports.md +71 -0
- package/docs/reference/schema.md +102 -16
- package/docs/reference/server.md +263 -41
- package/docs/report-backends.md +0 -144
- package/docs/report-contract.md +1 -1
- package/docs/runners.md +1 -1
- package/docs/server.md +141 -36
- package/docs/statecharts.md +1 -1
- package/docs/ui.md +8 -1
- package/docs/workspaces.md +5 -2
- package/llms-full.txt +238 -234
- package/llms.txt +1 -1
- package/package.json +2 -2
- package/packages/reports/STORAGE.md +1 -1
- package/packages/schema/schemas/gc-policy.schema.json +36 -0
- package/packages/schema/schemas/gc-run-result.schema.json +106 -0
- package/packages/schema/schemas/gc-snapshot.schema.json +122 -0
- package/packages/schema/schemas/server-config.schema.json +0 -41
- package/packages/schema/schemas/server-editable-settings.schema.json +0 -41
- package/packages/schema/schemas/server-settings-snapshot.schema.json +0 -82
- package/packages/schema/schemas/user-state.schema.json +140 -0
- package/packages/server/README.md +11 -6
- package/packages/server/openapi.json +510 -126
- package/packages/visualizer/src/admin/SettingsPage.tsx +183 -88
- package/packages/visualizer/src/evidence/check-detail.tsx +6 -1
- package/packages/visualizer/src/evidence/evidence-context.tsx +9 -2
- package/packages/visualizer/src/evidence/load-state.tsx +65 -0
- package/packages/visualizer/src/evidence/overview.tsx +4 -6
- package/packages/visualizer/src/evidence/recording-page.tsx +17 -7
- package/packages/visualizer/src/evidence/spec-header.tsx +8 -6
- package/packages/visualizer/src/evidence/spec-page.tsx +98 -15
- package/packages/visualizer/src/find/Finder.tsx +45 -7
- package/packages/visualizer/src/spec-kind.test.ts +14 -1
- package/packages/visualizer/src/spec-kind.ts +28 -2
|
@@ -1019,7 +1019,7 @@
|
|
|
1019
1019
|
"Operations"
|
|
1020
1020
|
],
|
|
1021
1021
|
"summary": "Read server settings",
|
|
1022
|
-
"description": "Returns editable
|
|
1022
|
+
"description": "Returns the editable report and live-run settings saved in the user state in S3, active settings, a revision, and configuration precedence. Storage and authentication settings are excluded. Requires an admin Bearer token. Embedded applications may manage settings outside this API.\n\nRole needed: `admin`.",
|
|
1023
1023
|
"x-atlas-role": "admin",
|
|
1024
1024
|
"security": [
|
|
1025
1025
|
{
|
|
@@ -1075,7 +1075,7 @@
|
|
|
1075
1075
|
"Operations"
|
|
1076
1076
|
],
|
|
1077
1077
|
"summary": "Save settings for the next restart",
|
|
1078
|
-
"description": "Replaces editable
|
|
1078
|
+
"description": "Replaces the editable report and live-run settings in the user state in S3 (`server/state.json`), preserving the garbage collection policy and other fields. Persists a validated configuration; no report data is moved. Environment variables and flags override these values after restart. Requires an admin Bearer token, same-origin requests in browsers, and a current revision.\n\nRole needed: `admin`.",
|
|
1079
1079
|
"x-atlas-role": "admin",
|
|
1080
1080
|
"security": [
|
|
1081
1081
|
{
|
|
@@ -1095,7 +1095,7 @@
|
|
|
1095
1095
|
],
|
|
1096
1096
|
"requestBody": {
|
|
1097
1097
|
"required": true,
|
|
1098
|
-
"description": "Editable fields from ServerConfig, excluding authentication, host, port and site. Maximum 64 KiB.",
|
|
1098
|
+
"description": "Editable fields from ServerConfig, excluding storage, authentication, host, port and site. Maximum 64 KiB.",
|
|
1099
1099
|
"content": {
|
|
1100
1100
|
"application/json": {
|
|
1101
1101
|
"schema": {
|
|
@@ -1188,6 +1188,251 @@
|
|
|
1188
1188
|
}
|
|
1189
1189
|
}
|
|
1190
1190
|
},
|
|
1191
|
+
"/api/settings/gc": {
|
|
1192
|
+
"get": {
|
|
1193
|
+
"operationId": "getGarbageCollectionPolicy",
|
|
1194
|
+
"tags": [
|
|
1195
|
+
"Operations"
|
|
1196
|
+
],
|
|
1197
|
+
"summary": "Read the garbage collection policy",
|
|
1198
|
+
"description": "Returns the policy kept in the user state in S3 (`server/state.json`), or `policy: null, saved: false` when none has been saved yet, in which case garbage collection is off and nothing is deleted. Also returns the revision to send back when saving and the last pass over each project. Requires an admin Bearer token. If the stored user state is unreadable the answer is 503 and the stored object is left untouched.\n\nRole needed: `admin`.",
|
|
1199
|
+
"x-atlas-role": "admin",
|
|
1200
|
+
"security": [
|
|
1201
|
+
{
|
|
1202
|
+
"bearer": []
|
|
1203
|
+
}
|
|
1204
|
+
],
|
|
1205
|
+
"responses": {
|
|
1206
|
+
"200": {
|
|
1207
|
+
"description": "The policy, its revision and the last passes.",
|
|
1208
|
+
"content": {
|
|
1209
|
+
"application/json": {
|
|
1210
|
+
"schema": {
|
|
1211
|
+
"$ref": "#/components/schemas/GcSnapshot"
|
|
1212
|
+
}
|
|
1213
|
+
}
|
|
1214
|
+
}
|
|
1215
|
+
},
|
|
1216
|
+
"401": {
|
|
1217
|
+
"description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
|
|
1218
|
+
"content": {
|
|
1219
|
+
"application/problem+json": {
|
|
1220
|
+
"schema": {
|
|
1221
|
+
"$ref": "#/components/schemas/Problem"
|
|
1222
|
+
}
|
|
1223
|
+
}
|
|
1224
|
+
}
|
|
1225
|
+
},
|
|
1226
|
+
"403": {
|
|
1227
|
+
"description": "The token is known but its role may not do this.",
|
|
1228
|
+
"content": {
|
|
1229
|
+
"application/problem+json": {
|
|
1230
|
+
"schema": {
|
|
1231
|
+
"$ref": "#/components/schemas/Problem"
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1234
|
+
}
|
|
1235
|
+
},
|
|
1236
|
+
"503": {
|
|
1237
|
+
"description": "The user state in S3 cannot be read, or settings are managed by the embedding application.",
|
|
1238
|
+
"content": {
|
|
1239
|
+
"application/problem+json": {
|
|
1240
|
+
"schema": {
|
|
1241
|
+
"$ref": "#/components/schemas/Problem"
|
|
1242
|
+
}
|
|
1243
|
+
}
|
|
1244
|
+
}
|
|
1245
|
+
}
|
|
1246
|
+
}
|
|
1247
|
+
},
|
|
1248
|
+
"put": {
|
|
1249
|
+
"operationId": "saveGarbageCollectionPolicy",
|
|
1250
|
+
"tags": [
|
|
1251
|
+
"Operations"
|
|
1252
|
+
],
|
|
1253
|
+
"summary": "Save the garbage collection policy",
|
|
1254
|
+
"description": "Replaces the policy in the user state in S3 and leaves the rest of that document alone. The server reads the policy from S3 each time it collects, so the new policy applies at the next pass, without a restart. Requires an admin Bearer token, same-origin requests in browsers, and the current revision.\n\nRole needed: `admin`.",
|
|
1255
|
+
"x-atlas-role": "admin",
|
|
1256
|
+
"security": [
|
|
1257
|
+
{
|
|
1258
|
+
"bearer": []
|
|
1259
|
+
}
|
|
1260
|
+
],
|
|
1261
|
+
"parameters": [
|
|
1262
|
+
{
|
|
1263
|
+
"required": true,
|
|
1264
|
+
"name": "If-Match",
|
|
1265
|
+
"in": "header",
|
|
1266
|
+
"description": "The quoted revision returned by GET /api/settings/gc.",
|
|
1267
|
+
"schema": {
|
|
1268
|
+
"type": "string"
|
|
1269
|
+
}
|
|
1270
|
+
}
|
|
1271
|
+
],
|
|
1272
|
+
"requestBody": {
|
|
1273
|
+
"required": true,
|
|
1274
|
+
"description": "The policy. Maximum 16 KiB.",
|
|
1275
|
+
"content": {
|
|
1276
|
+
"application/json": {
|
|
1277
|
+
"schema": {
|
|
1278
|
+
"$ref": "#/components/schemas/GcPolicy"
|
|
1279
|
+
}
|
|
1280
|
+
}
|
|
1281
|
+
}
|
|
1282
|
+
},
|
|
1283
|
+
"responses": {
|
|
1284
|
+
"200": {
|
|
1285
|
+
"description": "The saved policy and the new revision.",
|
|
1286
|
+
"content": {
|
|
1287
|
+
"application/json": {
|
|
1288
|
+
"schema": {
|
|
1289
|
+
"$ref": "#/components/schemas/GcSnapshot"
|
|
1290
|
+
}
|
|
1291
|
+
}
|
|
1292
|
+
}
|
|
1293
|
+
},
|
|
1294
|
+
"401": {
|
|
1295
|
+
"description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
|
|
1296
|
+
"content": {
|
|
1297
|
+
"application/problem+json": {
|
|
1298
|
+
"schema": {
|
|
1299
|
+
"$ref": "#/components/schemas/Problem"
|
|
1300
|
+
}
|
|
1301
|
+
}
|
|
1302
|
+
}
|
|
1303
|
+
},
|
|
1304
|
+
"403": {
|
|
1305
|
+
"description": "The token is known but its role may not do this.",
|
|
1306
|
+
"content": {
|
|
1307
|
+
"application/problem+json": {
|
|
1308
|
+
"schema": {
|
|
1309
|
+
"$ref": "#/components/schemas/Problem"
|
|
1310
|
+
}
|
|
1311
|
+
}
|
|
1312
|
+
}
|
|
1313
|
+
},
|
|
1314
|
+
"409": {
|
|
1315
|
+
"description": "The state changed; reload before saving.",
|
|
1316
|
+
"content": {
|
|
1317
|
+
"application/problem+json": {
|
|
1318
|
+
"schema": {
|
|
1319
|
+
"$ref": "#/components/schemas/Problem"
|
|
1320
|
+
}
|
|
1321
|
+
}
|
|
1322
|
+
}
|
|
1323
|
+
},
|
|
1324
|
+
"413": {
|
|
1325
|
+
"description": "The body exceeds the limit.",
|
|
1326
|
+
"content": {
|
|
1327
|
+
"application/problem+json": {
|
|
1328
|
+
"schema": {
|
|
1329
|
+
"$ref": "#/components/schemas/Problem"
|
|
1330
|
+
}
|
|
1331
|
+
}
|
|
1332
|
+
}
|
|
1333
|
+
},
|
|
1334
|
+
"422": {
|
|
1335
|
+
"description": "Invalid policy.",
|
|
1336
|
+
"content": {
|
|
1337
|
+
"application/problem+json": {
|
|
1338
|
+
"schema": {
|
|
1339
|
+
"$ref": "#/components/schemas/Problem"
|
|
1340
|
+
}
|
|
1341
|
+
}
|
|
1342
|
+
}
|
|
1343
|
+
},
|
|
1344
|
+
"428": {
|
|
1345
|
+
"description": "A quoted revision is required.",
|
|
1346
|
+
"content": {
|
|
1347
|
+
"application/problem+json": {
|
|
1348
|
+
"schema": {
|
|
1349
|
+
"$ref": "#/components/schemas/Problem"
|
|
1350
|
+
}
|
|
1351
|
+
}
|
|
1352
|
+
}
|
|
1353
|
+
},
|
|
1354
|
+
"503": {
|
|
1355
|
+
"description": "The user state in S3 cannot be read, or settings are managed by the embedding application.",
|
|
1356
|
+
"content": {
|
|
1357
|
+
"application/problem+json": {
|
|
1358
|
+
"schema": {
|
|
1359
|
+
"$ref": "#/components/schemas/Problem"
|
|
1360
|
+
}
|
|
1361
|
+
}
|
|
1362
|
+
}
|
|
1363
|
+
}
|
|
1364
|
+
}
|
|
1365
|
+
}
|
|
1366
|
+
},
|
|
1367
|
+
"/api/settings/gc/run": {
|
|
1368
|
+
"post": {
|
|
1369
|
+
"operationId": "runGarbageCollection",
|
|
1370
|
+
"tags": [
|
|
1371
|
+
"Operations"
|
|
1372
|
+
],
|
|
1373
|
+
"summary": "Collect garbage now, or preview it",
|
|
1374
|
+
"description": "Applies the policy saved in S3 to every project now, instead of waiting for the schedule. Only report layers that were read and no longer decide any result, older than the policy allows and beyond its `keepLatest`, are deleted, with the captured files only they used. With `dryRun=1` nothing is deleted and each run reports what it would delete (a disabled policy is previewed as if enabled). Answers 409 when no policy has been saved, and, without `dryRun`, when the saved policy is disabled. Requires an admin Bearer token and a same-origin request in browsers.\n\nRole needed: `admin`.",
|
|
1375
|
+
"x-atlas-role": "admin",
|
|
1376
|
+
"security": [
|
|
1377
|
+
{
|
|
1378
|
+
"bearer": []
|
|
1379
|
+
}
|
|
1380
|
+
],
|
|
1381
|
+
"parameters": [
|
|
1382
|
+
{
|
|
1383
|
+
"required": false,
|
|
1384
|
+
"name": "dryRun",
|
|
1385
|
+
"in": "query",
|
|
1386
|
+
"description": "`1` or `true` to only count what would be deleted.",
|
|
1387
|
+
"schema": {
|
|
1388
|
+
"type": "string"
|
|
1389
|
+
}
|
|
1390
|
+
}
|
|
1391
|
+
],
|
|
1392
|
+
"responses": {
|
|
1393
|
+
"200": {
|
|
1394
|
+
"description": "One run per project.",
|
|
1395
|
+
"content": {
|
|
1396
|
+
"application/json": {
|
|
1397
|
+
"schema": {
|
|
1398
|
+
"$ref": "#/components/schemas/GcRunResult"
|
|
1399
|
+
}
|
|
1400
|
+
}
|
|
1401
|
+
}
|
|
1402
|
+
},
|
|
1403
|
+
"401": {
|
|
1404
|
+
"description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
|
|
1405
|
+
"content": {
|
|
1406
|
+
"application/problem+json": {
|
|
1407
|
+
"schema": {
|
|
1408
|
+
"$ref": "#/components/schemas/Problem"
|
|
1409
|
+
}
|
|
1410
|
+
}
|
|
1411
|
+
}
|
|
1412
|
+
},
|
|
1413
|
+
"403": {
|
|
1414
|
+
"description": "The token is known but its role may not do this.",
|
|
1415
|
+
"content": {
|
|
1416
|
+
"application/problem+json": {
|
|
1417
|
+
"schema": {
|
|
1418
|
+
"$ref": "#/components/schemas/Problem"
|
|
1419
|
+
}
|
|
1420
|
+
}
|
|
1421
|
+
}
|
|
1422
|
+
},
|
|
1423
|
+
"409": {
|
|
1424
|
+
"description": "No policy has been saved, or it is disabled.",
|
|
1425
|
+
"content": {
|
|
1426
|
+
"application/problem+json": {
|
|
1427
|
+
"schema": {
|
|
1428
|
+
"$ref": "#/components/schemas/Problem"
|
|
1429
|
+
}
|
|
1430
|
+
}
|
|
1431
|
+
}
|
|
1432
|
+
}
|
|
1433
|
+
}
|
|
1434
|
+
}
|
|
1435
|
+
},
|
|
1191
1436
|
"/healthz": {
|
|
1192
1437
|
"get": {
|
|
1193
1438
|
"operationId": "getHealth",
|
|
@@ -7032,47 +7277,6 @@
|
|
|
7032
7277
|
"ServerEditableSettings": {
|
|
7033
7278
|
"type": "object",
|
|
7034
7279
|
"properties": {
|
|
7035
|
-
"data": {
|
|
7036
|
-
"default": "./atlas-data",
|
|
7037
|
-
"description": "The folder that is the default backend and the default write target: layers, specs and runs live here",
|
|
7038
|
-
"type": "string"
|
|
7039
|
-
},
|
|
7040
|
-
"backends": {
|
|
7041
|
-
"default": [],
|
|
7042
|
-
"description": "Further backends, read together with the data folder: S3, another server, a device lab",
|
|
7043
|
-
"type": "array",
|
|
7044
|
-
"items": {
|
|
7045
|
-
"type": "object",
|
|
7046
|
-
"properties": {
|
|
7047
|
-
"id": {
|
|
7048
|
-
"type": "string",
|
|
7049
|
-
"pattern": "^[a-z0-9-]+$",
|
|
7050
|
-
"description": "Lowercase letters, digits and hyphens. Names where a result came from"
|
|
7051
|
-
},
|
|
7052
|
-
"label": {
|
|
7053
|
-
"type": "string"
|
|
7054
|
-
},
|
|
7055
|
-
"url": {
|
|
7056
|
-
"type": "string",
|
|
7057
|
-
"minLength": 1,
|
|
7058
|
-
"description": "A folder, s3://bucket/prefix, r2://, gs://, or another Atlas server (https://…)"
|
|
7059
|
-
},
|
|
7060
|
-
"write": {
|
|
7061
|
-
"description": "Uploads go here instead of the data folder. At most one backend is the write target",
|
|
7062
|
-
"type": "boolean"
|
|
7063
|
-
}
|
|
7064
|
-
},
|
|
7065
|
-
"required": [
|
|
7066
|
-
"id",
|
|
7067
|
-
"url"
|
|
7068
|
-
],
|
|
7069
|
-
"additionalProperties": false
|
|
7070
|
-
}
|
|
7071
|
-
},
|
|
7072
|
-
"write": {
|
|
7073
|
-
"description": "The id of the backend uploads go to. Default: the data folder",
|
|
7074
|
-
"type": "string"
|
|
7075
|
-
},
|
|
7076
7280
|
"outlineBranch": {
|
|
7077
7281
|
"description": "Which branch's specs the report is laid over. Default main, then master, then the newest",
|
|
7078
7282
|
"type": "string"
|
|
@@ -7169,47 +7373,6 @@
|
|
|
7169
7373
|
"settings": {
|
|
7170
7374
|
"type": "object",
|
|
7171
7375
|
"properties": {
|
|
7172
|
-
"data": {
|
|
7173
|
-
"default": "./atlas-data",
|
|
7174
|
-
"description": "The folder that is the default backend and the default write target: layers, specs and runs live here",
|
|
7175
|
-
"type": "string"
|
|
7176
|
-
},
|
|
7177
|
-
"backends": {
|
|
7178
|
-
"default": [],
|
|
7179
|
-
"description": "Further backends, read together with the data folder: S3, another server, a device lab",
|
|
7180
|
-
"type": "array",
|
|
7181
|
-
"items": {
|
|
7182
|
-
"type": "object",
|
|
7183
|
-
"properties": {
|
|
7184
|
-
"id": {
|
|
7185
|
-
"type": "string",
|
|
7186
|
-
"pattern": "^[a-z0-9-]+$",
|
|
7187
|
-
"description": "Lowercase letters, digits and hyphens. Names where a result came from"
|
|
7188
|
-
},
|
|
7189
|
-
"label": {
|
|
7190
|
-
"type": "string"
|
|
7191
|
-
},
|
|
7192
|
-
"url": {
|
|
7193
|
-
"type": "string",
|
|
7194
|
-
"minLength": 1,
|
|
7195
|
-
"description": "A folder, s3://bucket/prefix, r2://, gs://, or another Atlas server (https://…)"
|
|
7196
|
-
},
|
|
7197
|
-
"write": {
|
|
7198
|
-
"description": "Uploads go here instead of the data folder. At most one backend is the write target",
|
|
7199
|
-
"type": "boolean"
|
|
7200
|
-
}
|
|
7201
|
-
},
|
|
7202
|
-
"required": [
|
|
7203
|
-
"id",
|
|
7204
|
-
"url"
|
|
7205
|
-
],
|
|
7206
|
-
"additionalProperties": false
|
|
7207
|
-
}
|
|
7208
|
-
},
|
|
7209
|
-
"write": {
|
|
7210
|
-
"description": "The id of the backend uploads go to. Default: the data folder",
|
|
7211
|
-
"type": "string"
|
|
7212
|
-
},
|
|
7213
7376
|
"outlineBranch": {
|
|
7214
7377
|
"description": "Which branch's specs the report is laid over. Default main, then master, then the newest",
|
|
7215
7378
|
"type": "string"
|
|
@@ -7304,47 +7467,6 @@
|
|
|
7304
7467
|
"active": {
|
|
7305
7468
|
"type": "object",
|
|
7306
7469
|
"properties": {
|
|
7307
|
-
"data": {
|
|
7308
|
-
"default": "./atlas-data",
|
|
7309
|
-
"description": "The folder that is the default backend and the default write target: layers, specs and runs live here",
|
|
7310
|
-
"type": "string"
|
|
7311
|
-
},
|
|
7312
|
-
"backends": {
|
|
7313
|
-
"default": [],
|
|
7314
|
-
"description": "Further backends, read together with the data folder: S3, another server, a device lab",
|
|
7315
|
-
"type": "array",
|
|
7316
|
-
"items": {
|
|
7317
|
-
"type": "object",
|
|
7318
|
-
"properties": {
|
|
7319
|
-
"id": {
|
|
7320
|
-
"type": "string",
|
|
7321
|
-
"pattern": "^[a-z0-9-]+$",
|
|
7322
|
-
"description": "Lowercase letters, digits and hyphens. Names where a result came from"
|
|
7323
|
-
},
|
|
7324
|
-
"label": {
|
|
7325
|
-
"type": "string"
|
|
7326
|
-
},
|
|
7327
|
-
"url": {
|
|
7328
|
-
"type": "string",
|
|
7329
|
-
"minLength": 1,
|
|
7330
|
-
"description": "A folder, s3://bucket/prefix, r2://, gs://, or another Atlas server (https://…)"
|
|
7331
|
-
},
|
|
7332
|
-
"write": {
|
|
7333
|
-
"description": "Uploads go here instead of the data folder. At most one backend is the write target",
|
|
7334
|
-
"type": "boolean"
|
|
7335
|
-
}
|
|
7336
|
-
},
|
|
7337
|
-
"required": [
|
|
7338
|
-
"id",
|
|
7339
|
-
"url"
|
|
7340
|
-
],
|
|
7341
|
-
"additionalProperties": false
|
|
7342
|
-
}
|
|
7343
|
-
},
|
|
7344
|
-
"write": {
|
|
7345
|
-
"description": "The id of the backend uploads go to. Default: the data folder",
|
|
7346
|
-
"type": "string"
|
|
7347
|
-
},
|
|
7348
7470
|
"outlineBranch": {
|
|
7349
7471
|
"description": "Which branch's specs the report is laid over. Default main, then master, then the newest",
|
|
7350
7472
|
"type": "string"
|
|
@@ -7452,6 +7574,268 @@
|
|
|
7452
7574
|
],
|
|
7453
7575
|
"additionalProperties": {}
|
|
7454
7576
|
},
|
|
7577
|
+
"GcPolicy": {
|
|
7578
|
+
"type": "object",
|
|
7579
|
+
"properties": {
|
|
7580
|
+
"enabled": {
|
|
7581
|
+
"type": "boolean",
|
|
7582
|
+
"description": "Delete eligible layers on a schedule. `false` keeps the policy but deletes nothing"
|
|
7583
|
+
},
|
|
7584
|
+
"maxAgeDays": {
|
|
7585
|
+
"type": "integer",
|
|
7586
|
+
"minimum": 1,
|
|
7587
|
+
"maximum": 3650,
|
|
7588
|
+
"description": "A superseded layer is eligible once it was recorded more than this many days ago"
|
|
7589
|
+
},
|
|
7590
|
+
"keepLatest": {
|
|
7591
|
+
"default": 20,
|
|
7592
|
+
"description": "Always keep this many of the newest layers, however old, so recent history stays",
|
|
7593
|
+
"type": "integer",
|
|
7594
|
+
"minimum": 0,
|
|
7595
|
+
"maximum": 1000000
|
|
7596
|
+
},
|
|
7597
|
+
"intervalHours": {
|
|
7598
|
+
"default": 24,
|
|
7599
|
+
"description": "How often the server applies the policy",
|
|
7600
|
+
"type": "number",
|
|
7601
|
+
"minimum": 1,
|
|
7602
|
+
"maximum": 720
|
|
7603
|
+
}
|
|
7604
|
+
},
|
|
7605
|
+
"required": [
|
|
7606
|
+
"enabled",
|
|
7607
|
+
"maxAgeDays"
|
|
7608
|
+
],
|
|
7609
|
+
"additionalProperties": false
|
|
7610
|
+
},
|
|
7611
|
+
"GcSnapshot": {
|
|
7612
|
+
"type": "object",
|
|
7613
|
+
"properties": {
|
|
7614
|
+
"revision": {
|
|
7615
|
+
"type": "string",
|
|
7616
|
+
"pattern": "^[a-f0-9]{64}$"
|
|
7617
|
+
},
|
|
7618
|
+
"policy": {
|
|
7619
|
+
"anyOf": [
|
|
7620
|
+
{
|
|
7621
|
+
"type": "object",
|
|
7622
|
+
"properties": {
|
|
7623
|
+
"enabled": {
|
|
7624
|
+
"type": "boolean",
|
|
7625
|
+
"description": "Delete eligible layers on a schedule. `false` keeps the policy but deletes nothing"
|
|
7626
|
+
},
|
|
7627
|
+
"maxAgeDays": {
|
|
7628
|
+
"type": "integer",
|
|
7629
|
+
"minimum": 1,
|
|
7630
|
+
"maximum": 3650,
|
|
7631
|
+
"description": "A superseded layer is eligible once it was recorded more than this many days ago"
|
|
7632
|
+
},
|
|
7633
|
+
"keepLatest": {
|
|
7634
|
+
"default": 20,
|
|
7635
|
+
"description": "Always keep this many of the newest layers, however old, so recent history stays",
|
|
7636
|
+
"type": "integer",
|
|
7637
|
+
"minimum": 0,
|
|
7638
|
+
"maximum": 1000000
|
|
7639
|
+
},
|
|
7640
|
+
"intervalHours": {
|
|
7641
|
+
"default": 24,
|
|
7642
|
+
"description": "How often the server applies the policy",
|
|
7643
|
+
"type": "number",
|
|
7644
|
+
"minimum": 1,
|
|
7645
|
+
"maximum": 720
|
|
7646
|
+
}
|
|
7647
|
+
},
|
|
7648
|
+
"required": [
|
|
7649
|
+
"enabled",
|
|
7650
|
+
"maxAgeDays",
|
|
7651
|
+
"keepLatest",
|
|
7652
|
+
"intervalHours"
|
|
7653
|
+
],
|
|
7654
|
+
"additionalProperties": false
|
|
7655
|
+
},
|
|
7656
|
+
{
|
|
7657
|
+
"type": "null"
|
|
7658
|
+
}
|
|
7659
|
+
]
|
|
7660
|
+
},
|
|
7661
|
+
"saved": {
|
|
7662
|
+
"type": "boolean",
|
|
7663
|
+
"description": "Whether a policy exists in S3. `false` means garbage collection is off: nothing is deleted"
|
|
7664
|
+
},
|
|
7665
|
+
"lastRuns": {
|
|
7666
|
+
"type": "array",
|
|
7667
|
+
"items": {
|
|
7668
|
+
"type": "object",
|
|
7669
|
+
"properties": {
|
|
7670
|
+
"project": {
|
|
7671
|
+
"type": "string"
|
|
7672
|
+
},
|
|
7673
|
+
"dryRun": {
|
|
7674
|
+
"type": "boolean"
|
|
7675
|
+
},
|
|
7676
|
+
"at": {
|
|
7677
|
+
"type": "string",
|
|
7678
|
+
"description": "When the pass finished, ISO 8601"
|
|
7679
|
+
},
|
|
7680
|
+
"candidates": {
|
|
7681
|
+
"type": "integer",
|
|
7682
|
+
"minimum": 0,
|
|
7683
|
+
"maximum": 9007199254740991,
|
|
7684
|
+
"description": "Layers the policy would delete"
|
|
7685
|
+
},
|
|
7686
|
+
"deletedLayers": {
|
|
7687
|
+
"type": "integer",
|
|
7688
|
+
"minimum": 0,
|
|
7689
|
+
"maximum": 9007199254740991
|
|
7690
|
+
},
|
|
7691
|
+
"deletedBlobs": {
|
|
7692
|
+
"type": "integer",
|
|
7693
|
+
"minimum": 0,
|
|
7694
|
+
"maximum": 9007199254740991
|
|
7695
|
+
},
|
|
7696
|
+
"keptLayers": {
|
|
7697
|
+
"type": "integer",
|
|
7698
|
+
"minimum": 0,
|
|
7699
|
+
"maximum": 9007199254740991
|
|
7700
|
+
},
|
|
7701
|
+
"error": {
|
|
7702
|
+
"description": "Why the pass stopped early, when it did",
|
|
7703
|
+
"type": "string"
|
|
7704
|
+
}
|
|
7705
|
+
},
|
|
7706
|
+
"required": [
|
|
7707
|
+
"project",
|
|
7708
|
+
"dryRun",
|
|
7709
|
+
"at",
|
|
7710
|
+
"candidates",
|
|
7711
|
+
"deletedLayers",
|
|
7712
|
+
"deletedBlobs",
|
|
7713
|
+
"keptLayers"
|
|
7714
|
+
],
|
|
7715
|
+
"additionalProperties": {}
|
|
7716
|
+
},
|
|
7717
|
+
"description": "The most recent pass over each project, newest first; empty before the first pass"
|
|
7718
|
+
},
|
|
7719
|
+
"stateKey": {
|
|
7720
|
+
"type": "string",
|
|
7721
|
+
"description": "Where the user state lives in the bucket, relative to the configured prefix"
|
|
7722
|
+
}
|
|
7723
|
+
},
|
|
7724
|
+
"required": [
|
|
7725
|
+
"revision",
|
|
7726
|
+
"policy",
|
|
7727
|
+
"saved",
|
|
7728
|
+
"lastRuns",
|
|
7729
|
+
"stateKey"
|
|
7730
|
+
],
|
|
7731
|
+
"additionalProperties": {}
|
|
7732
|
+
},
|
|
7733
|
+
"GcRunResult": {
|
|
7734
|
+
"type": "object",
|
|
7735
|
+
"properties": {
|
|
7736
|
+
"runs": {
|
|
7737
|
+
"type": "array",
|
|
7738
|
+
"items": {
|
|
7739
|
+
"type": "object",
|
|
7740
|
+
"properties": {
|
|
7741
|
+
"project": {
|
|
7742
|
+
"type": "string"
|
|
7743
|
+
},
|
|
7744
|
+
"dryRun": {
|
|
7745
|
+
"type": "boolean"
|
|
7746
|
+
},
|
|
7747
|
+
"at": {
|
|
7748
|
+
"type": "string",
|
|
7749
|
+
"description": "When the pass finished, ISO 8601"
|
|
7750
|
+
},
|
|
7751
|
+
"candidates": {
|
|
7752
|
+
"type": "integer",
|
|
7753
|
+
"minimum": 0,
|
|
7754
|
+
"maximum": 9007199254740991,
|
|
7755
|
+
"description": "Layers the policy would delete"
|
|
7756
|
+
},
|
|
7757
|
+
"deletedLayers": {
|
|
7758
|
+
"type": "integer",
|
|
7759
|
+
"minimum": 0,
|
|
7760
|
+
"maximum": 9007199254740991
|
|
7761
|
+
},
|
|
7762
|
+
"deletedBlobs": {
|
|
7763
|
+
"type": "integer",
|
|
7764
|
+
"minimum": 0,
|
|
7765
|
+
"maximum": 9007199254740991
|
|
7766
|
+
},
|
|
7767
|
+
"keptLayers": {
|
|
7768
|
+
"type": "integer",
|
|
7769
|
+
"minimum": 0,
|
|
7770
|
+
"maximum": 9007199254740991
|
|
7771
|
+
},
|
|
7772
|
+
"error": {
|
|
7773
|
+
"description": "Why the pass stopped early, when it did",
|
|
7774
|
+
"type": "string"
|
|
7775
|
+
}
|
|
7776
|
+
},
|
|
7777
|
+
"required": [
|
|
7778
|
+
"project",
|
|
7779
|
+
"dryRun",
|
|
7780
|
+
"at",
|
|
7781
|
+
"candidates",
|
|
7782
|
+
"deletedLayers",
|
|
7783
|
+
"deletedBlobs",
|
|
7784
|
+
"keptLayers"
|
|
7785
|
+
],
|
|
7786
|
+
"additionalProperties": {}
|
|
7787
|
+
}
|
|
7788
|
+
},
|
|
7789
|
+
"policy": {
|
|
7790
|
+
"anyOf": [
|
|
7791
|
+
{
|
|
7792
|
+
"type": "object",
|
|
7793
|
+
"properties": {
|
|
7794
|
+
"enabled": {
|
|
7795
|
+
"type": "boolean",
|
|
7796
|
+
"description": "Delete eligible layers on a schedule. `false` keeps the policy but deletes nothing"
|
|
7797
|
+
},
|
|
7798
|
+
"maxAgeDays": {
|
|
7799
|
+
"type": "integer",
|
|
7800
|
+
"minimum": 1,
|
|
7801
|
+
"maximum": 3650,
|
|
7802
|
+
"description": "A superseded layer is eligible once it was recorded more than this many days ago"
|
|
7803
|
+
},
|
|
7804
|
+
"keepLatest": {
|
|
7805
|
+
"default": 20,
|
|
7806
|
+
"description": "Always keep this many of the newest layers, however old, so recent history stays",
|
|
7807
|
+
"type": "integer",
|
|
7808
|
+
"minimum": 0,
|
|
7809
|
+
"maximum": 1000000
|
|
7810
|
+
},
|
|
7811
|
+
"intervalHours": {
|
|
7812
|
+
"default": 24,
|
|
7813
|
+
"description": "How often the server applies the policy",
|
|
7814
|
+
"type": "number",
|
|
7815
|
+
"minimum": 1,
|
|
7816
|
+
"maximum": 720
|
|
7817
|
+
}
|
|
7818
|
+
},
|
|
7819
|
+
"required": [
|
|
7820
|
+
"enabled",
|
|
7821
|
+
"maxAgeDays",
|
|
7822
|
+
"keepLatest",
|
|
7823
|
+
"intervalHours"
|
|
7824
|
+
],
|
|
7825
|
+
"additionalProperties": false
|
|
7826
|
+
},
|
|
7827
|
+
{
|
|
7828
|
+
"type": "null"
|
|
7829
|
+
}
|
|
7830
|
+
]
|
|
7831
|
+
}
|
|
7832
|
+
},
|
|
7833
|
+
"required": [
|
|
7834
|
+
"runs",
|
|
7835
|
+
"policy"
|
|
7836
|
+
],
|
|
7837
|
+
"additionalProperties": {}
|
|
7838
|
+
},
|
|
7455
7839
|
"Problem": {
|
|
7456
7840
|
"type": "object",
|
|
7457
7841
|
"properties": {
|