@epilot/cli 0.1.70 → 0.1.72

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/README.md CHANGED
@@ -29,7 +29,7 @@ npm install -g @epilot/cli
29
29
 
30
30
  <!-- usage-help -->
31
31
  ```
32
- epilot v0.1.70 — CLI for epilot APIs
32
+ epilot v0.1.72 — CLI for epilot APIs
33
33
 
34
34
  USAGE
35
35
  epilot <api> <operationId> [params...] [flags]
@@ -904,6 +904,7 @@
904
904
  "/v2/blueprint-manifest/blueprint:install": {
905
905
  "post": {
906
906
  "operationId": "installBlueprint",
907
+ "deprecated": true,
907
908
  "summary": "installBlueprint",
908
909
  "description": "Kick off a new blueprint installation job. Returns 202 Accepted with Location header pointing to the job resource\n",
909
910
  "tags": [
@@ -1107,6 +1108,7 @@
1107
1108
  "/v2/blueprint-manifest/blueprints/{blueprint_id}/validate": {
1108
1109
  "post": {
1109
1110
  "operationId": "validateBlueprint",
1111
+ "deprecated": true,
1110
1112
  "summary": "validateBlueprint",
1111
1113
  "description": "Start a blueprint validation job. Validates Terraform for the blueprint (all types).\nReturns 202 Accepted with job_id. Poll GET /jobs/{job_id} for status, valid, and errors.\n",
1112
1114
  "tags": [
@@ -1204,6 +1206,18 @@
1204
1206
  "destination_auth_token": {
1205
1207
  "type": "string",
1206
1208
  "description": "Auth token with access to the destination org. Required for cross-org verification when the caller token only has access to the source org. If not provided, the caller's bearer token is used for both orgs."
1209
+ },
1210
+ "installation_job_id": {
1211
+ "$ref": "#/components/schemas/BlueprintJobID",
1212
+ "description": "Optional install job this verification is checking. If omitted, the latest destination blueprint installation job is used when available."
1213
+ },
1214
+ "sync_engine": {
1215
+ "type": "string",
1216
+ "enum": [
1217
+ "terraform",
1218
+ "v3"
1219
+ ],
1220
+ "description": "Optional install engine hint. Usually inferred from installation_job_id."
1207
1221
  }
1208
1222
  }
1209
1223
  }
@@ -1243,6 +1257,7 @@
1243
1257
  "/v2/blueprint-manifest/blueprints/{blueprint_id}/patches:detect": {
1244
1258
  "post": {
1245
1259
  "operationId": "detectPatchChanges",
1260
+ "deprecated": true,
1246
1261
  "summary": "detectPatchChanges",
1247
1262
  "description": "Detect changes between the current state of a blueprint's resources and its tfstate baseline.\nReturns field-level diffs for resources that have been modified since the blueprint was last installed/exported.\n",
1248
1263
  "tags": [
@@ -1302,6 +1317,7 @@
1302
1317
  "/v2/blueprint-manifest/blueprints/{blueprint_id}/patches": {
1303
1318
  "post": {
1304
1319
  "operationId": "createPatch",
1320
+ "deprecated": true,
1305
1321
  "summary": "createPatch",
1306
1322
  "description": "Create a new patch for a blueprint.",
1307
1323
  "tags": [
@@ -1375,6 +1391,7 @@
1375
1391
  },
1376
1392
  "get": {
1377
1393
  "operationId": "listPatches",
1394
+ "deprecated": true,
1378
1395
  "summary": "listPatches",
1379
1396
  "description": "List all patches for a blueprint.",
1380
1397
  "tags": [
@@ -1418,6 +1435,7 @@
1418
1435
  "/v2/blueprint-manifest/blueprints/{blueprint_id}/patches/{patch_id}": {
1419
1436
  "get": {
1420
1437
  "operationId": "getPatch",
1438
+ "deprecated": true,
1421
1439
  "summary": "getPatch",
1422
1440
  "description": "Get a patch by ID, including per-org execution results.",
1423
1441
  "tags": [
@@ -1461,6 +1479,7 @@
1461
1479
  "/v2/blueprint-manifest/blueprints/{blueprint_id}/patches/{patch_id}:apply": {
1462
1480
  "post": {
1463
1481
  "operationId": "applyPatch",
1482
+ "deprecated": true,
1464
1483
  "summary": "applyPatch",
1465
1484
  "description": "Apply a patch to a single destination org.",
1466
1485
  "tags": [
@@ -1534,6 +1553,7 @@
1534
1553
  "/v2/blueprint-manifest/blueprints/{blueprint_id}/patches/{patch_id}/orgs/{org_id}:retry": {
1535
1554
  "post": {
1536
1555
  "operationId": "retryPatchOrg",
1556
+ "deprecated": true,
1537
1557
  "summary": "retryPatchOrg",
1538
1558
  "description": "Retry a failed patch execution for a specific org.",
1539
1559
  "tags": [
@@ -1602,6 +1622,7 @@
1602
1622
  "/v2/blueprint-manifest/blueprints/{blueprint_id}:export": {
1603
1623
  "post": {
1604
1624
  "operationId": "exportBlueprint",
1625
+ "deprecated": true,
1605
1626
  "summary": "exportBlueprint",
1606
1627
  "description": "Kick off a new blueprint export job. Returns 202 Accepted with Location header pointing to the job resource.\n",
1607
1628
  "tags": [
@@ -1949,6 +1970,21 @@
1949
1970
  "schema": {
1950
1971
  "$ref": "#/components/schemas/BlueprintID"
1951
1972
  }
1973
+ },
1974
+ {
1975
+ "in": "query",
1976
+ "required": false,
1977
+ "name": "trigger",
1978
+ "description": "What initiated the sync. Automated triggers (`pre_sync`,\n`post_revert`) are side effects of an operation the activity\nfeed already shows on its own row, so they are excluded from\nthe audit log — same policy as validate/verify.\n",
1979
+ "schema": {
1980
+ "type": "string",
1981
+ "enum": [
1982
+ "manual",
1983
+ "pre_sync",
1984
+ "post_revert"
1985
+ ],
1986
+ "default": "manual"
1987
+ }
1952
1988
  }
1953
1989
  ],
1954
1990
  "responses": {
@@ -2280,7 +2316,7 @@
2280
2316
  "get": {
2281
2317
  "operationId": "getBlueprintJob",
2282
2318
  "summary": "Get Job",
2283
- "description": "Poll current state of a job.",
2319
+ "description": "Poll the current state of a job. Serves both Terraform (v2) and V3-engine jobs —\ncheck `sync_engine` (`terraform` | `v3`) to tell them apart. V3 jobs additionally\nexpose live `resource_progress[]`. V3 single-install and bulk-install child jobs\nare polled here.\n",
2284
2320
  "tags": [
2285
2321
  "Jobs"
2286
2322
  ],
@@ -2312,7 +2348,7 @@
2312
2348
  "post": {
2313
2349
  "operationId": "continueInstallationJob",
2314
2350
  "summary": "Continue Installation Job",
2315
- "description": "Continue an installation job if it is waiting for user action.",
2351
+ "description": "Resume an installation job that is paused at `status: \"WAITING_USER_ACTION\"` after\nplanning. Works for both Terraform and V3 jobs. Not needed for V3 installs created\nwith `auto_apply: true` (including all bulk-install child jobs), which apply\nwithout pausing.\n",
2316
2352
  "tags": [
2317
2353
  "Jobs"
2318
2354
  ],
@@ -2861,11 +2897,58 @@
2861
2897
  }
2862
2898
  }
2863
2899
  },
2900
+ "/v3/blueprint-manifest/blueprints/{blueprint_id}:publish": {
2901
+ "post": {
2902
+ "operationId": "publishBlueprintV3",
2903
+ "summary": "Publish Blueprint V3",
2904
+ "description": "Starts an asynchronous V3 publication. The result is a signed, portable package; poll the existing blueprint job endpoint for completion.",
2905
+ "tags": [
2906
+ "Blueprints"
2907
+ ],
2908
+ "parameters": [
2909
+ {
2910
+ "in": "path",
2911
+ "required": true,
2912
+ "name": "blueprint_id",
2913
+ "schema": {
2914
+ "$ref": "#/components/schemas/BlueprintID"
2915
+ }
2916
+ }
2917
+ ],
2918
+ "responses": {
2919
+ "202": {
2920
+ "description": "Blueprint export job started",
2921
+ "headers": {
2922
+ "Location": {
2923
+ "schema": {
2924
+ "type": "string"
2925
+ }
2926
+ }
2927
+ },
2928
+ "content": {
2929
+ "application/json": {
2930
+ "schema": {
2931
+ "type": "object",
2932
+ "required": [
2933
+ "job_id"
2934
+ ],
2935
+ "properties": {
2936
+ "job_id": {
2937
+ "$ref": "#/components/schemas/BlueprintJobID"
2938
+ }
2939
+ }
2940
+ }
2941
+ }
2942
+ }
2943
+ }
2944
+ }
2945
+ }
2946
+ },
2864
2947
  "/v3/blueprint-manifest/blueprint:install": {
2865
2948
  "post": {
2866
2949
  "operationId": "installBlueprintV3",
2867
2950
  "summary": "Install Blueprint V3",
2868
- "description": "Install a blueprint using the V3 engine (direct API calls, no Terraform).\nCreates resources in topological order with global ID replacement.\nSupports checkpoint-based resume on failure.\n",
2951
+ "description": "Install a blueprint into a single destination org using the V3 engine (direct API\ncalls, no Terraform). Creates resources in topological order with global ID\nreplacement and supports checkpoint-based resume on failure.\n\n**Lifecycle (how to drive an install to completion):**\n1. `POST /v3/blueprint-manifest/blueprint:install` returns `{ job_id }` (202).\n2. Poll the job with `GET /v2/blueprint-manifest/jobs/{job_id}` — V3 jobs are\n served by the same v2 jobs endpoints as Terraform jobs and are identified by\n `sync_engine: \"v3\"`. Watch `status` and `resource_progress[]`.\n3. If `auto_apply` is `false` (default), the job pauses at\n `status: \"WAITING_USER_ACTION\"` after planning. Resume it with\n `POST /v2/blueprint-manifest/jobs/{job_id}:continue`.\n4. If `auto_apply` is `true`, the engine applies automatically after plan +\n snapshot — no `:continue` call is needed. This is what the bulk-install worker\n uses; to install into many orgs at once prefer `POST .../bulk-installs`.\n\nFor cross-org installs, pass `destination_auth_token` (the destination org's\ntoken); reads use the caller's bearer token, writes use that token.\n",
2869
2952
  "tags": [
2870
2953
  "Blueprints"
2871
2954
  ],
@@ -2917,6 +3000,29 @@
2917
3000
  "slug": {
2918
3001
  "type": "string",
2919
3002
  "description": "Slug for marketplace blueprint consistency"
3003
+ },
3004
+ "auto_apply": {
3005
+ "type": "boolean",
3006
+ "description": "When `true`, the install skips the manual plan-approval step and applies\nstraight after plan + snapshot succeed (no `:continue` call needed).\nDefaults to `false`. Used internally by the bulk-install worker.\n",
3007
+ "default": false
3008
+ }
3009
+ }
3010
+ },
3011
+ "examples": {
3012
+ "sameOrgPlanThenContinue": {
3013
+ "summary": "Same-org install, manual approval (default)",
3014
+ "value": {
3015
+ "source_blueprint_id": "11111111-1111-1111-1111-111111111111"
3016
+ }
3017
+ },
3018
+ "crossOrgAutoApply": {
3019
+ "summary": "Cross-org install, applied automatically",
3020
+ "value": {
3021
+ "source_org_id": "source-org-id",
3022
+ "source_blueprint_id": "11111111-1111-1111-1111-111111111111",
3023
+ "destination_org_id": "dest-org-id",
3024
+ "destination_auth_token": "destination-org-token",
3025
+ "auto_apply": true
2920
3026
  }
2921
3027
  }
2922
3028
  }
@@ -2928,7 +3034,7 @@
2928
3034
  "description": "V3 install job started",
2929
3035
  "headers": {
2930
3036
  "Location": {
2931
- "description": "URL to poll the job",
3037
+ "description": "Path to poll the resulting job: GET /v2/blueprint-manifest/jobs/{job_id}",
2932
3038
  "schema": {
2933
3039
  "type": "string"
2934
3040
  }
@@ -3123,6 +3229,244 @@
3123
3229
  }
3124
3230
  }
3125
3231
  },
3232
+ "/v3/blueprint-manifest/bulk-installs": {
3233
+ "post": {
3234
+ "operationId": "createBulkInstallV3",
3235
+ "summary": "Create Bulk Install V3",
3236
+ "description": "Install one source blueprint into many destination organizations in a single\nrequest. The server schedules child V3 installs with `auto_apply=true` and caps\nactive installs at `max_concurrency`. Per-target failures are isolated and\nretryable; they do not stop the remaining targets.\n\nEach target carries its own write-only `destination_auth_token` (org-scoped).\nTokens are passed to the worker via Step Functions input only — they are never\npersisted in DynamoDB nor returned by any endpoint.\n",
3237
+ "tags": [
3238
+ "Blueprints"
3239
+ ],
3240
+ "requestBody": {
3241
+ "required": true,
3242
+ "content": {
3243
+ "application/json": {
3244
+ "schema": {
3245
+ "$ref": "#/components/schemas/BulkInstallCreateRequest"
3246
+ },
3247
+ "examples": {
3248
+ "twoTargets": {
3249
+ "summary": "Install one blueprint into two orgs",
3250
+ "value": {
3251
+ "source_org_id": "source-org-id",
3252
+ "source_blueprint_id": "11111111-1111-1111-1111-111111111111",
3253
+ "max_concurrency": 2,
3254
+ "options": {
3255
+ "resources_to_ignore": [
3256
+ "epilot-product_product.foo"
3257
+ ]
3258
+ },
3259
+ "targets": [
3260
+ {
3261
+ "destination_org_id": "dest-org-1",
3262
+ "destination_auth_token": "token-for-org-1"
3263
+ },
3264
+ {
3265
+ "destination_org_id": "dest-org-2",
3266
+ "destination_blueprint_id": "22222222-2222-2222-2222-222222222222",
3267
+ "destination_auth_token": "token-for-org-2"
3268
+ }
3269
+ ]
3270
+ }
3271
+ }
3272
+ }
3273
+ }
3274
+ }
3275
+ },
3276
+ "responses": {
3277
+ "202": {
3278
+ "description": "Bulk install accepted and scheduled",
3279
+ "headers": {
3280
+ "Location": {
3281
+ "description": "URL to poll the bulk install",
3282
+ "schema": {
3283
+ "type": "string"
3284
+ }
3285
+ }
3286
+ },
3287
+ "content": {
3288
+ "application/json": {
3289
+ "schema": {
3290
+ "$ref": "#/components/schemas/BulkInstall"
3291
+ }
3292
+ }
3293
+ }
3294
+ },
3295
+ "400": {
3296
+ "description": "Validation error — missing `source_blueprint_id`, empty/oversized `targets`\n(1–100), duplicate `destination_org_id`, missing per-target\n`destination_auth_token`, or `max_concurrency` out of range (1–5).\n",
3297
+ "content": {
3298
+ "application/json": {
3299
+ "schema": {
3300
+ "type": "object",
3301
+ "properties": {
3302
+ "message": {
3303
+ "type": "string"
3304
+ }
3305
+ }
3306
+ }
3307
+ }
3308
+ }
3309
+ }
3310
+ }
3311
+ }
3312
+ },
3313
+ "/v3/blueprint-manifest/bulk-installs/{bulk_job_id}": {
3314
+ "get": {
3315
+ "operationId": "getBulkInstallV3",
3316
+ "summary": "Get Bulk Install V3",
3317
+ "description": "Returns the bulk install parent with aggregate status and counts. Scoped by the\ncaller org as `source_org_id`. Target rows are not included — use the targets\nendpoint to page through them.\n",
3318
+ "tags": [
3319
+ "Blueprints"
3320
+ ],
3321
+ "parameters": [
3322
+ {
3323
+ "in": "path",
3324
+ "name": "bulk_job_id",
3325
+ "required": true,
3326
+ "schema": {
3327
+ "type": "string"
3328
+ }
3329
+ }
3330
+ ],
3331
+ "responses": {
3332
+ "200": {
3333
+ "description": "Bulk install parent",
3334
+ "content": {
3335
+ "application/json": {
3336
+ "schema": {
3337
+ "$ref": "#/components/schemas/BulkInstall"
3338
+ }
3339
+ }
3340
+ }
3341
+ },
3342
+ "404": {
3343
+ "description": "Bulk install not found for the caller org"
3344
+ }
3345
+ }
3346
+ }
3347
+ },
3348
+ "/v3/blueprint-manifest/bulk-installs/{bulk_job_id}/targets": {
3349
+ "get": {
3350
+ "operationId": "listBulkInstallTargetsV3",
3351
+ "summary": "List Bulk Install Targets V3",
3352
+ "description": "Pages through the bulk install's target rows. Each row hydrates its latest child\ninstall job (`job_ids.at(-1)`) with the standard V3 job shape (`events[]`,\n`resource_progress[]`) so callers can inspect per-resource progress and errors.\n",
3353
+ "tags": [
3354
+ "Blueprints"
3355
+ ],
3356
+ "parameters": [
3357
+ {
3358
+ "in": "path",
3359
+ "name": "bulk_job_id",
3360
+ "required": true,
3361
+ "schema": {
3362
+ "type": "string"
3363
+ }
3364
+ },
3365
+ {
3366
+ "in": "query",
3367
+ "name": "limit",
3368
+ "required": false,
3369
+ "schema": {
3370
+ "type": "integer",
3371
+ "minimum": 1,
3372
+ "maximum": 25,
3373
+ "default": 10
3374
+ }
3375
+ },
3376
+ {
3377
+ "in": "query",
3378
+ "name": "cursor",
3379
+ "required": false,
3380
+ "schema": {
3381
+ "type": "string"
3382
+ }
3383
+ }
3384
+ ],
3385
+ "responses": {
3386
+ "200": {
3387
+ "description": "A page of target rows",
3388
+ "content": {
3389
+ "application/json": {
3390
+ "schema": {
3391
+ "$ref": "#/components/schemas/BulkInstallTargetList"
3392
+ }
3393
+ }
3394
+ }
3395
+ },
3396
+ "404": {
3397
+ "description": "Bulk install not found for the caller org"
3398
+ }
3399
+ }
3400
+ }
3401
+ },
3402
+ "/v3/blueprint-manifest/bulk-installs/{bulk_job_id}/targets/{destination_org_id}:retry": {
3403
+ "post": {
3404
+ "operationId": "retryBulkInstallTargetV3",
3405
+ "summary": "Retry Bulk Install Target V3",
3406
+ "description": "Retries a single failed target. Allowed only for `FAILED` and `PARTIAL_SUCCESS`\ntargets. Starts a new child install with `auto_apply=true`, appends its job id to\n`job_ids`, and reuses the same target row. Only the destination auth token may be\nsupplied for the new attempt; source/destination identifiers are immutable.\n",
3407
+ "tags": [
3408
+ "Blueprints"
3409
+ ],
3410
+ "parameters": [
3411
+ {
3412
+ "in": "path",
3413
+ "name": "bulk_job_id",
3414
+ "required": true,
3415
+ "schema": {
3416
+ "type": "string"
3417
+ }
3418
+ },
3419
+ {
3420
+ "in": "path",
3421
+ "name": "destination_org_id",
3422
+ "required": true,
3423
+ "schema": {
3424
+ "type": "string"
3425
+ }
3426
+ }
3427
+ ],
3428
+ "requestBody": {
3429
+ "required": true,
3430
+ "content": {
3431
+ "application/json": {
3432
+ "schema": {
3433
+ "type": "object",
3434
+ "required": [
3435
+ "destination_auth_token"
3436
+ ],
3437
+ "properties": {
3438
+ "destination_auth_token": {
3439
+ "type": "string",
3440
+ "description": "Write-only auth token for the destination org used for the new attempt."
3441
+ }
3442
+ }
3443
+ }
3444
+ }
3445
+ }
3446
+ },
3447
+ "responses": {
3448
+ "200": {
3449
+ "description": "Updated target row with hydrated latest child job",
3450
+ "content": {
3451
+ "application/json": {
3452
+ "schema": {
3453
+ "$ref": "#/components/schemas/BulkInstallTarget"
3454
+ }
3455
+ }
3456
+ }
3457
+ },
3458
+ "400": {
3459
+ "description": "Target is not in a retryable (`FAILED`/`PARTIAL_SUCCESS`) state."
3460
+ },
3461
+ "404": {
3462
+ "description": "Bulk install or target not found for the caller org."
3463
+ },
3464
+ "409": {
3465
+ "description": "The target was concurrently claimed by another retry (already in progress)."
3466
+ }
3467
+ }
3468
+ }
3469
+ },
3126
3470
  "/v1/blueprint-manifest/uniqueness-criteria": {
3127
3471
  "get": {
3128
3472
  "operationId": "listUniquenessCriteria",
@@ -3144,6 +3488,23 @@
3144
3488
  "items": {
3145
3489
  "$ref": "#/components/schemas/UniquenessCriteria"
3146
3490
  }
3491
+ },
3492
+ "defaults": {
3493
+ "type": "object",
3494
+ "description": "Built-in default uniqueness fields per resource type, as used by\nthe install engines when no custom criteria are configured.\n",
3495
+ "additionalProperties": {
3496
+ "type": "array",
3497
+ "items": {
3498
+ "type": "string"
3499
+ }
3500
+ }
3501
+ },
3502
+ "readonly_types": {
3503
+ "type": "array",
3504
+ "description": "Resource types whose criteria are fixed by epilot and cannot be\ncustomized (writes are rejected). Shown read-only in the UI.\n",
3505
+ "items": {
3506
+ "type": "string"
3507
+ }
3147
3508
  }
3148
3509
  }
3149
3510
  }
@@ -3210,6 +3571,13 @@
3210
3571
  "items": {
3211
3572
  "type": "string"
3212
3573
  }
3574
+ },
3575
+ "propagated_to": {
3576
+ "type": "array",
3577
+ "description": "Org IDs this rule was also applied to (the UI's \"Also apply to\"\nselection). Stored so the selection survives reloads; each target\norg still holds its own criteria row.\n",
3578
+ "items": {
3579
+ "type": "string"
3580
+ }
3213
3581
  }
3214
3582
  }
3215
3583
  }
@@ -3261,11 +3629,7 @@
3261
3629
  "product_recommendation",
3262
3630
  "file",
3263
3631
  "document_template",
3264
- "schema",
3265
- "taxonomy",
3266
3632
  "notification_template",
3267
- "family",
3268
- "permission",
3269
3633
  "journey"
3270
3634
  ]
3271
3635
  },
@@ -3291,6 +3655,12 @@
3291
3655
  "type": "string"
3292
3656
  }
3293
3657
  },
3658
+ "propagated_to": {
3659
+ "type": "array",
3660
+ "items": {
3661
+ "type": "string"
3662
+ }
3663
+ },
3294
3664
  "updated_at": {
3295
3665
  "type": "string",
3296
3666
  "format": "date-time"
@@ -3892,7 +4262,8 @@
3892
4262
  "internal-update",
3893
4263
  "no-op",
3894
4264
  "delete",
3895
- "ignored"
4265
+ "ignored",
4266
+ "error"
3896
4267
  ]
3897
4268
  }
3898
4269
  },
@@ -4370,6 +4741,191 @@
4370
4741
  }
4371
4742
  ]
4372
4743
  },
4744
+ "BulkInstallStatus": {
4745
+ "type": "string",
4746
+ "description": "Aggregate status for a bulk install or one of its targets.\n- `QUEUED`: not started yet\n- `IN_PROGRESS`: at least one target queued/in-progress, not all done\n- `SUCCESS`: all targets succeeded\n- `PARTIAL_SUCCESS`: all targets terminal with a mix of success/partial/failure\n- `FAILED`: all targets terminal and none succeeded or partially succeeded\n",
4747
+ "enum": [
4748
+ "QUEUED",
4749
+ "IN_PROGRESS",
4750
+ "SUCCESS",
4751
+ "PARTIAL_SUCCESS",
4752
+ "FAILED"
4753
+ ]
4754
+ },
4755
+ "BulkInstallCounts": {
4756
+ "type": "object",
4757
+ "description": "Tally of target rows by status. Recomputed from target rows on each transition.",
4758
+ "properties": {
4759
+ "queued": {
4760
+ "type": "integer"
4761
+ },
4762
+ "in_progress": {
4763
+ "type": "integer"
4764
+ },
4765
+ "success": {
4766
+ "type": "integer"
4767
+ },
4768
+ "partial_success": {
4769
+ "type": "integer"
4770
+ },
4771
+ "failed": {
4772
+ "type": "integer"
4773
+ }
4774
+ }
4775
+ },
4776
+ "BulkInstall": {
4777
+ "type": "object",
4778
+ "description": "Bulk install parent. Never carries target auth tokens.",
4779
+ "properties": {
4780
+ "bulk_job_id": {
4781
+ "type": "string"
4782
+ },
4783
+ "source_org_id": {
4784
+ "type": "string"
4785
+ },
4786
+ "source_blueprint_id": {
4787
+ "$ref": "#/components/schemas/BlueprintID"
4788
+ },
4789
+ "status": {
4790
+ "$ref": "#/components/schemas/BulkInstallStatus"
4791
+ },
4792
+ "target_count": {
4793
+ "type": "integer"
4794
+ },
4795
+ "max_concurrency": {
4796
+ "type": "integer"
4797
+ },
4798
+ "counts": {
4799
+ "$ref": "#/components/schemas/BulkInstallCounts"
4800
+ },
4801
+ "slug": {
4802
+ "type": "string"
4803
+ },
4804
+ "options": {
4805
+ "$ref": "#/components/schemas/BlueprintInstallationJobOptions"
4806
+ },
4807
+ "created_at": {
4808
+ "type": "string",
4809
+ "format": "date-time"
4810
+ },
4811
+ "updated_at": {
4812
+ "type": "string",
4813
+ "format": "date-time"
4814
+ }
4815
+ }
4816
+ },
4817
+ "BulkInstallTarget": {
4818
+ "type": "object",
4819
+ "description": "A single destination of a bulk install. `job` is the hydrated latest child\ninstall job derived from `job_ids.at(-1)`. Auth tokens are never stored or returned.\n",
4820
+ "properties": {
4821
+ "bulk_job_id": {
4822
+ "type": "string"
4823
+ },
4824
+ "destination_org_id": {
4825
+ "type": "string"
4826
+ },
4827
+ "destination_blueprint_id": {
4828
+ "$ref": "#/components/schemas/BlueprintID"
4829
+ },
4830
+ "status": {
4831
+ "$ref": "#/components/schemas/BulkInstallStatus"
4832
+ },
4833
+ "job_ids": {
4834
+ "type": "array",
4835
+ "items": {
4836
+ "$ref": "#/components/schemas/BlueprintJobID"
4837
+ }
4838
+ },
4839
+ "created_at": {
4840
+ "type": "string",
4841
+ "format": "date-time"
4842
+ },
4843
+ "updated_at": {
4844
+ "type": "string",
4845
+ "format": "date-time"
4846
+ },
4847
+ "job": {
4848
+ "allOf": [
4849
+ {
4850
+ "$ref": "#/components/schemas/BlueprintInstallationJob"
4851
+ }
4852
+ ],
4853
+ "nullable": true,
4854
+ "description": "The hydrated latest child install job (`job_ids.at(-1)`), when present."
4855
+ }
4856
+ }
4857
+ },
4858
+ "BulkInstallTargetList": {
4859
+ "type": "object",
4860
+ "properties": {
4861
+ "results": {
4862
+ "type": "array",
4863
+ "items": {
4864
+ "$ref": "#/components/schemas/BulkInstallTarget"
4865
+ }
4866
+ },
4867
+ "next_cursor": {
4868
+ "type": "string",
4869
+ "description": "Opaque cursor for the next page. Absent on the last page."
4870
+ }
4871
+ }
4872
+ },
4873
+ "BulkInstallTargetInput": {
4874
+ "type": "object",
4875
+ "required": [
4876
+ "destination_org_id",
4877
+ "destination_auth_token"
4878
+ ],
4879
+ "properties": {
4880
+ "destination_org_id": {
4881
+ "type": "string"
4882
+ },
4883
+ "destination_blueprint_id": {
4884
+ "$ref": "#/components/schemas/BlueprintID"
4885
+ },
4886
+ "destination_auth_token": {
4887
+ "type": "string",
4888
+ "description": "Write-only org-scoped token for the destination org. Never persisted or returned."
4889
+ }
4890
+ }
4891
+ },
4892
+ "BulkInstallCreateRequest": {
4893
+ "type": "object",
4894
+ "required": [
4895
+ "source_blueprint_id",
4896
+ "targets"
4897
+ ],
4898
+ "properties": {
4899
+ "source_org_id": {
4900
+ "type": "string",
4901
+ "description": "The org that owns the source blueprint. Optional; defaults to the caller org and,\nif provided, must equal it — source reads use the caller's token, and the bulk job\nis owned/polled by the caller org. A different value is rejected with 400.\n"
4902
+ },
4903
+ "source_blueprint_id": {
4904
+ "$ref": "#/components/schemas/BlueprintID"
4905
+ },
4906
+ "max_concurrency": {
4907
+ "type": "integer",
4908
+ "minimum": 1,
4909
+ "maximum": 5,
4910
+ "default": 2,
4911
+ "description": "Maximum number of concurrently active child installs."
4912
+ },
4913
+ "slug": {
4914
+ "type": "string"
4915
+ },
4916
+ "options": {
4917
+ "$ref": "#/components/schemas/BlueprintInstallationJobOptions"
4918
+ },
4919
+ "targets": {
4920
+ "type": "array",
4921
+ "minItems": 1,
4922
+ "maxItems": 100,
4923
+ "items": {
4924
+ "$ref": "#/components/schemas/BulkInstallTargetInput"
4925
+ }
4926
+ }
4927
+ }
4928
+ },
4373
4929
  "BlueprintRestoreJob": {
4374
4930
  "allOf": [
4375
4931
  {
@@ -4505,9 +5061,9 @@
4505
5061
  "description": "Only set when `action == skip`.",
4506
5062
  "enum": [
4507
5063
  "modified",
4508
- "co_owned",
4509
5064
  "delete_unsupported",
4510
- "heuristic_match"
5065
+ "heuristic_match",
5066
+ "co_owned"
4511
5067
  ]
4512
5068
  },
4513
5069
  "last_synced_at": {
@@ -4526,6 +5082,29 @@
4526
5082
  "type": "string",
4527
5083
  "nullable": true,
4528
5084
  "description": "Only set when `action == failed`."
5085
+ },
5086
+ "is_hidden": {
5087
+ "type": "boolean",
5088
+ "description": "Mirrors the install manifest's `is_hidden` for this resource —\nhelper resources (entity mappings, datasources, flow-template\nautomations) the UI hides on every other resources view. Absent\non rows from legacy installs without a persisted manifest.\n"
5089
+ },
5090
+ "co_owned_by": {
5091
+ "type": "array",
5092
+ "description": "Only set when `reason == co_owned`. The other live blueprint\ninstances that still own this resource's lineage row — the\n\"another sync\" the skip refers to.\n",
5093
+ "items": {
5094
+ "type": "object",
5095
+ "required": [
5096
+ "blueprint_id"
5097
+ ],
5098
+ "properties": {
5099
+ "blueprint_id": {
5100
+ "type": "string"
5101
+ },
5102
+ "title": {
5103
+ "type": "string",
5104
+ "nullable": true
5105
+ }
5106
+ }
5107
+ }
4529
5108
  }
4530
5109
  }
4531
5110
  },
@@ -4542,6 +5121,10 @@
4542
5121
  "items": {
4543
5122
  "$ref": "#/components/schemas/RestoreOutcomeItem"
4544
5123
  }
5124
+ },
5125
+ "has_effective_changes": {
5126
+ "type": "boolean",
5127
+ "description": "`true` iff at least one entry in `resources` has an effective\naction (`action` is `restore` or `delete`). `false` when every\nresource would be skipped (all `skip` / `failed`). Consumers\ncan gate the \"Revert sync\" confirm button on this — if false,\nexecuting the revert is a no-op.\n"
4545
5128
  }
4546
5129
  }
4547
5130
  },
@@ -4674,6 +5257,18 @@
4674
5257
  "destination_blueprint_id": {
4675
5258
  "$ref": "#/components/schemas/BlueprintID"
4676
5259
  },
5260
+ "installation_job_id": {
5261
+ "$ref": "#/components/schemas/BlueprintJobID",
5262
+ "description": "Install job this verification is checking, when known."
5263
+ },
5264
+ "sync_engine": {
5265
+ "type": "string",
5266
+ "enum": [
5267
+ "terraform",
5268
+ "v3"
5269
+ ],
5270
+ "description": "Install engine used by the linked installation job, when known."
5271
+ },
4677
5272
  "status": {
4678
5273
  "type": "string",
4679
5274
  "enum": [
@@ -4731,6 +5326,16 @@
4731
5326
  "destination_blueprint_id": {
4732
5327
  "$ref": "#/components/schemas/BlueprintID"
4733
5328
  },
5329
+ "installation_job_id": {
5330
+ "$ref": "#/components/schemas/BlueprintJobID"
5331
+ },
5332
+ "sync_engine": {
5333
+ "type": "string",
5334
+ "enum": [
5335
+ "terraform",
5336
+ "v3"
5337
+ ]
5338
+ },
4734
5339
  "summary": {
4735
5340
  "$ref": "#/components/schemas/VerificationSummary"
4736
5341
  }
@@ -4768,9 +5373,15 @@
4768
5373
  "source_resource_id": {
4769
5374
  "type": "string"
4770
5375
  },
5376
+ "source_resource_address": {
5377
+ "type": "string"
5378
+ },
4771
5379
  "destination_resource_id": {
4772
5380
  "type": "string"
4773
5381
  },
5382
+ "destination_resource_address": {
5383
+ "type": "string"
5384
+ },
4774
5385
  "status": {
4775
5386
  "type": "string",
4776
5387
  "enum": [
@@ -4780,6 +5391,32 @@
4780
5391
  "fetch_error"
4781
5392
  ]
4782
5393
  },
5394
+ "failure_context": {
5395
+ "type": "string",
5396
+ "enum": [
5397
+ "depends_on_failed_resource",
5398
+ "may_be_caused_by_failed_dependency"
5399
+ ],
5400
+ "description": "Explains whether this result is likely downstream of another failed resource."
5401
+ },
5402
+ "failed_dependency_resource_ids": {
5403
+ "type": "array",
5404
+ "items": {
5405
+ "type": "string"
5406
+ }
5407
+ },
5408
+ "failed_dependency_resource_names": {
5409
+ "type": "array",
5410
+ "items": {
5411
+ "type": "string"
5412
+ }
5413
+ },
5414
+ "failed_dependency_addresses": {
5415
+ "type": "array",
5416
+ "items": {
5417
+ "type": "string"
5418
+ }
5419
+ },
4783
5420
  "field_diffs": {
4784
5421
  "type": "array",
4785
5422
  "items": {
@@ -5929,10 +5929,77 @@
5929
5929
  }
5930
5930
  }
5931
5931
  },
5932
+ "patch": {
5933
+ "operationId": "updateContract",
5934
+ "summary": "updateContract",
5935
+ "description": "Update a contract by id. Use getPortalUserEntity instead.",
5936
+ "deprecated": true,
5937
+ "tags": [
5938
+ "ECP"
5939
+ ],
5940
+ "security": [
5941
+ {
5942
+ "PortalAuth": []
5943
+ }
5944
+ ],
5945
+ "parameters": [
5946
+ {
5947
+ "in": "path",
5948
+ "name": "id",
5949
+ "schema": {
5950
+ "$ref": "#/components/schemas/EntityId"
5951
+ },
5952
+ "required": true,
5953
+ "description": "The ID of the contract"
5954
+ }
5955
+ ],
5956
+ "requestBody": {
5957
+ "description": "Requested contract body to update",
5958
+ "required": true,
5959
+ "content": {
5960
+ "application/json": {
5961
+ "schema": {
5962
+ "$ref": "#/components/schemas/Entity"
5963
+ }
5964
+ }
5965
+ }
5966
+ },
5967
+ "responses": {
5968
+ "200": {
5969
+ "description": "Updated the contract successfully.",
5970
+ "content": {
5971
+ "application/json": {
5972
+ "schema": {
5973
+ "type": "object",
5974
+ "properties": {
5975
+ "data": {
5976
+ "$ref": "#/components/schemas/Contract"
5977
+ }
5978
+ }
5979
+ }
5980
+ }
5981
+ }
5982
+ },
5983
+ "401": {
5984
+ "$ref": "#/components/responses/Unauthorized"
5985
+ },
5986
+ "403": {
5987
+ "$ref": "#/components/responses/ForbiddenByRule"
5988
+ },
5989
+ "404": {
5990
+ "$ref": "#/components/responses/NotFound"
5991
+ },
5992
+ "500": {
5993
+ "$ref": "#/components/responses/InternalServerError"
5994
+ }
5995
+ }
5996
+ }
5997
+ },
5998
+ "/v2/portal/contract/{id}/resolve-templates": {
5932
5999
  "post": {
5933
6000
  "operationId": "getContractWithTemplates",
5934
6001
  "summary": "getContractWithTemplates",
5935
- "description": "Get a contract by id, resolving the provided Handlebars templates against each related meter into templates_output. POST variant of getContract that accepts a request body; the GET remains as a fallback.",
6002
+ "description": "Resolve Handlebars templates against a contract's related meters and return the contract with templates_output populated per meter. This is a read-only operation — it does not modify the contract. It uses POST only so the templates can be passed in the request body. Prefer getPortalUserEntity / getContract for reads that don't need templates.",
5936
6003
  "tags": [
5937
6004
  "ECP"
5938
6005
  ],
@@ -6047,71 +6114,6 @@
6047
6114
  "$ref": "#/components/responses/InternalServerError"
6048
6115
  }
6049
6116
  }
6050
- },
6051
- "patch": {
6052
- "operationId": "updateContract",
6053
- "summary": "updateContract",
6054
- "description": "Update a contract by id. Use getPortalUserEntity instead.",
6055
- "deprecated": true,
6056
- "tags": [
6057
- "ECP"
6058
- ],
6059
- "security": [
6060
- {
6061
- "PortalAuth": []
6062
- }
6063
- ],
6064
- "parameters": [
6065
- {
6066
- "in": "path",
6067
- "name": "id",
6068
- "schema": {
6069
- "$ref": "#/components/schemas/EntityId"
6070
- },
6071
- "required": true,
6072
- "description": "The ID of the contract"
6073
- }
6074
- ],
6075
- "requestBody": {
6076
- "description": "Requested contract body to update",
6077
- "required": true,
6078
- "content": {
6079
- "application/json": {
6080
- "schema": {
6081
- "$ref": "#/components/schemas/Entity"
6082
- }
6083
- }
6084
- }
6085
- },
6086
- "responses": {
6087
- "200": {
6088
- "description": "Updated the contract successfully.",
6089
- "content": {
6090
- "application/json": {
6091
- "schema": {
6092
- "type": "object",
6093
- "properties": {
6094
- "data": {
6095
- "$ref": "#/components/schemas/Contract"
6096
- }
6097
- }
6098
- }
6099
- }
6100
- }
6101
- },
6102
- "401": {
6103
- "$ref": "#/components/responses/Unauthorized"
6104
- },
6105
- "403": {
6106
- "$ref": "#/components/responses/ForbiddenByRule"
6107
- },
6108
- "404": {
6109
- "$ref": "#/components/responses/NotFound"
6110
- },
6111
- "500": {
6112
- "$ref": "#/components/responses/InternalServerError"
6113
- }
6114
- }
6115
6117
  }
6116
6118
  },
6117
6119
  "/v2/portal/contract/by-identifiers": {
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  API_LIST
4
- } from "../chunk-GUV2XOGM.js";
4
+ } from "../chunk-PTYOPMM3.js";
5
5
 
6
6
  // bin/epilot.ts
7
7
  import { runMain } from "citty";
@@ -11,7 +11,7 @@ import { defineCommand } from "citty";
11
11
  var main = defineCommand({
12
12
  meta: {
13
13
  name: "epilot",
14
- version: "0.1.70",
14
+ version: "0.1.72",
15
15
  description: "CLI for epilot APIs"
16
16
  },
17
17
  args: {
@@ -30,8 +30,8 @@ var main = defineCommand({
30
30
  auth: () => import("../auth-4HG7B2GC.js").then((m) => m.default),
31
31
  profile: () => import("../profile-OZJL5ZPT.js").then((m) => m.default),
32
32
  config: () => import("../config-DGZIMLZK.js").then((m) => m.default),
33
- completion: () => import("../completion-PDNCIJ7H.js").then((m) => m.default),
34
- upgrade: () => import("../upgrade-2IID7RYV.js").then((m) => m.default),
33
+ completion: () => import("../completion-KSW2KXMX.js").then((m) => m.default),
34
+ upgrade: () => import("../upgrade-DFLGAVOY.js").then((m) => m.default),
35
35
  "access-token": () => import("../access-token-WWE6BDJH.js").then((m) => m.default),
36
36
  address: () => import("../address-EH3C4CVB.js").then((m) => m.default),
37
37
  "address-suggestions": () => import("../address-suggestions-RRSLOBFW.js").then((m) => m.default),
@@ -134,13 +134,13 @@ process.stderr.on("error", (err) => {
134
134
  if (err.code === "EPIPE") process.exit(0);
135
135
  throw err;
136
136
  });
137
- var VERSION = true ? "0.1.70" : (await null).default.version;
137
+ var VERSION = true ? "0.1.72" : (await null).default.version;
138
138
  var reorderedArgv = hoistFlagsAfterSubcommand(process.argv.slice(2));
139
139
  process.argv = [process.argv[0], process.argv[1], ...reorderedArgv];
140
140
  var args = process.argv.slice(2);
141
141
  var completionsIdx = args.indexOf("--_completions");
142
142
  if (completionsIdx >= 0) {
143
- const { handleCompletions } = await import("../completion-PDNCIJ7H.js");
143
+ const { handleCompletions } = await import("../completion-KSW2KXMX.js");
144
144
  handleCompletions(args[completionsIdx + 1], args[completionsIdx + 2]);
145
145
  process.exit(0);
146
146
  }
@@ -166,7 +166,7 @@ var API_LIST = [
166
166
  kebabName: "blueprint-manifest",
167
167
  title: "Blueprint Manifest API",
168
168
  serverUrl: "https://blueprint-manifest.sls.epilot.io",
169
- operationCount: 61,
169
+ operationCount: 66,
170
170
  operationIds: [
171
171
  "getJob",
172
172
  "createExport",
@@ -221,10 +221,15 @@ var API_LIST = [
221
221
  "createMarketplaceListingVersion",
222
222
  "updateMarketplaceListingVersion",
223
223
  "publishMarketplaceListingVersion",
224
+ "publishBlueprintV3",
224
225
  "installBlueprintV3",
225
226
  "restoreBlueprintDeploymentV3",
226
227
  "getRestorePreview",
227
228
  "getBlueprintLineageV3",
229
+ "createBulkInstallV3",
230
+ "getBulkInstallV3",
231
+ "listBulkInstallTargetsV3",
232
+ "retryBulkInstallTargetV3",
228
233
  "listUniquenessCriteria",
229
234
  "getUniquenessCriteria",
230
235
  "putUniquenessCriteria",
@@ -358,8 +363,8 @@ var API_LIST = [
358
363
  "getAllRequests",
359
364
  "getAllContracts",
360
365
  "getContract",
361
- "getContractWithTemplates",
362
366
  "updateContract",
367
+ "getContractWithTemplates",
363
368
  "addContractByIdentifiers",
364
369
  "getEntityIdentifiers",
365
370
  "getEntityActivityFeed",
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  API_LIST
4
- } from "./chunk-GUV2XOGM.js";
4
+ } from "./chunk-PTYOPMM3.js";
5
5
  import {
6
6
  DIM,
7
7
  GREEN,
@@ -72,7 +72,7 @@ ${GREEN}${BOLD}Upgraded to @epilot/cli@${latest}${RESET}
72
72
  }
73
73
  });
74
74
  var getCurrentVersion = () => {
75
- if (true) return "0.1.70";
75
+ if (true) return "0.1.72";
76
76
  try {
77
77
  const output = execSync("npm ls -g @epilot/cli --depth=0 --json 2>/dev/null", {
78
78
  encoding: "utf-8",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@epilot/cli",
3
- "version": "0.1.70",
3
+ "version": "0.1.72",
4
4
  "description": "CLI for epilot APIs",
5
5
  "type": "module",
6
6
  "bin": {