@bongos/core 1.19.562 → 1.19.563
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 +56 -31
- 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 +3 -0
- package/clients/bongos-client/index.mjs +2 -0
- package/docs/adr/0251-a-suggestion-of-who-to-invite-is-a-recruiting-surface-and-owes-the-opt-out.md +79 -0
- package/docs/adr/README.md +1 -0
- package/docs/api/openapi.json +69 -3
- package/docs/api-reference.md +3 -2
- package/docs/copy-inventory.md +127 -127
- package/docs/copy-registry.json +162 -162
- package/docs/module-api-changelog.md +2 -0
- package/modules/dev-box/app/src/vendor/bongos-client.cjs +2 -0
- package/modules/lifecycle/db-versions.js +22 -0
- package/modules/lifecycle/db.js +2 -1
- package/modules/lifecycle/routes/version-route-authz.js +56 -0
- package/modules/lifecycle/routes/versions.js +22 -0
- package/modules/platform-identity/invite-suggestions.js +57 -0
- package/modules/platform-identity/routes/sso.js +8 -0
- package/modules/provisioning/routes/provisioning.js +56 -0
- package/modules/public-landing/public/assets/cosmos.css +16 -0
- package/modules/public-landing/public/projects.html +85 -3
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/src/module-api.js +1 -1
- package/tests/one_planning_version.mjs +161 -0
- package/tests/project_invite_suggestions.mjs +133 -0
- package/tests/project_invite_ui.mjs +171 -18
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.19.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.19.563",
|
|
6
|
+
"core_contract": "1.19.563",
|
|
7
|
+
"source_commit": "c8dc8ef54a7fd97c2ba21c436f6c1faf0a125f0f",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-06T17:
|
|
9
|
+
"built_at": "2026-09-06T17:53:15.785Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
|
-
"docs_redacted":
|
|
12
|
+
"docs_redacted": 444,
|
|
13
13
|
"agent_docs_stubbed": 24,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 2029,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 2497,
|
|
20
|
+
"tree_sha256": "d705f290c86bc4240b5cd119cb250092b6b2d7af6d8ffc8e870dd1f0ae6cdef3",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -372,12 +372,12 @@
|
|
|
372
372
|
{
|
|
373
373
|
"path": "clients/bongos-client/README.md",
|
|
374
374
|
"mode": "0000644",
|
|
375
|
-
"sha256": "
|
|
375
|
+
"sha256": "38988a49c2cdcc89db69602de1fe46cba0de430643c677352b9db36ed89c010c"
|
|
376
376
|
},
|
|
377
377
|
{
|
|
378
378
|
"path": "clients/bongos-client/bongos-client.global.js",
|
|
379
379
|
"mode": "0000644",
|
|
380
|
-
"sha256": "
|
|
380
|
+
"sha256": "bd7d31e9cff0d758cc66c1d4adcf52eeaa99acc2ef48d459265425e2a4d2fd19"
|
|
381
381
|
},
|
|
382
382
|
{
|
|
383
383
|
"path": "clients/bongos-client/examples/hello-world.mjs",
|
|
@@ -387,17 +387,17 @@
|
|
|
387
387
|
{
|
|
388
388
|
"path": "clients/bongos-client/index.cjs",
|
|
389
389
|
"mode": "0000644",
|
|
390
|
-
"sha256": "
|
|
390
|
+
"sha256": "33fbbbaf2a4a939b7351a7aa25264ddd609c1298d9ba809372a162983afe5038"
|
|
391
391
|
},
|
|
392
392
|
{
|
|
393
393
|
"path": "clients/bongos-client/index.d.ts",
|
|
394
394
|
"mode": "0000644",
|
|
395
|
-
"sha256": "
|
|
395
|
+
"sha256": "a0992ef72cffc0d200e62bd5315e64090eda7cbd3477a01ec041e2d08bb39b9e"
|
|
396
396
|
},
|
|
397
397
|
{
|
|
398
398
|
"path": "clients/bongos-client/index.mjs",
|
|
399
399
|
"mode": "0000644",
|
|
400
|
-
"sha256": "
|
|
400
|
+
"sha256": "e83e49178398441026fe6fd4822dd4eddae2c2316f5aa5006a090ef0d1a41b98"
|
|
401
401
|
},
|
|
402
402
|
{
|
|
403
403
|
"path": "clients/bongos-client/package.json",
|
|
@@ -1769,20 +1769,25 @@
|
|
|
1769
1769
|
"mode": "0000644",
|
|
1770
1770
|
"sha256": "da4549c19609d1f549e6f5a57b530c330765f1778f0a9b09a15a208f4575f986"
|
|
1771
1771
|
},
|
|
1772
|
+
{
|
|
1773
|
+
"path": "docs/adr/0251-a-suggestion-of-who-to-invite-is-a-recruiting-surface-and-owes-the-opt-out.md",
|
|
1774
|
+
"mode": "0000644",
|
|
1775
|
+
"sha256": "8ccfe21df7ab80ed872565bc879fb21a1b35ce81da55151035f2dc45cd40e749"
|
|
1776
|
+
},
|
|
1772
1777
|
{
|
|
1773
1778
|
"path": "docs/adr/README.md",
|
|
1774
1779
|
"mode": "0000644",
|
|
1775
|
-
"sha256": "
|
|
1780
|
+
"sha256": "6d7f0b67401ca836ed08f5cea31ea578c10987718de48fecc0ac663528e9403d"
|
|
1776
1781
|
},
|
|
1777
1782
|
{
|
|
1778
1783
|
"path": "docs/api-reference.md",
|
|
1779
1784
|
"mode": "0000644",
|
|
1780
|
-
"sha256": "
|
|
1785
|
+
"sha256": "ae645afb5ce376b7e7b4ad0a5c00f63e48a2d0540fe79af29106d174a41ac3e8"
|
|
1781
1786
|
},
|
|
1782
1787
|
{
|
|
1783
1788
|
"path": "docs/api/openapi.json",
|
|
1784
1789
|
"mode": "0000644",
|
|
1785
|
-
"sha256": "
|
|
1790
|
+
"sha256": "a009aa37bc7698ac1469b45ac875b1b3884c0104b7f8a886e450082d503de45c"
|
|
1786
1791
|
},
|
|
1787
1792
|
{
|
|
1788
1793
|
"path": "docs/architecture.md",
|
|
@@ -1807,12 +1812,12 @@
|
|
|
1807
1812
|
{
|
|
1808
1813
|
"path": "docs/copy-inventory.md",
|
|
1809
1814
|
"mode": "0000644",
|
|
1810
|
-
"sha256": "
|
|
1815
|
+
"sha256": "375801be3c0c325da208e3f95fb6aa04e5a0136297673a562d143f61e4ca4c83"
|
|
1811
1816
|
},
|
|
1812
1817
|
{
|
|
1813
1818
|
"path": "docs/copy-registry.json",
|
|
1814
1819
|
"mode": "0000644",
|
|
1815
|
-
"sha256": "
|
|
1820
|
+
"sha256": "5a2ff67ac4a1cf8edf959b02db2a1c226de24c16a8b7b98762cfc1863d1a8f52"
|
|
1816
1821
|
},
|
|
1817
1822
|
{
|
|
1818
1823
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2657,7 +2662,7 @@
|
|
|
2657
2662
|
{
|
|
2658
2663
|
"path": "docs/module-api-changelog.md",
|
|
2659
2664
|
"mode": "0000644",
|
|
2660
|
-
"sha256": "
|
|
2665
|
+
"sha256": "f13bd014e6a89aefd27dbfbaf639b7c3f3e8b90c3adb69cedfb6a0b11b0d3daf"
|
|
2661
2666
|
},
|
|
2662
2667
|
{
|
|
2663
2668
|
"path": "docs/modules-contract.md",
|
|
@@ -4057,7 +4062,7 @@
|
|
|
4057
4062
|
{
|
|
4058
4063
|
"path": "modules/dev-box/app/src/vendor/bongos-client.cjs",
|
|
4059
4064
|
"mode": "0000644",
|
|
4060
|
-
"sha256": "
|
|
4065
|
+
"sha256": "33fbbbaf2a4a939b7351a7aa25264ddd609c1298d9ba809372a162983afe5038"
|
|
4061
4066
|
},
|
|
4062
4067
|
{
|
|
4063
4068
|
"path": "modules/dev-box/app/test/unit.mjs",
|
|
@@ -5467,12 +5472,12 @@
|
|
|
5467
5472
|
{
|
|
5468
5473
|
"path": "modules/lifecycle/db-versions.js",
|
|
5469
5474
|
"mode": "0000644",
|
|
5470
|
-
"sha256": "
|
|
5475
|
+
"sha256": "9f777643c44ebeef8b668a8120bf74d369564f904b2cb1aff54711bd5825c9c5"
|
|
5471
5476
|
},
|
|
5472
5477
|
{
|
|
5473
5478
|
"path": "modules/lifecycle/db.js",
|
|
5474
5479
|
"mode": "0000644",
|
|
5475
|
-
"sha256": "
|
|
5480
|
+
"sha256": "c6ab8ace534687d1989e4b192809a373294e539f7fb8624f512fda4ceea884ba"
|
|
5476
5481
|
},
|
|
5477
5482
|
{
|
|
5478
5483
|
"path": "modules/lifecycle/dead-deps.js",
|
|
@@ -5704,10 +5709,15 @@
|
|
|
5704
5709
|
"mode": "0000644",
|
|
5705
5710
|
"sha256": "366cb9c60952539ab8a946f8cf757754163b6cd6764a6430777b4529c86c6a75"
|
|
5706
5711
|
},
|
|
5712
|
+
{
|
|
5713
|
+
"path": "modules/lifecycle/routes/version-route-authz.js",
|
|
5714
|
+
"mode": "0000644",
|
|
5715
|
+
"sha256": "5db4f94ca52f634f41cdb489572e43eb6785744220d2565a716cff47bfa72b30"
|
|
5716
|
+
},
|
|
5707
5717
|
{
|
|
5708
5718
|
"path": "modules/lifecycle/routes/versions.js",
|
|
5709
5719
|
"mode": "0000644",
|
|
5710
|
-
"sha256": "
|
|
5720
|
+
"sha256": "a825191c1ef406ec4c0eb9455df5b65c5ecf25e23d2b9a9f78eeeae424fa2bf6"
|
|
5711
5721
|
},
|
|
5712
5722
|
{
|
|
5713
5723
|
"path": "modules/lifecycle/routes/visuals.js",
|
|
@@ -5904,6 +5914,11 @@
|
|
|
5904
5914
|
"mode": "0000644",
|
|
5905
5915
|
"sha256": "2eb5577450d3bc1d67b7eab9a13256889aca945c6ac6a6a0ca919e195952b7a1"
|
|
5906
5916
|
},
|
|
5917
|
+
{
|
|
5918
|
+
"path": "modules/platform-identity/invite-suggestions.js",
|
|
5919
|
+
"mode": "0000644",
|
|
5920
|
+
"sha256": "4fc8c9642e415b3dd0bc69968f6870fa9239f67f5cd5e93a301a9d8b53bd5c61"
|
|
5921
|
+
},
|
|
5907
5922
|
{
|
|
5908
5923
|
"path": "modules/platform-identity/migrations/platform_identity_001_tables.sql",
|
|
5909
5924
|
"mode": "0000644",
|
|
@@ -6072,7 +6087,7 @@
|
|
|
6072
6087
|
{
|
|
6073
6088
|
"path": "modules/platform-identity/routes/sso.js",
|
|
6074
6089
|
"mode": "0000644",
|
|
6075
|
-
"sha256": "
|
|
6090
|
+
"sha256": "dbc8eeab6b1911b7fdc8b29e3d10871d355d2dead926a0742e9a816a72215dba"
|
|
6076
6091
|
},
|
|
6077
6092
|
{
|
|
6078
6093
|
"path": "modules/platform-identity/scouting-authz.js",
|
|
@@ -6217,7 +6232,7 @@
|
|
|
6217
6232
|
{
|
|
6218
6233
|
"path": "modules/provisioning/routes/provisioning.js",
|
|
6219
6234
|
"mode": "0000644",
|
|
6220
|
-
"sha256": "
|
|
6235
|
+
"sha256": "60c583e1ae977c85575709abf74af7d0dc5147788509f11d1b26cad459d7b4cf"
|
|
6221
6236
|
},
|
|
6222
6237
|
{
|
|
6223
6238
|
"path": "modules/provisioning/starter-bundles.js",
|
|
@@ -6472,7 +6487,7 @@
|
|
|
6472
6487
|
{
|
|
6473
6488
|
"path": "modules/public-landing/public/assets/cosmos.css",
|
|
6474
6489
|
"mode": "0000644",
|
|
6475
|
-
"sha256": "
|
|
6490
|
+
"sha256": "51dc6eac59a85e24336597e554e84c7e76294e389b443cc40dd4e75b1684079d"
|
|
6476
6491
|
},
|
|
6477
6492
|
{
|
|
6478
6493
|
"path": "modules/public-landing/public/assets/verro-medallion.png",
|
|
@@ -6732,7 +6747,7 @@
|
|
|
6732
6747
|
{
|
|
6733
6748
|
"path": "modules/public-landing/public/projects.html",
|
|
6734
6749
|
"mode": "0000644",
|
|
6735
|
-
"sha256": "
|
|
6750
|
+
"sha256": "edc38e4ae7859c1dfc5422a4a0351c10f31cf119cab878dae0e25461c6121578"
|
|
6736
6751
|
},
|
|
6737
6752
|
{
|
|
6738
6753
|
"path": "modules/public-landing/public/projects.probes.json",
|
|
@@ -7477,12 +7492,12 @@
|
|
|
7477
7492
|
{
|
|
7478
7493
|
"path": "package-lock.json",
|
|
7479
7494
|
"mode": "0000644",
|
|
7480
|
-
"sha256": "
|
|
7495
|
+
"sha256": "feb9b3919e27637f41f78010f3a31d662da752e2c3ea56555f919fae02758cff"
|
|
7481
7496
|
},
|
|
7482
7497
|
{
|
|
7483
7498
|
"path": "package.json",
|
|
7484
7499
|
"mode": "0000644",
|
|
7485
|
-
"sha256": "
|
|
7500
|
+
"sha256": "29c0dd946891112260ed3da3ce17b036afa8019a9ca8a89defc4c291b7638d2e"
|
|
7486
7501
|
},
|
|
7487
7502
|
{
|
|
7488
7503
|
"path": "public-docs/index.html",
|
|
@@ -9182,7 +9197,7 @@
|
|
|
9182
9197
|
{
|
|
9183
9198
|
"path": "src/module-api.js",
|
|
9184
9199
|
"mode": "0000644",
|
|
9185
|
-
"sha256": "
|
|
9200
|
+
"sha256": "51c39233a591b55aa092d440634e57ef51840118b5e7d9d93784b9a6de502b29"
|
|
9186
9201
|
},
|
|
9187
9202
|
{
|
|
9188
9203
|
"path": "src/module-loader/catalog.js",
|
|
@@ -11304,6 +11319,11 @@
|
|
|
11304
11319
|
"mode": "0000644",
|
|
11305
11320
|
"sha256": "f4da7e663ab6d7b93bb02ecefd18178fa654a314da07108c4316317f50115ad0"
|
|
11306
11321
|
},
|
|
11322
|
+
{
|
|
11323
|
+
"path": "tests/one_planning_version.mjs",
|
|
11324
|
+
"mode": "0000644",
|
|
11325
|
+
"sha256": "1f8c6924dac2c922a1f88c22693b4386ec16d5f0ae346609b3d1dc0003308a70"
|
|
11326
|
+
},
|
|
11307
11327
|
{
|
|
11308
11328
|
"path": "tests/orphaned_claim_ship.mjs",
|
|
11309
11329
|
"mode": "0000644",
|
|
@@ -11469,10 +11489,15 @@
|
|
|
11469
11489
|
"mode": "0000644",
|
|
11470
11490
|
"sha256": "743436b1191353bf687d8fb553d423a6003707a25a548367644928478569f171"
|
|
11471
11491
|
},
|
|
11492
|
+
{
|
|
11493
|
+
"path": "tests/project_invite_suggestions.mjs",
|
|
11494
|
+
"mode": "0000644",
|
|
11495
|
+
"sha256": "df1c61d6db69675d979b2a053e8771a977064283280a5cc04acddb25c801def4"
|
|
11496
|
+
},
|
|
11472
11497
|
{
|
|
11473
11498
|
"path": "tests/project_invite_ui.mjs",
|
|
11474
11499
|
"mode": "0000644",
|
|
11475
|
-
"sha256": "
|
|
11500
|
+
"sha256": "36a7ff3e5b8c4b9edd495d8a7e5b50dcecded8e608f148a62b4e37841c0eb36a"
|
|
11476
11501
|
},
|
|
11477
11502
|
{
|
|
11478
11503
|
"path": "tests/project_join_door.mjs",
|
|
@@ -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
|
+
- 357 operations across 55 resource groups
|
|
9
9
|
|
|
10
10
|
## Install
|
|
11
11
|
|
|
@@ -677,6 +677,8 @@ function createClient(opts = {}) {
|
|
|
677
677
|
postProvisioningInstancesIdForceTeardown: (args) => request("POST", "/provisioning/instances/{id}/force-teardown", { hasBody: true }, args),
|
|
678
678
|
// POST /provisioning/instances/{id}/github-app — rank: any-builder — POST /provisioning/instances/:id/github-app
|
|
679
679
|
postProvisioningInstancesIdGithubApp: (args) => request("POST", "/provisioning/instances/{id}/github-app", { hasBody: true }, args),
|
|
680
|
+
// GET /provisioning/instances/{id}/invite-suggestions — rank: any-builder — GET /provisioning/instances/:id/invite-suggestions
|
|
681
|
+
getProvisioningInstancesIdInviteSuggestions: (args) => request("GET", "/provisioning/instances/{id}/invite-suggestions", { hasBody: false }, args),
|
|
680
682
|
// POST /provisioning/instances/{id}/restart — rank: any-builder — POST /provisioning/instances/:id/restart
|
|
681
683
|
postProvisioningInstancesIdRestart: (args) => request("POST", "/provisioning/instances/{id}/restart", { hasBody: true }, args),
|
|
682
684
|
// GET /provisioning/instances/{id}/settings — rank: any-builder — GET /provisioning/instances/:id/settings
|
|
@@ -676,6 +676,8 @@ function createClient(opts = {}) {
|
|
|
676
676
|
postProvisioningInstancesIdForceTeardown: (args) => request("POST", "/provisioning/instances/{id}/force-teardown", { hasBody: true }, args),
|
|
677
677
|
// POST /provisioning/instances/{id}/github-app — rank: any-builder — POST /provisioning/instances/:id/github-app
|
|
678
678
|
postProvisioningInstancesIdGithubApp: (args) => request("POST", "/provisioning/instances/{id}/github-app", { hasBody: true }, args),
|
|
679
|
+
// GET /provisioning/instances/{id}/invite-suggestions — rank: any-builder — GET /provisioning/instances/:id/invite-suggestions
|
|
680
|
+
getProvisioningInstancesIdInviteSuggestions: (args) => request("GET", "/provisioning/instances/{id}/invite-suggestions", { hasBody: false }, args),
|
|
679
681
|
// POST /provisioning/instances/{id}/restart — rank: any-builder — POST /provisioning/instances/:id/restart
|
|
680
682
|
postProvisioningInstancesIdRestart: (args) => request("POST", "/provisioning/instances/{id}/restart", { hasBody: true }, args),
|
|
681
683
|
// GET /provisioning/instances/{id}/settings — rank: any-builder — GET /provisioning/instances/:id/settings
|
|
@@ -95,6 +95,7 @@ export interface GetProjectsResponse { projects: unknown }
|
|
|
95
95
|
export interface GetProvisioningFleetResponse { instances: unknown }
|
|
96
96
|
export interface GetProvisioningGithubAppStatusResponse { ok: boolean; status: unknown; ready: unknown; terminal: unknown; domain: unknown; instance_status: unknown; app_slug: unknown }
|
|
97
97
|
export interface GetProvisioningHealthResponse { module: unknown; ok: boolean; coreVersion: unknown }
|
|
98
|
+
export interface GetProvisioningInstancesIdInviteSuggestionsResponse { suggested: unknown; seeking: unknown; reason: unknown; unavailable?: unknown }
|
|
98
99
|
export interface GetProvisioningInstancesIdResponse { instance: unknown; open_intent: unknown; github_app: unknown }
|
|
99
100
|
export interface GetProvisioningInstancesIdSettingsResponse { ok: boolean; settings: unknown; planet: unknown; options: unknown }
|
|
100
101
|
export interface GetProvisioningInstancesResponse { instances: unknown }
|
|
@@ -1000,6 +1001,8 @@ export interface BongosClient {
|
|
|
1000
1001
|
postProvisioningInstancesIdForceTeardown(args?: RequestArgs): Promise<PostProvisioningInstancesIdForceTeardownResponse>;
|
|
1001
1002
|
/** POST /provisioning/instances/{id}/github-app — rank: any-builder */
|
|
1002
1003
|
postProvisioningInstancesIdGithubApp(args?: RequestArgs & { body?: PostProvisioningInstancesIdGithubAppRequest }): Promise<PostProvisioningInstancesIdGithubAppResponse>;
|
|
1004
|
+
/** GET /provisioning/instances/{id}/invite-suggestions — rank: any-builder */
|
|
1005
|
+
getProvisioningInstancesIdInviteSuggestions(args?: RequestArgs): Promise<GetProvisioningInstancesIdInviteSuggestionsResponse>;
|
|
1003
1006
|
/** POST /provisioning/instances/{id}/restart — rank: any-builder */
|
|
1004
1007
|
postProvisioningInstancesIdRestart(args?: RequestArgs): Promise<PostProvisioningInstancesIdRestartResponse>;
|
|
1005
1008
|
/** GET /provisioning/instances/{id}/settings — rank: any-builder */
|
|
@@ -673,6 +673,8 @@ export function createClient(opts = {}) {
|
|
|
673
673
|
postProvisioningInstancesIdForceTeardown: (args) => request("POST", "/provisioning/instances/{id}/force-teardown", { hasBody: true }, args),
|
|
674
674
|
// POST /provisioning/instances/{id}/github-app — rank: any-builder — POST /provisioning/instances/:id/github-app
|
|
675
675
|
postProvisioningInstancesIdGithubApp: (args) => request("POST", "/provisioning/instances/{id}/github-app", { hasBody: true }, args),
|
|
676
|
+
// GET /provisioning/instances/{id}/invite-suggestions — rank: any-builder — GET /provisioning/instances/:id/invite-suggestions
|
|
677
|
+
getProvisioningInstancesIdInviteSuggestions: (args) => request("GET", "/provisioning/instances/{id}/invite-suggestions", { hasBody: false }, args),
|
|
676
678
|
// POST /provisioning/instances/{id}/restart — rank: any-builder — POST /provisioning/instances/:id/restart
|
|
677
679
|
postProvisioningInstancesIdRestart: (args) => request("POST", "/provisioning/instances/{id}/restart", { hasBody: true }, args),
|
|
678
680
|
// GET /provisioning/instances/{id}/settings — rank: any-builder — GET /provisioning/instances/:id/settings
|
package/docs/adr/0251-a-suggestion-of-who-to-invite-is-a-recruiting-surface-and-owes-the-opt-out.md
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# ADR 0251 — A suggestion of who to invite is a recruiting surface, and owes the recruiting opt-out
|
|
2
|
+
|
|
3
|
+
- **Status:** accepted
|
|
4
|
+
- **Date:** 2026-09-06
|
|
5
|
+
- **Task:** [task 1002347](https://cloudbongos.com/builders#/task/1002347) (BONGOS-V1, goal 1000046 — *Project creation*, criterion `proj-invite-builders` / C6), BV1.R28
|
|
6
|
+
- **Deciders:** Claude, under the Archon's standing scope
|
|
7
|
+
- **Depends on:** [ADR 0239](<redacted>.md) §6 (the seam this fills: the engine emits `invites.seeking` and names R28 as its reader) · [ADR 0249](<redacted>.md) (the widget these names arrive in, and its "only door in" rule) · [ADR 0083](<redacted>.md) (the one-way import rule that makes this a port)
|
|
8
|
+
- **Related:** [ADR 0210](<redacted>.md) (the `/scouting` gate this route deliberately does **not** reuse) · [ADR 0248](<redacted>.md) (the ownership fact the invite route already admits on) · [ADR 0016](<redacted>.md) (a surface never re-derives a server rule)
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Context
|
|
13
|
+
|
|
14
|
+
[ADR 0239](<redacted>.md) §6 left one recommendation deliberately unfinished. The creation wizard's rule engine emits, per team shape, a **seek** rather than a list:
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
solo → seeking: null ("suggest nobody", a real answer)
|
|
18
|
+
small-team → seeking: { kind: 'top-builders', limit: 3 }
|
|
19
|
+
community → seeking: { kind: 'top-builders', limit: 5 }
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`invites.suggested` is always `[]` there, and a test pins that emptiness as a decision rather than a gap. The engine is a pure file that may run no query; ranking builders is a directory read; and `provisioning` may not import a sibling module. So the engine states *what to look for* and R28 — this ADR — turns it into names.
|
|
23
|
+
|
|
24
|
+
That leaves one genuinely open question, and it is not an architectural one: **which directory?**
|
|
25
|
+
|
|
26
|
+
## The decision that matters: the recruiting directory, not the leaderboard
|
|
27
|
+
|
|
28
|
+
Two readers could answer "who are the top builders", and they differ by exactly one SQL predicate:
|
|
29
|
+
|
|
30
|
+
| reader | lives in | consent |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| `leaderboard()` | `economy` | joins `rollupVisibleSql` — **honours no recruiting opt-out**, on purpose |
|
|
33
|
+
| `listScoutingRollup()` | `platform-identity` | joins `scoutingListableSql` — **the opt-out is inside the query** |
|
|
34
|
+
|
|
35
|
+
The leaderboard is the cheaper answer in every mechanical sense: it is an explicitly public read route, it needs no port, and a browser could call it directly with no new server code at all.
|
|
36
|
+
|
|
37
|
+
**We use the scouting rollup anyway, because the opt-out means this exact screen.** `account-visibility.js` states the split in its own words — `hide_stats` suppresses *numbers* everywhere, while the recruiting opt-out "removes an account from the RECRUITING SURFACE only", and the community spec's D3 says the opt-out "does not affect leaderboards; it governs the recruiting surface only". A list of people the platform is proposing you recruit into your project **is** the recruiting surface. Sourcing it from the leaderboard would not be a shortcut around some incidental gate; it would route around the one control that exists for precisely this case, and hand an owner the name of every builder who asked not to be recruited.
|
|
38
|
+
|
|
39
|
+
The rule this fixes for later readers: **the cheapness of a public read is not an argument about who consented to appear in it.** `listScoutingRollup`'s own header already warns in the other direction ("a public LEADERBOARD must not reuse this reader"); this is the same boundary approached from the other side.
|
|
40
|
+
|
|
41
|
+
## Where the lookup lives, and why it is a port
|
|
42
|
+
|
|
43
|
+
`modules/platform-identity` gets a new function, `listInviteSuggestions`, exposed on the existing `platform-identity.hub` port. `modules/provisioning` reaches it with `resolveOptional` — the `catalog-bridge.js` precedent, and **not** declared in `consumes`: platform-identity is hub-only (`default: false`), so an instance running provisioning without it has no directory to ask and the honest answer is "no suggestions", never a 500.
|
|
44
|
+
|
|
45
|
+
Two things are enforced inside the module rather than asked of callers:
|
|
46
|
+
|
|
47
|
+
1. **`github_id` does not cross the port.** The projection is an explicit whitelist — login, display name, avatar, disciplines, and two counts. The invite route takes a *login*; the id names someone who has accepted nothing, and the surface already has a test forbidding it on screen. An explicit whitelist also means a new column on the rollup cannot leak by default.
|
|
48
|
+
2. **The exclusion is applied inside.** A caller passes the ids to drop (in practice the owner's own) and gets back rows with no ids in them, so dropping yourself from your own list never requires holding one. The read is over-fetched by the exclusion count so filtering can never return short of the limit.
|
|
49
|
+
|
|
50
|
+
## The gate is the one that already exists
|
|
51
|
+
|
|
52
|
+
`GET /provisioning/instances/:id/invite-suggestions` is own-scoped by `instanceAccessDenied` — the same gate, and the same **404**, as the manage-page read beside it.
|
|
53
|
+
|
|
54
|
+
It deliberately does **not** reuse `/scouting`'s gate (`project.curate` or a hub-witnessed `membership_kind='owner'`). A brand-new owner has no witnessed owner-membership row at the moment the done panel paints — that row is written later, by the child instance at SSO check-in — so the correct-looking gate would refuse the exact caller the feature exists for.
|
|
55
|
+
|
|
56
|
+
Reaching this route **is** the ownership answer ([ADR 0249](<redacted>.md) §4), so the surface re-derives nothing and cannot become a weaker second copy of a server rule ([ADR 0016](<redacted>.md)). 404 rather than 403 keeps it leaking no more instance existence than its neighbour.
|
|
57
|
+
|
|
58
|
+
## What the surface does with the answer
|
|
59
|
+
|
|
60
|
+
The widget keeps its shape from [ADR 0249](<redacted>.md): it still answers neither "is anyone signed in" nor "is this their project", and gains a **second door in** (`setInviteSuggestions`) beside `setInviteSlug` rather than learning to fetch for itself.
|
|
61
|
+
|
|
62
|
+
- **The reason is always said, including when the answer is nobody.** `seeking: null` returns its own sentence and never touches the directory. A solo owner is suggested nobody *on purpose*, and rendering that as an empty list would turn a stated answer into what looks like a failed lookup.
|
|
63
|
+
- **A picked name takes the same write path as a typed one** — it fills the field and calls `doInvite`. One write path means the refusal vocabulary, the busy guard and the pending receipt cannot drift into a second copy.
|
|
64
|
+
- **A filed invite stops being a suggestion.** The pending line is its receipt; offering the same person twice invites a refusal the owner cannot act on.
|
|
65
|
+
- **Every failure is silent.** A suggestion is an extra, and a project that was just created successfully must never look broken because an optional directory read did not answer.
|
|
66
|
+
|
|
67
|
+
## Consequences
|
|
68
|
+
|
|
69
|
+
- A builder who opted out of recruiting is **absent from suggestions while still ranking on the leaderboard**. That is the opt-out working, not a bug — but it does mean the suggested names and the leaderboard's top names legitimately differ, and anyone comparing the two screens should expect that.
|
|
70
|
+
- Suggestions are **hub-only**. An instance without `platform-identity` gets `unavailable: 'no_directory'` and an empty list; the step still works for typed logins.
|
|
71
|
+
- `invites.suggested` stays `[]` in the pure engine forever. The filling happens one layer out, so ADR 0239's test still passes unchanged and the engine stays I/O-free.
|
|
72
|
+
- Guilds are still out (task 1002348, blocked on goal 1000045). `seeking.kind` is already a discriminator, so a `guilds` kind is an added branch rather than a reshaping.
|
|
73
|
+
|
|
74
|
+
## Rejected
|
|
75
|
+
|
|
76
|
+
- **Read the economy leaderboard from the browser.** Cheapest by far and needs no server code — rejected on consent, above. This is the whole decision.
|
|
77
|
+
- **Reuse `GET /scouting`.** The right data behind a gate that refuses the caller this feature is for.
|
|
78
|
+
- **Fill `invites.suggested` inside `recommendationsForDetails`.** Would make a pure, synchronous, dependency-free file do I/O and import a sibling module — the two things ADR 0239 §6 and ADR 0083 respectively forbid.
|
|
79
|
+
- **A `provisioning → economy` port for the leaderboard.** Architecturally legal and still the wrong directory; the boundary was never the objection.
|
package/docs/adr/README.md
CHANGED
|
@@ -338,6 +338,7 @@ This keeps the decision history honest and traceable.
|
|
|
338
338
|
|
|
339
339
|
| 0249 | [**The invite step is the done panel’s first act, not a rail step — and the same widget is the way back** ([task 1002346](https://cloudbongos.com/builders#/task/1002346) · goal 1000046, criterion `proj-invite-builders` / C6). BV1.R27 asks for a skippable invite step *in creation*, but an invite cannot be one of the wizard’s numbered panels: `POST /projects/invite` takes `{ client_id, github_login }` where `client_id` **is the slug**, and per [ADR 0246](<redacted>.md) the catalog row that slug resolves is projected **at create** — so before the Create step there is nothing to invite anyone to, and a pre-Create panel could only queue names and replay them, inventing a second unaudited invite path whose failures land after the owner has left. **Decision: the step is the FIRST act of the DONE panel**, keyed on the created record (not `instanceId`, which `startProgress` sets only *after* `renderDone`), so it also returns on a resumed watch; the rail is NOT renumbered (a captured learning on this file: a renumbering couples in four places, and a step that can only run after the terminal step is not a step in the rail). The SAME widget is mounted again on the project’s own page beside *Its extras* — the [ADR 0245](<redacted>.md) argument, one implementation and two mounts, so the refusal vocabulary cannot drift. The widget answers neither “is anyone signed in” nor “is this their project”: each call site hands over a slug or nothing (the created record; the own-scoped manage read that 404s for everyone else), because a page that re-derived ownership would be a second, weaker copy of a server rule. **The 403 is quoted carefully and that is the point** — [ADR 0248](<redacted>.md) paid two equalised reads per request to make the refusal identical for a real, stealth, absent or malformed target ([ADR 0182](<redacted>.md) D2a), and “you lack permission on **this project**” would assert in copy the existence the route refuses to confirm, so the page says only “this account can’t invite people here” and a test pins that wording. `account_not_found` and `unknown_project` are said in the route’s own words (the latter as a moment, not a dead end — the row is projected at create); anything else falls through to the server’s own message. The pending line is drawn from the 201 row’s `membership_kind` and the typed login — **never the `github_id`** it carries, which names someone who has accepted nothing yet. Creation is never blocked: the project is filed before the step is shown, so every refusal leaves it created and the step re-tryable, and Skip sends nothing. Rejected: a rail step before or after Create; the manage page alone (R27 asks for it *in creation*); reading the real membership directory back (no own-scoped route exists, and the session receipt is honest about being one).](<redacted>.md) | provisioning / project creation |
|
|
340
340
|
| 0250 | [**Strict versioning — the version boundary is the scope gate** ([task 1003589](https://cloudbongos.com/builders#/task/1003589) · goal 1000086). The work hierarchy ([ADR 0086](<redacted>.md)) has a bottom and no top: tasks close, criteria close, goals close, and a version never does. Measured live — **14 goals reading `achieved`/`archived` while holding 35 unfinished tasks**, 523 open tasks across 37 open goals, and **two versions `building` on one project**; every number was worse than the planning session had recorded two days earlier, which is the argument: the drift is the steady state, not a backlog. The cause is four mechanical gaps, not a social one — `POST /goals` fetches the version row and never reads its `status`; goal achievement is computed from criteria alone and never consults `tasks` (both the `db-goals.js` writer and the `done-when.js` cascade); `POST /goals/:id/archive` checks nothing at all; and no route ships a version, so version status has only ever moved as hand-run SQL on the droplet. **Decision, five rules:** the goal set closes when a version starts `building` (new goals go on the `planning` version — where the next version is scoped in advance) with a named 409 an agent can act on; a goal reaches `achieved` only when its criteria are satisfied **and** no task in it is non-terminal, where terminal is `shipped`|`abandoned` per [task 1003588](https://cloudbongos.com/builders#/task/1003588)'s one vocabulary and the mid-ship `completed`/`confirmed` hold it open; archiving a goal that holds open tasks refuses until the caller dispositions each (abandon with the reason, or move to a named surviving goal); `goal_id` becomes required and the per-version catch-all fallback is deleted; and exactly one version builds per project, auto-closing when its last non-maintenance goal achieves, with the single `planning` version promoting itself so the project is never without a live train. **The escape hatches are deliberate and visible**: an Archon may admit one *named* goal to a building version with a reason, and the overrides are counted on the version (the standard failure of a hard scope gate is a fake hotfix version cut to hold what did not fit — an untraced override is just a slower version of no rule); plus one auto-created maintenance goal per version, exempt from the auto-close count, so bugs never need an override to be filed. **Nothing here can refuse a ship, a claim, or a task** — every rule acts on a *closing* move. Rejected: counting `completed`/`confirmed` as finished (they can fail a grade or strand — the goals **board** buckets them as done, but that is a progress ring, and `task-status.js` keeps the two questions apart); a nightly reconciler that reopens wrongly-closed goals (detection is what you build when prevention is unavailable, and it is available here); a human review gate before a goal may close (the queue [ADR 0183](<redacted>.md) dismantled — the check is a fact the table already holds); concurrent building versions scoped by module (two live trains means every "what is in this version" question has two answers); retiring versions entirely (the version is the unit the owner sets scope in and `limitations/<version>-shipped.md` archives). **Amends [ADR 0157](<redacted>.md) for exactly one key:** `version.create` returns to the Archon floor. 0157's "authoring delegates, disposition does not" was right about what a version *was* — but once the boundary carries the scope gate, cutting a new version is no longer authoring, it is the way *around* the gate, so create joins close as a disposition over scope.](<redacted>.md) | lifecycle / versioning / scope |
|
|
341
|
+
| 0251 | [**A suggestion of who to invite is a recruiting surface, and owes the recruiting opt-out** ([task 1002347](https://cloudbongos.com/builders#/task/1002347) · goal 1000046, criterion `proj-invite-builders` / C6). BV1.R28 fills the seam [ADR 0239](<redacted>.md) §6 left open: the wizard’s pure rule engine emits a **seek** (`solo` → `null`, `small-team` → 3, `community` → 5) and never a list, because ranking builders is a directory read a pure file may not run and `provisioning` may not import a sibling. Two readers could answer “who are the top builders” and they differ by **one SQL predicate**: `economy`’s `leaderboard()` joins `rollupVisibleSql` and deliberately honours **no** recruiting opt-out, while `platform-identity`’s `listScoutingRollup()` joins `scoutingListableSql`, which carries it. The leaderboard is cheaper in every mechanical sense — already a public route, no port, callable straight from the browser. **Decision: use the recruiting directory anyway**, because `account-visibility.js` says the split in its own words (`hide_stats` suppresses *numbers* everywhere; the recruiting opt-out “removes an account from the RECRUITING SURFACE only”, community spec D3), and a list of people the platform proposes you recruit **is** that surface — sourcing it from the leaderboard would route around the one control built for this exact case and name every builder who asked not to be recruited. The rule for later readers: **the cheapness of a public read is not an argument about who consented to appear in it.** The lookup ships as `listInviteSuggestions` on the existing `platform-identity.hub` port, reached with `resolveOptional` and NOT declared in `consumes` (the `catalog-bridge.js` precedent — platform-identity is hub-only, so its absence is “no suggestions”, never a 500); `github_id` **does not cross the port** (explicit whitelist — login, display name, avatar, disciplines, two counts — so a new rollup column cannot leak by default), and the owner-exclusion is applied inside, over-read by the exclusion count so filtering never returns short. The route `GET /provisioning/instances/:id/invite-suggestions` is own-scoped by the **existing** `instanceAccessDenied` (same 404 as the manage read) and deliberately does NOT reuse `/scouting`’s gate ([ADR 0210](<redacted>.md)): a brand-new owner has no hub-witnessed owner row at the moment the done panel paints, so the correct-looking gate would refuse the exact caller the feature exists for — and reaching the route IS the ownership answer ([ADR 0249](<redacted>.md) §4). On the surface: a **second door in** (`setInviteSuggestions`) beside `setInviteSlug`, so the widget still answers neither “signed in” nor “theirs”; the reason is **always** said including when the answer is nobody (`seeking: null` costs no query — rendering a stated answer as an empty list would make it look like a failed lookup); a picked name fills the field and takes the **same write path** as a typed one, so the refusal vocabulary cannot fork; a filed invite stops being a suggestion; and every failure is silent, because a suggestion is an extra and a just-created project must not look broken over one. Rejected: the browser reading the economy leaderboard (the whole decision — consent, not architecture); reusing `/scouting` (right data, gate that refuses this caller); filling `invites.suggested` inside the engine (I/O in a pure file + a sibling import); a `provisioning → economy` port (legal, still the wrong directory — the boundary was never the objection).](<redacted>.md) | provisioning / platform-identity / privacy |
|
|
341
342
|
|
|
342
343
|
| 0246 | [**Catalog membership is a projection of the provisioning row, not a side effect of federation** ([task 1003576](https://cloudbongos.com/builders#/task/1003576) · goal 1000046, criterion `proj-detail-interview` / C3). The BV1.R18 proof ([task 1002337](https://cloudbongos.com/builders#/task/1002337)) demonstrated C3 against live and found its last clause — “then it publishes” — structurally false: the owner’s verdict reads `provisioning_instances` while the public map reads `platform_identity_projects`, and the ONLY bridge was `federateInstance → registerClient → upsertProject`, which `shouldFederate` refuses for anything but `co-tenant` (the wizard hard-codes `standalone`) and which runs ONCE, at provision time, through a COALESCE. So a wizard-made project was never catalogued at all and a co-tenant one that answered later never updated — `publishable: true`, `{"projects": []}`, forever. The same missing row is [task 1003580](https://cloudbongos.com/builders#/task/1003580)’s GAP 1: `POST /projects/invite` resolves against `platform_identity_sso_clients`, whose only writer is that same `registerClient`. Underneath is one conflation — federation mints CREDENTIALS and was incidentally the only thing that minted MEMBERSHIP, while [ADR 0182](<redacted>.md) D4 already fixed the map’s gate at IDENTITY, which has nothing to do with hosting topology. **Decision: the catalog row is a PROJECTION of the provisioning row, re-derived at every write that can change its inputs** — two halves, neither sufficient alone. (1) THE ROW SHAPE: every control-plane project gets both rows whatever its hosting shape, and the client row carries NO credential (`secret_hash = ''`, `redirect_uris = '{}'`), so **the shape is the enforcement** rather than a flag a caller could forget — `redirectUriAllowed` refuses `/sso/authorize`, `clientSecretValid` refuses `/sso/token`, `/sso/membership/check-in` and `/sso/activity/rollup`, and the one leg that checked NEITHER (`/sso/device/start`, which resolves a client from a user-typed origin) grew an explicit `clientIsCredentialed` guard. (2) THE TIMING: re-taken on create, on `PATCH …/detail`, on `PATCH …/settings` when the door changes, and on `POST …/domain` (which re-keys the row, retiring the abandoned origin — [ADR 0181](0181-teardown-state-gate-and-address-retention.md) §2’s leak, in the catalog instead of DNS). **NO MIGRATION** — `secret_hash` is `NOT NULL` and `''` satisfies it while hashing to nothing. `description` and `visibility` are ASSIGNED, not COALESCEd (clearing a description must UN-publish); `featured`/`tagline`/`art_url`/`template` are curation and stay untouched, so [ADR 0182](<redacted>.md) D3 holds. It grants nothing — the row is attribution per [ADR 0238](<redacted>.md), ownership stays `provisioning_instances.owner_builder_id` — and because it writes rows keyed on owner-supplied values (a slug, a BYO domain) each write carries its **claim rule in the ON CONFLICT action’s own WHERE**: the client is refreshed only `WHERE secret_hash = ''` (a real client’s origin, which binds the CLI mint audience, can never be rewritten) and the project only `WHERE owner_github_id = EXCLUDED.owner_github_id` (`NULL = anything` is not true, so the hand-seeded rows cannot be claimed). Writing `visibility` does not contradict [ADR 0182](<redacted>.md) D5: the hub authorizes nothing — the authority already ran on the provisioning plane ([ADR 0238](<redacted>.md)’s own-scoped, audited PATCH), and a project the control plane does NOT own has no provisioning row, so D5’s instance report (R08) stays the only channel for those. `tearing_down`/`torn_down` project `hidden`; a `no_address` instance is not catalogued at all. Travels on the kernel port `project.catalog`, the `project.publishGate` seam in the other direction ([ADR 0083](<redacted>.md) forbids the import). Rejected: extending `shouldFederate` to every shape (hands a real secret to instances whose web.env the platform does not write, and keeps the once-at-standup bug); bridging only at the publish moment (leaves the invite with nothing to resolve); registering only at standup (the bug itself); a `catalog_only` boolean column (needs a migration and is weaker than the shape); letting the bridge write `featured`; and backfilling the three existing catalog rows from code.](<redacted>.md) | provisioning / project creation |
|
|
343
344
|
|
package/docs/api/openapi.json
CHANGED
|
@@ -11785,6 +11785,58 @@
|
|
|
11785
11785
|
]
|
|
11786
11786
|
}
|
|
11787
11787
|
},
|
|
11788
|
+
"/provisioning/instances/{id}/invite-suggestions": {
|
|
11789
|
+
"get": {
|
|
11790
|
+
"operationId": "get_provisioning_instances_id_invite_suggestions",
|
|
11791
|
+
"tags": [
|
|
11792
|
+
"provisioning"
|
|
11793
|
+
],
|
|
11794
|
+
"summary": "GET /provisioning/instances/:id/invite-suggestions",
|
|
11795
|
+
"description": "── Who is worth inviting (BV1.R28, task 1002347, goal 1000046 C6) ──────── GET /provisioning/instances/:id/invite-suggestions — turn the engine's `invites.seeking` into NAMES. ADR 0239 §6 left `invites.suggested` empty on purpose: ranking builders is a directory read the pure engine may not run. This is the resolution, and ADR 0251 is why it looks like this. rank: any authenticated builder, own resource — `instanceAccessDenied`, the same gate and the same 404 as the manage read above. That is deliberate and not a new authorization idea: REACHING this route IS the ownership answer (ADR 0249 §4), so the surface never re-derives \"is this theirs\" and can never become a weaker second copy of a server rule (ADR 0016). It also 404s rather than 403s, so it leaks no more instance existence than the read beside it. `seeking: null` COSTS NOTHING AND ASKS NOBODY. A solo owner is suggested nobody on purpose (ADR 0239 §6), which is a different statement from an empty list nobody filled — so that answer returns its own reason and never touches the directory at all.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
11796
|
+
"x-rank": "any-builder",
|
|
11797
|
+
"x-source": "modules/provisioning/routes/provisioning.js",
|
|
11798
|
+
"parameters": [
|
|
11799
|
+
{
|
|
11800
|
+
"name": "id",
|
|
11801
|
+
"in": "path",
|
|
11802
|
+
"required": true,
|
|
11803
|
+
"schema": {
|
|
11804
|
+
"type": "string"
|
|
11805
|
+
},
|
|
11806
|
+
"description": "Path parameter `id`."
|
|
11807
|
+
}
|
|
11808
|
+
],
|
|
11809
|
+
"responses": {
|
|
11810
|
+
"200": {
|
|
11811
|
+
"description": "Success.",
|
|
11812
|
+
"content": {
|
|
11813
|
+
"application/json": {
|
|
11814
|
+
"schema": {
|
|
11815
|
+
"$ref": "#/components/schemas/GetProvisioningInstancesIdInviteSuggestionsResponse"
|
|
11816
|
+
}
|
|
11817
|
+
}
|
|
11818
|
+
}
|
|
11819
|
+
},
|
|
11820
|
+
"400": {
|
|
11821
|
+
"$ref": "#/components/responses/BadRequest"
|
|
11822
|
+
},
|
|
11823
|
+
"401": {
|
|
11824
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
11825
|
+
},
|
|
11826
|
+
"403": {
|
|
11827
|
+
"$ref": "#/components/responses/Forbidden"
|
|
11828
|
+
},
|
|
11829
|
+
"404": {
|
|
11830
|
+
"$ref": "#/components/responses/NotFound"
|
|
11831
|
+
}
|
|
11832
|
+
},
|
|
11833
|
+
"security": [
|
|
11834
|
+
{
|
|
11835
|
+
"builderSession": []
|
|
11836
|
+
}
|
|
11837
|
+
]
|
|
11838
|
+
}
|
|
11839
|
+
},
|
|
11788
11840
|
"/provisioning/instances/{id}/restart": {
|
|
11789
11841
|
"post": {
|
|
11790
11842
|
"operationId": "post_provisioning_instances_id_restart",
|
|
@@ -17447,6 +17499,20 @@
|
|
|
17447
17499
|
"coreVersion"
|
|
17448
17500
|
]
|
|
17449
17501
|
},
|
|
17502
|
+
"GetProvisioningInstancesIdInviteSuggestionsResponse": {
|
|
17503
|
+
"type": "object",
|
|
17504
|
+
"properties": {
|
|
17505
|
+
"suggested": {},
|
|
17506
|
+
"seeking": {},
|
|
17507
|
+
"reason": {},
|
|
17508
|
+
"unavailable": {}
|
|
17509
|
+
},
|
|
17510
|
+
"required": [
|
|
17511
|
+
"suggested",
|
|
17512
|
+
"seeking",
|
|
17513
|
+
"reason"
|
|
17514
|
+
]
|
|
17515
|
+
},
|
|
17450
17516
|
"GetProvisioningInstancesIdResponse": {
|
|
17451
17517
|
"type": "object",
|
|
17452
17518
|
"properties": {
|
|
@@ -22439,9 +22505,9 @@
|
|
|
22439
22505
|
"description": "A required dependency/feature is not configured or is temporarily down."
|
|
22440
22506
|
}
|
|
22441
22507
|
},
|
|
22442
|
-
"x-endpoint-count":
|
|
22443
|
-
"x-schema-count":
|
|
22508
|
+
"x-endpoint-count": 357,
|
|
22509
|
+
"x-schema-count": 391,
|
|
22444
22510
|
"x-undocumented-bodies": 9,
|
|
22445
|
-
"x-response-schemas":
|
|
22511
|
+
"x-response-schemas": 265,
|
|
22446
22512
|
"x-generated-by": "scripts/gds/gen-api-docs.js"
|
|
22447
22513
|
}
|
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. 357 endpoints across 58 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/<redacted>.md)): `public` < `any-builder` < `metic+archon` < `archon`.
|
|
@@ -459,7 +459,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
|
|
|
459
459
|
| GET | `/api/bongos/projects/featured` | `public` | — | the public map of projects; no auth by design. |
|
|
460
460
|
| POST | `/api/bongos/projects/invite` | `metic+archon` | `client_id`, `github_login` | own-or-metic in effect: invite a builder into a project (ADR 0141 §5, task #1002115), called by a `project.curate` holder OR the project'… |
|
|
461
461
|
|
|
462
|
-
## `provisioning` (
|
|
462
|
+
## `provisioning` (22)
|
|
463
463
|
|
|
464
464
|
| Method | Path | Rank | Body | Description |
|
|
465
465
|
|---|---|---|---|---|
|
|
@@ -475,6 +475,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
|
|
|
475
475
|
| POST | `/api/bongos/provisioning/instances/:id/domain` | `any-builder` | `domain` | POST /provisioning/instances/:id/domain — give the caller's OWN instance its address (task 1002692, gap 5: no path existed to add a domai… |
|
|
476
476
|
| POST | `/api/bongos/provisioning/instances/:id/force-teardown` | `metic+archon` | — | POST /provisioning/instances/:id/force-teardown — Archon tears down ANY instance. |
|
|
477
477
|
| POST | `/api/bongos/provisioning/instances/:id/github-app` | `any-builder` | `account` | POST /provisioning/instances/:id/github-app — mint a GitHub-App-Manifest onboarding link for the caller's OWN instance (task 2080, ADR 01… |
|
|
478
|
+
| GET | `/api/bongos/provisioning/instances/:id/invite-suggestions` | `any-builder` | — | ── Who is worth inviting (BV1.R28, task 1002347, goal 1000046 C6) ──────── GET /provisioning/instances/:id/invite-suggestions — turn the … |
|
|
478
479
|
| POST | `/api/bongos/provisioning/instances/:id/restart` | `any-builder` | — | POST /provisioning/instances/:id/restart — restart an ACTIVE project the heartbeat cannot reach (task 1003238). |
|
|
479
480
|
| 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). |
|
|
480
481
|
| PATCH | `/api/bongos/provisioning/instances/:id/settings` | `any-builder` | validated | PATCH /provisioning/instances/:id/settings — change a project's settings. |
|