@bongos/core 1.20.28 → 1.20.30
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/.bongos-core.json +47 -27
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +2 -0
- package/clients/bongos-client/index.cjs +2 -0
- package/clients/bongos-client/index.d.ts +2 -0
- package/clients/bongos-client/index.mjs +2 -0
- package/docs/api/openapi.json +49 -1
- package/docs/api-reference.md +3 -2
- package/docs/module-api-changelog.md +4 -0
- package/modules/provisioning/core-upgrade.js +75 -1
- package/modules/provisioning/migrations/provisioning_029_update_channel.sql +24 -0
- package/modules/provisioning/migrations/provisioning_030_intent_failure_class.sql +28 -0
- package/modules/provisioning/routes/core-upgrade.js +21 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +12 -0
- package/scripts/gds/provision-core-upgrade.js +40 -20
- package/scripts/gds/provision.js +11 -0
- package/scripts/gds/upgrade-outcome.js +155 -0
- package/scripts/gds/upgrade.js +1 -1
- package/src/module-api.js +1 -1
- package/tests/core_upgrade_door.mjs +89 -1
- package/tests/core_upgrade_runner.mjs +120 -1
- package/tests/provision.mjs +34 -0
- package/tests/upgrade_outcome.mjs +129 -0
package/.bongos-core.json
CHANGED
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/gds/package-core.js",
|
|
5
|
-
"core_version": "1.20.
|
|
6
|
-
"core_contract": "1.20.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.20.30",
|
|
6
|
+
"core_contract": "1.20.30",
|
|
7
|
+
"source_commit": "b56a05d974ae5208394507078971bf8e22f415f3",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-
|
|
9
|
+
"built_at": "2026-09-30T21:06:55.806Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 562,
|
|
13
13
|
"agent_docs_stubbed": 25,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 2663,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 3251,
|
|
20
|
+
"tree_sha256": "3b45f4c67302ad870157396c60f693712b46bcdc86a9236e964c914418657c35",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -327,12 +327,12 @@
|
|
|
327
327
|
{
|
|
328
328
|
"path": "clients/bongos-client/README.md",
|
|
329
329
|
"mode": "0000644",
|
|
330
|
-
"sha256": "
|
|
330
|
+
"sha256": "08c6eaeee75d4fa5a447578107738e5357ffe088bde7f64e946a5f82d1c06106"
|
|
331
331
|
},
|
|
332
332
|
{
|
|
333
333
|
"path": "clients/bongos-client/bongos-client.global.js",
|
|
334
334
|
"mode": "0000644",
|
|
335
|
-
"sha256": "
|
|
335
|
+
"sha256": "808fd2048e5260dd4cc518d0e4697636b99ec393c925caa1d858976da2590baf"
|
|
336
336
|
},
|
|
337
337
|
{
|
|
338
338
|
"path": "clients/bongos-client/examples/hello-world.mjs",
|
|
@@ -342,17 +342,17 @@
|
|
|
342
342
|
{
|
|
343
343
|
"path": "clients/bongos-client/index.cjs",
|
|
344
344
|
"mode": "0000644",
|
|
345
|
-
"sha256": "
|
|
345
|
+
"sha256": "d6484208dc9acee624ed01503c36ad9fa4f06bd1e7b51738e2c58c1fe251ace8"
|
|
346
346
|
},
|
|
347
347
|
{
|
|
348
348
|
"path": "clients/bongos-client/index.d.ts",
|
|
349
349
|
"mode": "0000644",
|
|
350
|
-
"sha256": "
|
|
350
|
+
"sha256": "6298f90c0b7849ca342dd5e5235df57686e36b666cedba8db2d9018e8acb60c1"
|
|
351
351
|
},
|
|
352
352
|
{
|
|
353
353
|
"path": "clients/bongos-client/index.mjs",
|
|
354
354
|
"mode": "0000644",
|
|
355
|
-
"sha256": "
|
|
355
|
+
"sha256": "eded947e375da51b79857e9d3452f21fbfca2136e774b2a3907d1a4d51436aa9"
|
|
356
356
|
},
|
|
357
357
|
{
|
|
358
358
|
"path": "clients/bongos-client/package.json",
|
|
@@ -2262,12 +2262,12 @@
|
|
|
2262
2262
|
{
|
|
2263
2263
|
"path": "docs/api-reference.md",
|
|
2264
2264
|
"mode": "0000644",
|
|
2265
|
-
"sha256": "
|
|
2265
|
+
"sha256": "60243a4cf43ee8c37a06dda28bac07a9797c96eaef126cbcbda4d89c9ec9b986"
|
|
2266
2266
|
},
|
|
2267
2267
|
{
|
|
2268
2268
|
"path": "docs/api/openapi.json",
|
|
2269
2269
|
"mode": "0000644",
|
|
2270
|
-
"sha256": "
|
|
2270
|
+
"sha256": "847818c90b206c7223114b868e32b1eb50e0cc9955ae4dd6b67c5614d1ab51d8"
|
|
2271
2271
|
},
|
|
2272
2272
|
{
|
|
2273
2273
|
"path": "docs/architecture.md",
|
|
@@ -2802,7 +2802,7 @@
|
|
|
2802
2802
|
{
|
|
2803
2803
|
"path": "docs/module-api-changelog.md",
|
|
2804
2804
|
"mode": "0000644",
|
|
2805
|
-
"sha256": "
|
|
2805
|
+
"sha256": "fca494d7f518bc42742fde6c5ba2e45cfbf0605d5a7a79024bba190ec4c3c1da"
|
|
2806
2806
|
},
|
|
2807
2807
|
{
|
|
2808
2808
|
"path": "docs/modules-contract.md",
|
|
@@ -7282,7 +7282,7 @@
|
|
|
7282
7282
|
{
|
|
7283
7283
|
"path": "modules/provisioning/core-upgrade.js",
|
|
7284
7284
|
"mode": "0000644",
|
|
7285
|
-
"sha256": "
|
|
7285
|
+
"sha256": "7604ea4c137c5c1cedca41329cfd6fce49458d454f2e956944f7fb8d0c4ab10a"
|
|
7286
7286
|
},
|
|
7287
7287
|
{
|
|
7288
7288
|
"path": "modules/provisioning/cost-ledger.js",
|
|
@@ -7454,6 +7454,16 @@
|
|
|
7454
7454
|
"mode": "0000644",
|
|
7455
7455
|
"sha256": "9726682ff47916ca8ef999fe70ed5995c3bad7680b0821b87e4cab8a74d9f867"
|
|
7456
7456
|
},
|
|
7457
|
+
{
|
|
7458
|
+
"path": "modules/provisioning/migrations/provisioning_029_update_channel.sql",
|
|
7459
|
+
"mode": "0000644",
|
|
7460
|
+
"sha256": "b667ec5165e611bd6f0d86b09465c5d9e632de853becce139bac49f5a88e5c1e"
|
|
7461
|
+
},
|
|
7462
|
+
{
|
|
7463
|
+
"path": "modules/provisioning/migrations/provisioning_030_intent_failure_class.sql",
|
|
7464
|
+
"mode": "0000644",
|
|
7465
|
+
"sha256": "7287181b4b42d3e391cd97e19ffa5fbc76026e81ad6f54648eb12a69dfea55a1"
|
|
7466
|
+
},
|
|
7457
7467
|
{
|
|
7458
7468
|
"path": "modules/provisioning/module.json",
|
|
7459
7469
|
"mode": "0000644",
|
|
@@ -7547,7 +7557,7 @@
|
|
|
7547
7557
|
{
|
|
7548
7558
|
"path": "modules/provisioning/routes/core-upgrade.js",
|
|
7549
7559
|
"mode": "0000644",
|
|
7550
|
-
"sha256": "
|
|
7560
|
+
"sha256": "980f25a157dfde5bda6ed903c727fab944b922abdc34be05dc0ccdb5fb3650cc"
|
|
7551
7561
|
},
|
|
7552
7562
|
{
|
|
7553
7563
|
"path": "modules/provisioning/routes/disconnect.js",
|
|
@@ -8972,12 +8982,12 @@
|
|
|
8972
8982
|
{
|
|
8973
8983
|
"path": "package-lock.json",
|
|
8974
8984
|
"mode": "0000644",
|
|
8975
|
-
"sha256": "
|
|
8985
|
+
"sha256": "872b4c6ad6eacb09cbcd5698c892fc798ce6e632b505304b5665c7f04ea99325"
|
|
8976
8986
|
},
|
|
8977
8987
|
{
|
|
8978
8988
|
"path": "package.json",
|
|
8979
8989
|
"mode": "0000644",
|
|
8980
|
-
"sha256": "
|
|
8990
|
+
"sha256": "6c29a554265b6c3e6fa7f29fbf9b334c3a73e30b240b393498b89304876b5495"
|
|
8981
8991
|
},
|
|
8982
8992
|
{
|
|
8983
8993
|
"path": "public-docs/index.html",
|
|
@@ -8997,7 +9007,7 @@
|
|
|
8997
9007
|
{
|
|
8998
9008
|
"path": "release-notes.json",
|
|
8999
9009
|
"mode": "0000644",
|
|
9000
|
-
"sha256": "
|
|
9010
|
+
"sha256": "1ce998432070110f9c3a9b128145bf8d44c032aa2ff55437207ecaf5efe8943a"
|
|
9001
9011
|
},
|
|
9002
9012
|
{
|
|
9003
9013
|
"path": "scripts/bongos-mcp.js",
|
|
@@ -9957,7 +9967,7 @@
|
|
|
9957
9967
|
{
|
|
9958
9968
|
"path": "scripts/gds/provision-core-upgrade.js",
|
|
9959
9969
|
"mode": "0000644",
|
|
9960
|
-
"sha256": "
|
|
9970
|
+
"sha256": "58599968201f98723a531c19f77985c0b26b9afa6d6448ae4803074497a6f2ad"
|
|
9961
9971
|
},
|
|
9962
9972
|
{
|
|
9963
9973
|
"path": "scripts/gds/provision-disconnect.js",
|
|
@@ -10012,7 +10022,7 @@
|
|
|
10012
10022
|
{
|
|
10013
10023
|
"path": "scripts/gds/provision.js",
|
|
10014
10024
|
"mode": "0000644",
|
|
10015
|
-
"sha256": "
|
|
10025
|
+
"sha256": "0f7a9cd81a78ef3ed30a40e9f048f8905b6a88e99a930f7cbdcdcd5c1661f71d"
|
|
10016
10026
|
},
|
|
10017
10027
|
{
|
|
10018
10028
|
"path": "scripts/gds/publish-credential-check.js",
|
|
@@ -10624,10 +10634,15 @@
|
|
|
10624
10634
|
"mode": "0000644",
|
|
10625
10635
|
"sha256": "1f0a8d52622328e29bd3bdbe0402f680f425480e37e29ee42ceee907368710af"
|
|
10626
10636
|
},
|
|
10637
|
+
{
|
|
10638
|
+
"path": "scripts/gds/upgrade-outcome.js",
|
|
10639
|
+
"mode": "0000644",
|
|
10640
|
+
"sha256": "a4f05b5e1042cf3d8c7096ef413b47fd039a02b78f2e4dbefb5bd002973784cb"
|
|
10641
|
+
},
|
|
10627
10642
|
{
|
|
10628
10643
|
"path": "scripts/gds/upgrade.js",
|
|
10629
10644
|
"mode": "0000644",
|
|
10630
|
-
"sha256": "
|
|
10645
|
+
"sha256": "399c2225543fc0d37505bca9cd96e33cf5598aa1f364a458d5b5efb3a588ddb3"
|
|
10631
10646
|
},
|
|
10632
10647
|
{
|
|
10633
10648
|
"path": "scripts/gds/validate-design.js",
|
|
@@ -11117,7 +11132,7 @@
|
|
|
11117
11132
|
{
|
|
11118
11133
|
"path": "src/module-api.js",
|
|
11119
11134
|
"mode": "0000644",
|
|
11120
|
-
"sha256": "
|
|
11135
|
+
"sha256": "4002317dabfa7084c1b541e2a6a605197ce8c1e45df90f81bfa2ef186b0d6776"
|
|
11121
11136
|
},
|
|
11122
11137
|
{
|
|
11123
11138
|
"path": "src/module-loader/catalog.js",
|
|
@@ -12062,7 +12077,7 @@
|
|
|
12062
12077
|
{
|
|
12063
12078
|
"path": "tests/core_upgrade_door.mjs",
|
|
12064
12079
|
"mode": "0000644",
|
|
12065
|
-
"sha256": "
|
|
12080
|
+
"sha256": "24f41ed750fc24003e31cd1e551256162119016ab299a94dda5e4c4fe030ff69"
|
|
12066
12081
|
},
|
|
12067
12082
|
{
|
|
12068
12083
|
"path": "tests/core_upgrade_owner_door.mjs",
|
|
@@ -12072,7 +12087,7 @@
|
|
|
12072
12087
|
{
|
|
12073
12088
|
"path": "tests/core_upgrade_runner.mjs",
|
|
12074
12089
|
"mode": "0000644",
|
|
12075
|
-
"sha256": "
|
|
12090
|
+
"sha256": "525e38bbafc2dd1419f3e41131dd89c6adc4f063f8585b193e2be72801bede5a"
|
|
12076
12091
|
},
|
|
12077
12092
|
{
|
|
12078
12093
|
"path": "tests/cosmos_token_contrast.mjs",
|
|
@@ -14687,7 +14702,7 @@
|
|
|
14687
14702
|
{
|
|
14688
14703
|
"path": "tests/provision.mjs",
|
|
14689
14704
|
"mode": "0000644",
|
|
14690
|
-
"sha256": "
|
|
14705
|
+
"sha256": "6b4405a5a4e0263f321a49e04d25cad87a042d5d9a296ba65ff3d14a1941deb0"
|
|
14691
14706
|
},
|
|
14692
14707
|
{
|
|
14693
14708
|
"path": "tests/provision_account_identity.mjs",
|
|
@@ -16089,6 +16104,11 @@
|
|
|
16089
16104
|
"mode": "0000644",
|
|
16090
16105
|
"sha256": "d3f5b941b89ede78ebb3cd7af43467363e5d6c6d35c7ad26a2977683ecf869e7"
|
|
16091
16106
|
},
|
|
16107
|
+
{
|
|
16108
|
+
"path": "tests/upgrade_outcome.mjs",
|
|
16109
|
+
"mode": "0000644",
|
|
16110
|
+
"sha256": "cec960e84573efe77003beb324c0679900f321249148418e7a04daf7a7a40215"
|
|
16111
|
+
},
|
|
16092
16112
|
{
|
|
16093
16113
|
"path": "tests/upgrade_persist_pin.mjs",
|
|
16094
16114
|
"mode": "0000644",
|
|
@@ -5,7 +5,7 @@ A **generated**, zero-dependency typed client for the Bongos API — produced fr
|
|
|
5
5
|
by hand; it regenerates when the spec changes, so it can never drift from the routes.
|
|
6
6
|
|
|
7
7
|
- API version: **v1** (served at `/api/bongos/v1`)
|
|
8
|
-
-
|
|
8
|
+
- 466 operations across 70 resource groups
|
|
9
9
|
|
|
10
10
|
## Use it from your project
|
|
11
11
|
|
|
@@ -843,6 +843,8 @@ function createClient(opts = {}) {
|
|
|
843
843
|
patchProvisioningInstancesIdSettings: (args) => request("PATCH", "/provisioning/instances/{id}/settings", { hasBody: true }, args),
|
|
844
844
|
// POST /provisioning/instances/{id}/teardown — rank: any-builder — POST /provisioning/instances/:id/teardown
|
|
845
845
|
postProvisioningInstancesIdTeardown: (args) => request("POST", "/provisioning/instances/{id}/teardown", { hasBody: true }, args),
|
|
846
|
+
// POST /provisioning/instances/{id}/update-channel — rank: archon — POST /provisioning/instances/:id/update-channel
|
|
847
|
+
postProvisioningInstancesIdUpdateChannel: (args) => request("POST", "/provisioning/instances/{id}/update-channel", { hasBody: true }, args),
|
|
846
848
|
// GET /provisioning/onboard-plan — rank: public — GET /provisioning/onboard-plan
|
|
847
849
|
getProvisioningOnboardPlan: (args) => request("GET", "/provisioning/onboard-plan", { hasBody: false }, args),
|
|
848
850
|
// GET /provisioning/recommendations — rank: public — GET /provisioning/recommendations
|
|
@@ -842,6 +842,8 @@ function createClient(opts = {}) {
|
|
|
842
842
|
patchProvisioningInstancesIdSettings: (args) => request("PATCH", "/provisioning/instances/{id}/settings", { hasBody: true }, args),
|
|
843
843
|
// POST /provisioning/instances/{id}/teardown — rank: any-builder — POST /provisioning/instances/:id/teardown
|
|
844
844
|
postProvisioningInstancesIdTeardown: (args) => request("POST", "/provisioning/instances/{id}/teardown", { hasBody: true }, args),
|
|
845
|
+
// POST /provisioning/instances/{id}/update-channel — rank: archon — POST /provisioning/instances/:id/update-channel
|
|
846
|
+
postProvisioningInstancesIdUpdateChannel: (args) => request("POST", "/provisioning/instances/{id}/update-channel", { hasBody: true }, args),
|
|
845
847
|
// GET /provisioning/onboard-plan — rank: public — GET /provisioning/onboard-plan
|
|
846
848
|
getProvisioningOnboardPlan: (args) => request("GET", "/provisioning/onboard-plan", { hasBody: false }, args),
|
|
847
849
|
// GET /provisioning/recommendations — rank: public — GET /provisioning/recommendations
|
|
@@ -1274,6 +1274,8 @@ export interface BongosClient {
|
|
|
1274
1274
|
patchProvisioningInstancesIdSettings(args?: RequestArgs): Promise<PatchProvisioningInstancesIdSettingsResponse>;
|
|
1275
1275
|
/** POST /provisioning/instances/{id}/teardown — rank: any-builder */
|
|
1276
1276
|
postProvisioningInstancesIdTeardown(args?: RequestArgs): Promise<PostProvisioningInstancesIdTeardownResponse>;
|
|
1277
|
+
/** POST /provisioning/instances/{id}/update-channel — rank: archon */
|
|
1278
|
+
postProvisioningInstancesIdUpdateChannel(args?: RequestArgs): Promise<ApiResponse>;
|
|
1277
1279
|
/** GET /provisioning/onboard-plan — rank: public */
|
|
1278
1280
|
getProvisioningOnboardPlan(args?: RequestArgs): Promise<GetProvisioningOnboardPlanResponse>;
|
|
1279
1281
|
/** GET /provisioning/recommendations — rank: public */
|
|
@@ -839,6 +839,8 @@ export function createClient(opts = {}) {
|
|
|
839
839
|
patchProvisioningInstancesIdSettings: (args) => request("PATCH", "/provisioning/instances/{id}/settings", { hasBody: true }, args),
|
|
840
840
|
// POST /provisioning/instances/{id}/teardown — rank: any-builder — POST /provisioning/instances/:id/teardown
|
|
841
841
|
postProvisioningInstancesIdTeardown: (args) => request("POST", "/provisioning/instances/{id}/teardown", { hasBody: true }, args),
|
|
842
|
+
// POST /provisioning/instances/{id}/update-channel — rank: archon — POST /provisioning/instances/:id/update-channel
|
|
843
|
+
postProvisioningInstancesIdUpdateChannel: (args) => request("POST", "/provisioning/instances/{id}/update-channel", { hasBody: true }, args),
|
|
842
844
|
// GET /provisioning/onboard-plan — rank: public — GET /provisioning/onboard-plan
|
|
843
845
|
getProvisioningOnboardPlan: (args) => request("GET", "/provisioning/onboard-plan", { hasBody: false }, args),
|
|
844
846
|
// GET /provisioning/recommendations — rank: public — GET /provisioning/recommendations
|
package/docs/api/openapi.json
CHANGED
|
@@ -15676,6 +15676,54 @@
|
|
|
15676
15676
|
]
|
|
15677
15677
|
}
|
|
15678
15678
|
},
|
|
15679
|
+
"/provisioning/instances/{id}/update-channel": {
|
|
15680
|
+
"post": {
|
|
15681
|
+
"operationId": "post_provisioning_instances_id_update_channel",
|
|
15682
|
+
"tags": [
|
|
15683
|
+
"provisioning"
|
|
15684
|
+
],
|
|
15685
|
+
"summary": "POST /provisioning/instances/:id/update-channel",
|
|
15686
|
+
"description": "POST /provisioning/instances/:id/update-channel — set the project's update rule (task 1004445). Body: { channel: \"pinned\" | \"patch\" | \"minor\" }. rank: `core.pin.move`, OR THE PROJECT'S OWN OWNER — the same two doors as the move, because the rule decides which moves the runner will perform: whoever may press Move may choose how far it reaches, and nobody else may. The platform's own row stays on the atom alone (OWNER_SHAPES excludes it), exactly as for the move.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `core.pin.move` (all required).",
|
|
15687
|
+
"x-rank": "archon",
|
|
15688
|
+
"x-source": "modules/provisioning/routes/core-upgrade.js",
|
|
15689
|
+
"x-permissions": [
|
|
15690
|
+
"core.pin.move"
|
|
15691
|
+
],
|
|
15692
|
+
"parameters": [
|
|
15693
|
+
{
|
|
15694
|
+
"name": "id",
|
|
15695
|
+
"in": "path",
|
|
15696
|
+
"required": true,
|
|
15697
|
+
"schema": {
|
|
15698
|
+
"type": "string"
|
|
15699
|
+
},
|
|
15700
|
+
"description": "Path parameter `id`."
|
|
15701
|
+
}
|
|
15702
|
+
],
|
|
15703
|
+
"responses": {
|
|
15704
|
+
"200": {
|
|
15705
|
+
"description": "Success."
|
|
15706
|
+
},
|
|
15707
|
+
"400": {
|
|
15708
|
+
"$ref": "#/components/responses/BadRequest"
|
|
15709
|
+
},
|
|
15710
|
+
"401": {
|
|
15711
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
15712
|
+
},
|
|
15713
|
+
"403": {
|
|
15714
|
+
"$ref": "#/components/responses/Forbidden"
|
|
15715
|
+
},
|
|
15716
|
+
"404": {
|
|
15717
|
+
"$ref": "#/components/responses/NotFound"
|
|
15718
|
+
}
|
|
15719
|
+
},
|
|
15720
|
+
"security": [
|
|
15721
|
+
{
|
|
15722
|
+
"builderSession": []
|
|
15723
|
+
}
|
|
15724
|
+
]
|
|
15725
|
+
}
|
|
15726
|
+
},
|
|
15679
15727
|
"/provisioning/onboard-plan": {
|
|
15680
15728
|
"get": {
|
|
15681
15729
|
"operationId": "get_provisioning_onboard_plan",
|
|
@@ -29763,7 +29811,7 @@
|
|
|
29763
29811
|
"description": "A required dependency/feature is not configured or is temporarily down."
|
|
29764
29812
|
}
|
|
29765
29813
|
},
|
|
29766
|
-
"x-endpoint-count":
|
|
29814
|
+
"x-endpoint-count": 466,
|
|
29767
29815
|
"x-schema-count": 498,
|
|
29768
29816
|
"x-undocumented-bodies": 12,
|
|
29769
29817
|
"x-response-schemas": 337,
|
package/docs/api-reference.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# Bongos API reference
|
|
4
4
|
|
|
5
|
-
> **Generated from the live route files** — the route file is authoritative.
|
|
5
|
+
> **Generated from the live route files** — the route file is authoritative. 466 endpoints across 83 route files.
|
|
6
6
|
> Machine-readable spec: [`docs/api/openapi.json`](api/openapi.json) (OpenAPI 3.1). Rendered docs site: **`/docs`** (e.g. `cloudbongos.com/docs`).
|
|
7
7
|
|
|
8
8
|
Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust-boundary-server-enforced-permissions.md)): `public` < `any-builder` < `metic+archon` < `archon`.
|
|
@@ -562,7 +562,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
562
562
|
| GET | `/api/bongos/projects/featured` | `public` | — | the public map of projects; no auth by design. |
|
|
563
563
|
| POST | `/api/bongos/projects/invite` | `metic+archon` | `client_id`, `github_login` | own-or-metic in effect: where to invite a builder into a project, asked by a `project.curate` holder OR the project's OWN OWNER (task 100… |
|
|
564
564
|
|
|
565
|
-
## `provisioning` (
|
|
565
|
+
## `provisioning` (35)
|
|
566
566
|
|
|
567
567
|
| Method | Path | Rank | Body | Description |
|
|
568
568
|
|---|---|---|---|---|
|
|
@@ -594,6 +594,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
594
594
|
| GET | `/api/bongos/provisioning/instances/:id/settings` | `any-builder` | — | GET /provisioning/instances/:id/settings — read a project's effective settings + the allowed values (so a form can render its choices). |
|
|
595
595
|
| PATCH | `/api/bongos/provisioning/instances/:id/settings` | `any-builder` | validated | PATCH /provisioning/instances/:id/settings — change a project's settings. |
|
|
596
596
|
| POST | `/api/bongos/provisioning/instances/:id/teardown` | `any-builder` | — | POST /provisioning/instances/:id/teardown — request teardown of the caller's OWN instance. |
|
|
597
|
+
| POST | `/api/bongos/provisioning/instances/:id/update-channel` | `archon` | — | POST /provisioning/instances/:id/update-channel — set the project's update rule (task 1004445). |
|
|
597
598
|
| GET | `/api/bongos/provisioning/onboard-plan` | `public` | — | GET /provisioning/onboard-plan?mode=greenfield\|adopt&domain=<host> — the CANONICAL onboarding step sequence (task 2085; goal 35 / criteri… |
|
|
598
599
|
| GET | `/api/bongos/provisioning/recommendations` | `public` | — | GET /provisioning/recommendations?type=<project type>&team_shape=<interview answer> — the RULE-BASED recommendation for one set of creati… |
|
|
599
600
|
| POST | `/api/bongos/provisioning/render/lookup` | `any-builder` | `key`, `owner_id` | POST /provisioning/render/lookup — rank: any authenticated builder. |
|
|
@@ -2713,5 +2713,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
2713
2713
|
landed since 1.20.26 with no explicit bump. run 36768642814. (task 1002620)
|
|
2714
2714
|
1.20.28 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2715
2715
|
landed since 1.20.27 with no explicit bump. run 36772266063. (task 1002620)
|
|
2716
|
+
1.20.29 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2717
|
+
landed since 1.20.28 with no explicit bump. run 36775277990. (task 1002620)
|
|
2718
|
+
1.20.30 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2719
|
+
landed since 1.20.29 with no explicit bump. run 36777226204. (task 1002620)
|
|
2716
2720
|
---------------------------------------------------------------------------
|
|
2717
2721
|
```
|
|
@@ -318,6 +318,9 @@ function previewFromSnapshot(inst, snap, openIntent, lastMove) {
|
|
|
318
318
|
slug: inst.slug,
|
|
319
319
|
hosting_shape: inst.hosting_shape,
|
|
320
320
|
served_version: served,
|
|
321
|
+
// The rule the runner bounds this project's moves by (task 1004445) — what the page
|
|
322
|
+
// shows beside the offer, so "nothing to deploy" can say WHICH rule made it so.
|
|
323
|
+
update_channel: updateChannelOf(inst),
|
|
321
324
|
recommended_version: recommended,
|
|
322
325
|
available_count: available.length,
|
|
323
326
|
behind: !!behind,
|
|
@@ -358,6 +361,11 @@ function previewFromSnapshot(inst, snap, openIntent, lastMove) {
|
|
|
358
361
|
// `git status` (the dirty-tree one lists every file). Never set on a DONE move:
|
|
359
362
|
// a done row's last_error is the note below, and a move that worked is not an error.
|
|
360
363
|
error: lastMove.state !== 'done' && lastMove.last_error ? String(lastMove.last_error).slice(0, 600) : null,
|
|
364
|
+
// WHAT KIND of failure it was (task 1004446, migration provisioning_030): the class the
|
|
365
|
+
// page and the self-heal steps key on, and its fixed reason code. null on a move that
|
|
366
|
+
// worked, and on one resolved before the columns existed.
|
|
367
|
+
failure: lastMove.state !== 'done' && lastMove.failure_class
|
|
368
|
+
? { class: lastMove.failure_class, reason: lastMove.failure_reason || null } : null,
|
|
361
369
|
// It LANDED, but GitHub did not get the new pin (task 1004065) — parseRepoNote.
|
|
362
370
|
warning: lastMove.state === 'done' ? parseRepoNote(lastMove.last_error) : null,
|
|
363
371
|
} : null,
|
|
@@ -429,5 +437,71 @@ function makeControlPlaneHandler({ provisioning, pool, log }) {
|
|
|
429
437
|
};
|
|
430
438
|
}
|
|
431
439
|
|
|
432
|
-
|
|
440
|
+
// ---- the project's update rule (task 1004445) -------------------------------------
|
|
441
|
+
//
|
|
442
|
+
// RE-STATED, NOT REQUIRED. The list is update-channel.js VALID_CHANNELS / DEFAULT_CHANNEL,
|
|
443
|
+
// which lives in scripts/gds/ and a module may not require (ADR 0083) — the same reason
|
|
444
|
+
// parseRepoNote re-states the runner's note shape. tests/core_upgrade_door.mjs asserts the
|
|
445
|
+
// two lists are equal, so they cannot drift apart silently; migration provisioning_029's
|
|
446
|
+
// CHECK is the third copy, and the database refuses anything outside it.
|
|
447
|
+
const UPDATE_CHANNELS = Object.freeze(['pinned', 'patch', 'minor']);
|
|
448
|
+
const DEFAULT_UPDATE_CHANNEL = 'patch';
|
|
449
|
+
|
|
450
|
+
/** The row's update rule, or the default for a row read before the column existed. PURE. */
|
|
451
|
+
function updateChannelOf(inst) {
|
|
452
|
+
const c = inst && typeof inst.update_channel === 'string' ? inst.update_channel : '';
|
|
453
|
+
return UPDATE_CHANNELS.includes(c) ? c : DEFAULT_UPDATE_CHANNEL;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
/**
|
|
457
|
+
* POST /provisioning/instances/:id/update-channel — set how far this project's core
|
|
458
|
+
* may move (task 1004445). Body: { channel: 'pinned' | 'patch' | 'minor' }.
|
|
459
|
+
*
|
|
460
|
+
* WHY IT EXISTS. The runner's channel refusal told the owner to "change the channel
|
|
461
|
+
* first", and until this route there was no channel to change: every project was held to
|
|
462
|
+
* patch-only, so a step-up release (1.19 → 1.20) could never land through the door.
|
|
463
|
+
*
|
|
464
|
+
* It changes a RULE, never the core: nothing is queued and nothing restarts. The next
|
|
465
|
+
* runner tick re-resolves what is on offer under the new rule, which is why the reply
|
|
466
|
+
* says the offer updates on the next check rather than claiming it already has.
|
|
467
|
+
*/
|
|
468
|
+
function makeUpdateChannelHandler({ provisioning, pool, parseId, validateOrRespond, log }) {
|
|
469
|
+
return async function updateChannelHandler(req, res) {
|
|
470
|
+
const id = parseId(req, res);
|
|
471
|
+
if (!id) return;
|
|
472
|
+
if (validateOrRespond(req, res, { channel: { type: 'string', maxLength: 16 } }, { strict: true })) return;
|
|
473
|
+
try {
|
|
474
|
+
const inst = await provisioning.getInstanceById(pool, id);
|
|
475
|
+
if (!inst) return res.fail('instance_not_found', 404);
|
|
476
|
+
const channel = req.body && typeof req.body.channel === 'string' ? req.body.channel.trim().toLowerCase() : '';
|
|
477
|
+
if (!UPDATE_CHANNELS.includes(channel)) {
|
|
478
|
+
return res.fail('bad_update_channel', {
|
|
479
|
+
status: 400,
|
|
480
|
+
message: `Choose one of: ${UPDATE_CHANNELS.join(', ')} — pinned moves nothing, patch takes fixes within the same release line, minor also takes the next step up.`,
|
|
481
|
+
details: { valid: UPDATE_CHANNELS },
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
const was = updateChannelOf(inst);
|
|
485
|
+
if (was !== channel) {
|
|
486
|
+
await pool.query('UPDATE provisioning_instances SET update_channel = $2, updated_at = now() WHERE id = $1', [id, channel]);
|
|
487
|
+
const actor = require('./core-upgrade-authz').coreUpgradeActor(req);
|
|
488
|
+
await provisioning.recordEvent(pool, {
|
|
489
|
+
instanceId: id, ownerBuilderId: inst.owner_builder_id, event: 'update-channel-changed',
|
|
490
|
+
detail: `update rule changed from ${was} to ${channel}`, actor,
|
|
491
|
+
}).catch(() => {});
|
|
492
|
+
}
|
|
493
|
+
return res.json({
|
|
494
|
+
ok: true, update_channel: channel, previous: was, changed: was !== channel,
|
|
495
|
+
message: was === channel
|
|
496
|
+
? `This project already follows the '${channel}' rule — nothing changed.`
|
|
497
|
+
: `This project now follows the '${channel}' rule. What it can move to updates on the next check, within a few minutes.`,
|
|
498
|
+
});
|
|
499
|
+
} catch (err) {
|
|
500
|
+
log.error('[provisioning] POST /provisioning/instances/:id/update-channel', err);
|
|
501
|
+
return failFrom(res, err, 'update_channel_failed');
|
|
502
|
+
}
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
module.exports = { UPDATE_CHANNELS, DEFAULT_UPDATE_CHANNEL, updateChannelOf, makeUpdateChannelHandler, CORE_UPGRADE_FROM, lastCoreMove, lastMoveSuperseded, parseRepoNote, preflightForOffer, UPGRADE_SHAPES, VERSION_RE, isCoreVersion, coreUpgradeFault, enqueueCoreUpgrade, makeCoreUpgradeHandler, previewFromSnapshot, makeCoreUpgradePreviewHandler, makeControlPlaneHandler };
|
|
433
507
|
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
-- provisioning_029_update_channel.sql — each project's own core update rule (task 1004445).
|
|
2
|
+
--
|
|
3
|
+
-- WHY. The deploy runner bounded every project by the platform default (update-channel.js
|
|
4
|
+
-- DEFAULT_CHANNEL, patch-only), because nothing per-project existed to read. So a step-up
|
|
5
|
+
-- release (1.19.x -> 1.20.0) could never reach ANY project through the deploy door: the
|
|
6
|
+
-- runner refused it with "outside this project's 'patch' update channel ... Change the
|
|
7
|
+
-- channel first", and there was no channel anywhere to change. This column is that channel.
|
|
8
|
+
--
|
|
9
|
+
-- Values are update-channel.js VALID_CHANNELS: pinned (the door moves nothing), patch
|
|
10
|
+
-- (same major.minor — the old behaviour, hence the default), minor (any higher minor within
|
|
11
|
+
-- the major). A major bump is never admitted by any channel. The CHECK mirrors the list so a
|
|
12
|
+
-- hand-written UPDATE cannot store a value the runner would silently normalise away.
|
|
13
|
+
--
|
|
14
|
+
-- Additive and namespaced (ADR 0083): no down-migration, idempotent — safe to re-run.
|
|
15
|
+
|
|
16
|
+
BEGIN;
|
|
17
|
+
|
|
18
|
+
ALTER TABLE provisioning_instances ADD COLUMN IF NOT EXISTS update_channel text NOT NULL DEFAULT 'patch';
|
|
19
|
+
|
|
20
|
+
ALTER TABLE provisioning_instances DROP CONSTRAINT IF EXISTS provisioning_instances_update_channel_check;
|
|
21
|
+
ALTER TABLE provisioning_instances ADD CONSTRAINT provisioning_instances_update_channel_check
|
|
22
|
+
CHECK (update_channel IN ('pinned', 'patch', 'minor'));
|
|
23
|
+
|
|
24
|
+
COMMIT;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
-- provisioning_030_intent_failure_class.sql — WHAT KIND of failure stopped an intent
|
|
2
|
+
-- (task 1004446, goal 1000090 deploy self-heal).
|
|
3
|
+
--
|
|
4
|
+
-- WHY. A failed core move was one sentence in last_error, and every non-zero exit read
|
|
5
|
+
-- "failed and was rolled back" — a refusal that changed nothing, a real rollback, and a
|
|
6
|
+
-- rollback that itself failed were indistinguishable to the runner and to the page. These
|
|
7
|
+
-- two columns carry scripts/gds/upgrade-outcome.js's classification beside the sentence:
|
|
8
|
+
--
|
|
9
|
+
-- failure_class transient | known_wedge | needs_decision | unknown — what the runner
|
|
10
|
+
-- may do about it (retry later, fix it itself, ask the owner, ask a person)
|
|
11
|
+
-- failure_reason a fixed reason code (dirty_tree, outside_channel, rollback_failed, …) —
|
|
12
|
+
-- vocabulary only, never free text, so it is safe to index and to show
|
|
13
|
+
--
|
|
14
|
+
-- NULL on both means "not a classified failure": a done intent, a pending one, or a row
|
|
15
|
+
-- written before this migration. Written by the drain loop (scripts/gds/provision.js).
|
|
16
|
+
--
|
|
17
|
+
-- Additive and namespaced (ADR 0083): no down-migration, idempotent — safe to re-run.
|
|
18
|
+
|
|
19
|
+
BEGIN;
|
|
20
|
+
|
|
21
|
+
ALTER TABLE provisioning_intents ADD COLUMN IF NOT EXISTS failure_class text;
|
|
22
|
+
ALTER TABLE provisioning_intents ADD COLUMN IF NOT EXISTS failure_reason text;
|
|
23
|
+
|
|
24
|
+
ALTER TABLE provisioning_intents DROP CONSTRAINT IF EXISTS provisioning_intents_failure_class_check;
|
|
25
|
+
ALTER TABLE provisioning_intents ADD CONSTRAINT provisioning_intents_failure_class_check
|
|
26
|
+
CHECK (failure_class IS NULL OR failure_class IN ('transient', 'known_wedge', 'needs_decision', 'unknown'));
|
|
27
|
+
|
|
28
|
+
COMMIT;
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
const express = require('express');
|
|
26
26
|
const api = require('../../../src/module-api');
|
|
27
27
|
const provisioning = require('../provisioning');
|
|
28
|
-
const { makeCoreUpgradeHandler, makeCoreUpgradePreviewHandler, makeControlPlaneHandler } = require('../core-upgrade');
|
|
28
|
+
const { makeCoreUpgradeHandler, makeCoreUpgradePreviewHandler, makeControlPlaneHandler, makeUpdateChannelHandler } = require('../core-upgrade');
|
|
29
29
|
const { requireOwnProjectOrPin } = require('../core-upgrade-authz');
|
|
30
30
|
|
|
31
31
|
const log = api.logger('provisioning');
|
|
@@ -86,6 +86,26 @@ module.exports = function buildCoreUpgradeRouter() {
|
|
|
86
86
|
makeCoreUpgradePreviewHandler({ provisioning, pool: api.pool, parseId: api.parseId, log }),
|
|
87
87
|
);
|
|
88
88
|
|
|
89
|
+
// POST /provisioning/instances/:id/update-channel — set the project's update rule
|
|
90
|
+
// (task 1004445). Body: { channel: "pinned" | "patch" | "minor" }.
|
|
91
|
+
//
|
|
92
|
+
// rank: `core.pin.move`, OR THE PROJECT'S OWN OWNER — the same two doors as the move,
|
|
93
|
+
// because the rule decides which moves the runner will perform: whoever may press
|
|
94
|
+
// Move may choose how far it reaches, and nobody else may. The platform's own row
|
|
95
|
+
// stays on the atom alone (OWNER_SHAPES excludes it), exactly as for the move.
|
|
96
|
+
router.post(
|
|
97
|
+
'/provisioning/instances/:id/update-channel',
|
|
98
|
+
api.requireBuilder,
|
|
99
|
+
requireOwnProjectOrPin({ pinGate: api.requirePermission('core.pin.move'), provisioning, pool: api.pool, log }),
|
|
100
|
+
makeUpdateChannelHandler({
|
|
101
|
+
provisioning,
|
|
102
|
+
pool: api.pool,
|
|
103
|
+
parseId: api.parseId,
|
|
104
|
+
validateOrRespond: api.validateOrRespond,
|
|
105
|
+
log,
|
|
106
|
+
}),
|
|
107
|
+
);
|
|
108
|
+
|
|
89
109
|
// GET /provisioning/control-plane — "which row is this platform, and where does it
|
|
90
110
|
// stand?" The deploy page's first call: the self row is created once by hand at
|
|
91
111
|
// install time, so its id is per-install and nobody's to memorise. The atom ALONE
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.20.
|
|
3
|
+
"version": "1.20.30",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.20.
|
|
9
|
+
"version": "1.20.30",
|
|
10
10
|
"license": "AGPL-3.0-or-later",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"express": "^4.21.2",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.20.
|
|
3
|
+
"version": "1.20.30",
|
|
4
4
|
"description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"main": "src/platform-server.js",
|
package/release-notes.json
CHANGED
|
@@ -8240,5 +8240,17 @@
|
|
|
8240
8240
|
"id": "1002969",
|
|
8241
8241
|
"text": "An invitation to join a project now expires after 30 days; the person who sent it can simply invite again."
|
|
8242
8242
|
}
|
|
8243
|
+
],
|
|
8244
|
+
"1.20.29": [
|
|
8245
|
+
{
|
|
8246
|
+
"id": "1004445",
|
|
8247
|
+
"text": "Each project now has its own update rule. A project can be allowed to take bigger step-up updates (like 1.19 to 1.20) instead of being stuck on small fixes only, and its owner can change the rule."
|
|
8248
|
+
}
|
|
8249
|
+
],
|
|
8250
|
+
"1.20.30": [
|
|
8251
|
+
{
|
|
8252
|
+
"id": "1004446",
|
|
8253
|
+
"text": "When a software update fails, the system now records what kind of failure it was — a temporary glitch, a known snag, a rule only the owner can change, or something unknown — and tells the truth about it instead of always sayin"
|
|
8254
|
+
}
|
|
8243
8255
|
]
|
|
8244
8256
|
}
|