@bongos/core 1.21.94 → 1.21.95
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 +34 -29
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +4 -0
- package/clients/bongos-client/index.cjs +4 -0
- package/clients/bongos-client/index.d.ts +5 -0
- package/clients/bongos-client/index.mjs +4 -0
- package/docs/api/openapi.json +75 -3
- package/docs/api-reference.md +4 -2
- package/docs/design/project-startup-direction.md +9 -1
- package/docs/module-api-changelog.md +2 -0
- package/docs/page-readings.json +1 -1
- package/modules/provisioning/routes/callback-page.js +20 -10
- package/modules/provisioning/routes/github-setup.js +110 -2
- package/modules/public-landing/public/projects.html +103 -10
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +6 -0
- package/src/module-api.js +1 -1
- package/tests/github_handback_any_device.mjs +340 -0
- package/tests/projects_hub.mjs +6 -2
- package/tests/provisioning_callback_page.mjs +3 -2
- package/tests/provisioning_github_app_routes.mjs +15 -10
- package/tests/wizard_draft_resume.mjs +4 -0
- package/tests/wizard_github_feedback.mjs +2 -1
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.21.
|
|
6
|
-
"core_contract": "1.21.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.21.95",
|
|
6
|
+
"core_contract": "1.21.95",
|
|
7
|
+
"source_commit": "1895cbf114f5a8932e751d9208a592dfbbf99ff8",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-10-
|
|
9
|
+
"built_at": "2026-10-09T08:47:23.210Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 590,
|
|
13
13
|
"agent_docs_stubbed": 28,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 3013,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 3632,
|
|
20
|
+
"tree_sha256": "82e713c766d3a2684a614b15ca98c09c047238193da0dc6be4ab5f95b9dbb975",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -312,12 +312,12 @@
|
|
|
312
312
|
{
|
|
313
313
|
"path": "clients/bongos-client/README.md",
|
|
314
314
|
"mode": "0000644",
|
|
315
|
-
"sha256": "
|
|
315
|
+
"sha256": "ddef69b1dc2ff76269e9f84955ca554ec70f1f18aeb502e408bf20920f694669"
|
|
316
316
|
},
|
|
317
317
|
{
|
|
318
318
|
"path": "clients/bongos-client/bongos-client.global.js",
|
|
319
319
|
"mode": "0000644",
|
|
320
|
-
"sha256": "
|
|
320
|
+
"sha256": "35ac01d598a9ba76e928f115f5de99e952128d37de311e3bab548d9a74bfe53a"
|
|
321
321
|
},
|
|
322
322
|
{
|
|
323
323
|
"path": "clients/bongos-client/examples/hello-world.mjs",
|
|
@@ -327,17 +327,17 @@
|
|
|
327
327
|
{
|
|
328
328
|
"path": "clients/bongos-client/index.cjs",
|
|
329
329
|
"mode": "0000644",
|
|
330
|
-
"sha256": "
|
|
330
|
+
"sha256": "0793d04a2a43eef50144bc607927c7b3560af4948877926edf24aa3d781e7323"
|
|
331
331
|
},
|
|
332
332
|
{
|
|
333
333
|
"path": "clients/bongos-client/index.d.ts",
|
|
334
334
|
"mode": "0000644",
|
|
335
|
-
"sha256": "
|
|
335
|
+
"sha256": "c4708244379cd28709caf48d817266b184ffe18a65f9590bc62c2b1aeb71d824"
|
|
336
336
|
},
|
|
337
337
|
{
|
|
338
338
|
"path": "clients/bongos-client/index.mjs",
|
|
339
339
|
"mode": "0000644",
|
|
340
|
-
"sha256": "
|
|
340
|
+
"sha256": "e143421ec34b742f29a21690b81ed8fdf2b01a7c87d380fcea43a56dbba42465"
|
|
341
341
|
},
|
|
342
342
|
{
|
|
343
343
|
"path": "clients/bongos-client/package.json",
|
|
@@ -2317,12 +2317,12 @@
|
|
|
2317
2317
|
{
|
|
2318
2318
|
"path": "docs/api-reference.md",
|
|
2319
2319
|
"mode": "0000644",
|
|
2320
|
-
"sha256": "
|
|
2320
|
+
"sha256": "3b3f6ed65d2c90fa08c7a2000862c7c9ffd8b7625420f377b52d132d9b17d8d3"
|
|
2321
2321
|
},
|
|
2322
2322
|
{
|
|
2323
2323
|
"path": "docs/api/openapi.json",
|
|
2324
2324
|
"mode": "0000644",
|
|
2325
|
-
"sha256": "
|
|
2325
|
+
"sha256": "8704ce350de56a1b955a41296cb7fa053128d2b4fc8a76e156a4e8578afef6a3"
|
|
2326
2326
|
},
|
|
2327
2327
|
{
|
|
2328
2328
|
"path": "docs/architecture.md",
|
|
@@ -2432,7 +2432,7 @@
|
|
|
2432
2432
|
{
|
|
2433
2433
|
"path": "docs/design/project-startup-direction.md",
|
|
2434
2434
|
"mode": "0000644",
|
|
2435
|
-
"sha256": "
|
|
2435
|
+
"sha256": "1fc48632ac7af6d55bc62cf0207affb597956c2243febe1faa0b39e22bdef829"
|
|
2436
2436
|
},
|
|
2437
2437
|
{
|
|
2438
2438
|
"path": "docs/design/projects-hub-direction-v2.md",
|
|
@@ -2862,7 +2862,7 @@
|
|
|
2862
2862
|
{
|
|
2863
2863
|
"path": "docs/module-api-changelog.md",
|
|
2864
2864
|
"mode": "0000644",
|
|
2865
|
-
"sha256": "
|
|
2865
|
+
"sha256": "4b50f866b73e605791b602d3d0dd212aeebc0b406f1f8579a8f3f4625fb9a8f2"
|
|
2866
2866
|
},
|
|
2867
2867
|
{
|
|
2868
2868
|
"path": "docs/modules-contract.md",
|
|
@@ -2952,7 +2952,7 @@
|
|
|
2952
2952
|
{
|
|
2953
2953
|
"path": "docs/page-readings.json",
|
|
2954
2954
|
"mode": "0000644",
|
|
2955
|
-
"sha256": "
|
|
2955
|
+
"sha256": "998e448cf903b275a9c44c0f326197963e83929626cce5dc506e980148690b98"
|
|
2956
2956
|
},
|
|
2957
2957
|
{
|
|
2958
2958
|
"path": "docs/project-context.template.md",
|
|
@@ -8552,7 +8552,7 @@
|
|
|
8552
8552
|
{
|
|
8553
8553
|
"path": "modules/provisioning/routes/callback-page.js",
|
|
8554
8554
|
"mode": "0000644",
|
|
8555
|
-
"sha256": "
|
|
8555
|
+
"sha256": "a84b6fce647c0902e7c90f5c85185d8ca2939d49fb67650bcca013eed3c90daa"
|
|
8556
8556
|
},
|
|
8557
8557
|
{
|
|
8558
8558
|
"path": "modules/provisioning/routes/core-upgrade.js",
|
|
@@ -8577,7 +8577,7 @@
|
|
|
8577
8577
|
{
|
|
8578
8578
|
"path": "modules/provisioning/routes/github-setup.js",
|
|
8579
8579
|
"mode": "0000644",
|
|
8580
|
-
"sha256": "
|
|
8580
|
+
"sha256": "652c1aafba1e38ae46b02b54d3e6cfa8c18a0ceadcf8a94ea67d664d773cce85"
|
|
8581
8581
|
},
|
|
8582
8582
|
{
|
|
8583
8583
|
"path": "modules/provisioning/routes/look.js",
|
|
@@ -9337,7 +9337,7 @@
|
|
|
9337
9337
|
{
|
|
9338
9338
|
"path": "modules/public-landing/public/projects.html",
|
|
9339
9339
|
"mode": "0000644",
|
|
9340
|
-
"sha256": "
|
|
9340
|
+
"sha256": "99b6553bb9756a91713c0842510d0dc8545111d0366fd59237968df21e69bf99"
|
|
9341
9341
|
},
|
|
9342
9342
|
{
|
|
9343
9343
|
"path": "modules/public-landing/public/projects.probes.json",
|
|
@@ -10117,12 +10117,12 @@
|
|
|
10117
10117
|
{
|
|
10118
10118
|
"path": "package-lock.json",
|
|
10119
10119
|
"mode": "0000644",
|
|
10120
|
-
"sha256": "
|
|
10120
|
+
"sha256": "8a3f6a8660b0f20118070b8adaad21cbbd3866e6a272720b94c2719fafe53b77"
|
|
10121
10121
|
},
|
|
10122
10122
|
{
|
|
10123
10123
|
"path": "package.json",
|
|
10124
10124
|
"mode": "0000644",
|
|
10125
|
-
"sha256": "
|
|
10125
|
+
"sha256": "256622b8d3de980cdb9dc368b115d0259af8e192f43d3757fcbc399ea053b00b"
|
|
10126
10126
|
},
|
|
10127
10127
|
{
|
|
10128
10128
|
"path": "public-docs/index.html",
|
|
@@ -10142,7 +10142,7 @@
|
|
|
10142
10142
|
{
|
|
10143
10143
|
"path": "release-notes.json",
|
|
10144
10144
|
"mode": "0000644",
|
|
10145
|
-
"sha256": "
|
|
10145
|
+
"sha256": "f0933c625fe42e498bad837a26383cbd38181bb7dba0f02d33457789fdbac345"
|
|
10146
10146
|
},
|
|
10147
10147
|
{
|
|
10148
10148
|
"path": "scripts/cron/style_guide_audit.sh",
|
|
@@ -12412,7 +12412,7 @@
|
|
|
12412
12412
|
{
|
|
12413
12413
|
"path": "src/module-api.js",
|
|
12414
12414
|
"mode": "0000644",
|
|
12415
|
-
"sha256": "
|
|
12415
|
+
"sha256": "5cabb78f9a62e76cbe3b084a14f0f4a50c5dc73b9c359cded8b13c64c5158f38"
|
|
12416
12416
|
},
|
|
12417
12417
|
{
|
|
12418
12418
|
"path": "src/module-loader/catalog.js",
|
|
@@ -14034,6 +14034,11 @@
|
|
|
14034
14034
|
"mode": "0000644",
|
|
14035
14035
|
"sha256": "79208b90f1b785af56ab057c858e96cea4e67ebf247858457addedce55e71b06"
|
|
14036
14036
|
},
|
|
14037
|
+
{
|
|
14038
|
+
"path": "tests/github_handback_any_device.mjs",
|
|
14039
|
+
"mode": "0000644",
|
|
14040
|
+
"sha256": "7c264331e939bda95029e4448534734a236a59c7b46e44e34bed7a0f13577cd3"
|
|
14041
|
+
},
|
|
14037
14042
|
{
|
|
14038
14043
|
"path": "tests/github_one_trip.mjs",
|
|
14039
14044
|
"mode": "0000644",
|
|
@@ -16392,7 +16397,7 @@
|
|
|
16392
16397
|
{
|
|
16393
16398
|
"path": "tests/projects_hub.mjs",
|
|
16394
16399
|
"mode": "0000644",
|
|
16395
|
-
"sha256": "
|
|
16400
|
+
"sha256": "2183ec464cc6ab88d95bb7416a75aef72b674e05677cc6698e4dcb50fde366fb"
|
|
16396
16401
|
},
|
|
16397
16402
|
{
|
|
16398
16403
|
"path": "tests/projects_hub_app_status.mjs",
|
|
@@ -16532,7 +16537,7 @@
|
|
|
16532
16537
|
{
|
|
16533
16538
|
"path": "tests/provisioning_callback_page.mjs",
|
|
16534
16539
|
"mode": "0000644",
|
|
16535
|
-
"sha256": "
|
|
16540
|
+
"sha256": "464edbf5d2095148cf2bc37af1abc22b228eeaf5bd25f39d5d604bae10778688"
|
|
16536
16541
|
},
|
|
16537
16542
|
{
|
|
16538
16543
|
"path": "tests/provisioning_capacity.mjs",
|
|
@@ -16592,7 +16597,7 @@
|
|
|
16592
16597
|
{
|
|
16593
16598
|
"path": "tests/provisioning_github_app_routes.mjs",
|
|
16594
16599
|
"mode": "0000644",
|
|
16595
|
-
"sha256": "
|
|
16600
|
+
"sha256": "c8969d3782cbc6d9b3b4c776cdf8c3f2e0bc5282d6cb7af3a82c5164034416a1"
|
|
16596
16601
|
},
|
|
16597
16602
|
{
|
|
16598
16603
|
"path": "tests/provisioning_look.mjs",
|
|
@@ -18092,7 +18097,7 @@
|
|
|
18092
18097
|
{
|
|
18093
18098
|
"path": "tests/wizard_draft_resume.mjs",
|
|
18094
18099
|
"mode": "0000644",
|
|
18095
|
-
"sha256": "
|
|
18100
|
+
"sha256": "0d87008084384aad7592579f3b9f3e4476e5af12fa7826d1dd77f995b33319b4"
|
|
18096
18101
|
},
|
|
18097
18102
|
{
|
|
18098
18103
|
"path": "tests/wizard_front_door.mjs",
|
|
@@ -18102,7 +18107,7 @@
|
|
|
18102
18107
|
{
|
|
18103
18108
|
"path": "tests/wizard_github_feedback.mjs",
|
|
18104
18109
|
"mode": "0000644",
|
|
18105
|
-
"sha256": "
|
|
18110
|
+
"sha256": "153932c97b0cfb95c01c19787d7543ce80efe2ef8a8ab813e67c0376b4eb508b"
|
|
18106
18111
|
},
|
|
18107
18112
|
{
|
|
18108
18113
|
"path": "tests/wizard_intent_resume.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
|
+
- 536 operations across 76 resource groups
|
|
9
9
|
|
|
10
10
|
## Use it from your project
|
|
11
11
|
|
|
@@ -895,6 +895,10 @@ function createClient(opts = {}) {
|
|
|
895
895
|
getProvisioningFleetCostLedger: (args) => request("GET", "/provisioning/fleet/cost-ledger", { hasBody: false }, args),
|
|
896
896
|
// GET /provisioning/github-app/callback — rank: public — GET /provisioning/github-app/callback
|
|
897
897
|
getProvisioningGithubAppCallback: (args) => request("GET", "/provisioning/github-app/callback", { hasBody: false }, args),
|
|
898
|
+
// GET /provisioning/github-app/resume — rank: any-builder — GET /provisioning/github-app/resume
|
|
899
|
+
getProvisioningGithubAppResume: (args) => request("GET", "/provisioning/github-app/resume", { hasBody: false }, args),
|
|
900
|
+
// GET /provisioning/github-app/return — rank: public — GET /provisioning/github-app/return
|
|
901
|
+
getProvisioningGithubAppReturn: (args) => request("GET", "/provisioning/github-app/return", { hasBody: false }, args),
|
|
898
902
|
// GET /provisioning/github-app/setup — rank: public — GET /provisioning/github-app/setup
|
|
899
903
|
getProvisioningGithubAppSetup: (args) => request("GET", "/provisioning/github-app/setup", { hasBody: false }, args),
|
|
900
904
|
// GET /provisioning/github-app/status — rank: public — GET /provisioning/github-app/status
|
|
@@ -894,6 +894,10 @@ function createClient(opts = {}) {
|
|
|
894
894
|
getProvisioningFleetCostLedger: (args) => request("GET", "/provisioning/fleet/cost-ledger", { hasBody: false }, args),
|
|
895
895
|
// GET /provisioning/github-app/callback — rank: public — GET /provisioning/github-app/callback
|
|
896
896
|
getProvisioningGithubAppCallback: (args) => request("GET", "/provisioning/github-app/callback", { hasBody: false }, args),
|
|
897
|
+
// GET /provisioning/github-app/resume — rank: any-builder — GET /provisioning/github-app/resume
|
|
898
|
+
getProvisioningGithubAppResume: (args) => request("GET", "/provisioning/github-app/resume", { hasBody: false }, args),
|
|
899
|
+
// GET /provisioning/github-app/return — rank: public — GET /provisioning/github-app/return
|
|
900
|
+
getProvisioningGithubAppReturn: (args) => request("GET", "/provisioning/github-app/return", { hasBody: false }, args),
|
|
897
901
|
// GET /provisioning/github-app/setup — rank: public — GET /provisioning/github-app/setup
|
|
898
902
|
getProvisioningGithubAppSetup: (args) => request("GET", "/provisioning/github-app/setup", { hasBody: false }, args),
|
|
899
903
|
// GET /provisioning/github-app/status — rank: public — GET /provisioning/github-app/status
|
|
@@ -132,6 +132,7 @@ export interface GetProjectSettingsShipModeResponse { mode: unknown; chosen: unk
|
|
|
132
132
|
export interface GetProjectsFeaturedResponse { projects: unknown; page: PageInfo }
|
|
133
133
|
export interface GetProjectsResponse { projects: unknown }
|
|
134
134
|
export interface GetProvisioningFleetResponse { instances: unknown; capacity: unknown }
|
|
135
|
+
export interface GetProvisioningGithubAppResumeResponse { ok: boolean; project: unknown }
|
|
135
136
|
export interface GetProvisioningGithubAppStatusResponse { ok: boolean; status: unknown; failure: unknown; ready: unknown; terminal: unknown; domain: unknown; instance_status: unknown; app_slug: unknown; checklist: unknown; install_url: unknown; repo: unknown; verifying: unknown }
|
|
136
137
|
export interface GetProvisioningHealthResponse { module: unknown; ok: boolean; coreVersion: unknown }
|
|
137
138
|
export interface GetProvisioningInstancesIdEnvManifestResponse { instance: unknown; env_vars: unknown; environments: unknown; values_held: boolean; note: unknown }
|
|
@@ -1402,6 +1403,10 @@ export interface BongosClient {
|
|
|
1402
1403
|
getProvisioningFleetCostLedger(args?: RequestArgs): Promise<ApiResponse>;
|
|
1403
1404
|
/** GET /provisioning/github-app/callback — rank: public */
|
|
1404
1405
|
getProvisioningGithubAppCallback(args?: RequestArgs): Promise<ApiResponse>;
|
|
1406
|
+
/** GET /provisioning/github-app/resume — rank: any-builder */
|
|
1407
|
+
getProvisioningGithubAppResume(args?: RequestArgs): Promise<GetProvisioningGithubAppResumeResponse>;
|
|
1408
|
+
/** GET /provisioning/github-app/return — rank: public */
|
|
1409
|
+
getProvisioningGithubAppReturn(args?: RequestArgs): Promise<ApiResponse>;
|
|
1405
1410
|
/** GET /provisioning/github-app/setup — rank: public */
|
|
1406
1411
|
getProvisioningGithubAppSetup(args?: RequestArgs): Promise<ApiResponse>;
|
|
1407
1412
|
/** GET /provisioning/github-app/status — rank: public */
|
|
@@ -891,6 +891,10 @@ export function createClient(opts = {}) {
|
|
|
891
891
|
getProvisioningFleetCostLedger: (args) => request("GET", "/provisioning/fleet/cost-ledger", { hasBody: false }, args),
|
|
892
892
|
// GET /provisioning/github-app/callback — rank: public — GET /provisioning/github-app/callback
|
|
893
893
|
getProvisioningGithubAppCallback: (args) => request("GET", "/provisioning/github-app/callback", { hasBody: false }, args),
|
|
894
|
+
// GET /provisioning/github-app/resume — rank: any-builder — GET /provisioning/github-app/resume
|
|
895
|
+
getProvisioningGithubAppResume: (args) => request("GET", "/provisioning/github-app/resume", { hasBody: false }, args),
|
|
896
|
+
// GET /provisioning/github-app/return — rank: public — GET /provisioning/github-app/return
|
|
897
|
+
getProvisioningGithubAppReturn: (args) => request("GET", "/provisioning/github-app/return", { hasBody: false }, args),
|
|
894
898
|
// GET /provisioning/github-app/setup — rank: public — GET /provisioning/github-app/setup
|
|
895
899
|
getProvisioningGithubAppSetup: (args) => request("GET", "/provisioning/github-app/setup", { hasBody: false }, args),
|
|
896
900
|
// GET /provisioning/github-app/status — rank: public — GET /provisioning/github-app/status
|
package/docs/api/openapi.json
CHANGED
|
@@ -16460,6 +16460,65 @@
|
|
|
16460
16460
|
"security": []
|
|
16461
16461
|
}
|
|
16462
16462
|
},
|
|
16463
|
+
"/provisioning/github-app/resume": {
|
|
16464
|
+
"get": {
|
|
16465
|
+
"operationId": "get_provisioning_github_app_resume",
|
|
16466
|
+
"tags": [
|
|
16467
|
+
"provisioning"
|
|
16468
|
+
],
|
|
16469
|
+
"summary": "GET /provisioning/github-app/resume",
|
|
16470
|
+
"description": "GET /provisioning/github-app/resume[?id=<n>] — the project page's \"which project am I connecting?\" read when its tab remembers nothing (task 1004650): a hand-back on another device, a fresh tab, a cleared browser. With an id: that project, if the caller owns it. Without: the caller's newest project whose GitHub checklist is not connected yet, made or last tried within a week — so opening the create page later resumes part 03 from the server's view. Either way { project: null } when there is none; never the state token. rank: any authenticated builder (requireBuilder), own projects only — no Archon override.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
16471
|
+
"x-rank": "any-builder",
|
|
16472
|
+
"x-source": "modules/provisioning/routes/github-setup.js",
|
|
16473
|
+
"responses": {
|
|
16474
|
+
"200": {
|
|
16475
|
+
"description": "Success.",
|
|
16476
|
+
"content": {
|
|
16477
|
+
"application/json": {
|
|
16478
|
+
"schema": {
|
|
16479
|
+
"$ref": "#/components/schemas/GetProvisioningGithubAppResumeResponse"
|
|
16480
|
+
}
|
|
16481
|
+
}
|
|
16482
|
+
}
|
|
16483
|
+
},
|
|
16484
|
+
"400": {
|
|
16485
|
+
"$ref": "#/components/responses/BadRequest"
|
|
16486
|
+
},
|
|
16487
|
+
"401": {
|
|
16488
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
16489
|
+
},
|
|
16490
|
+
"403": {
|
|
16491
|
+
"$ref": "#/components/responses/Forbidden"
|
|
16492
|
+
}
|
|
16493
|
+
},
|
|
16494
|
+
"security": [
|
|
16495
|
+
{
|
|
16496
|
+
"builderSession": []
|
|
16497
|
+
}
|
|
16498
|
+
]
|
|
16499
|
+
}
|
|
16500
|
+
},
|
|
16501
|
+
"/provisioning/github-app/return": {
|
|
16502
|
+
"get": {
|
|
16503
|
+
"operationId": "get_provisioning_github_app_return",
|
|
16504
|
+
"tags": [
|
|
16505
|
+
"provisioning"
|
|
16506
|
+
],
|
|
16507
|
+
"summary": "GET /provisioning/github-app/return",
|
|
16508
|
+
"description": "GET /provisioning/github-app/return?state=<> — where the callback and setup pages send the founder back (task 1004650). The SERVER resolves the one-time state to the project it was minted for and 302s that project's signed-in OWNER to its part 03 (/projects?view=new&id=<id>), so the hand-back works from any tab, window or device — nothing in browser storage is read. Not signed in → through the web sign-in and back here. Signed in as anyone else, an unknown or malformed state, or a gone project → one refusal page that names no project (no oracle about which). The state stays single-use where it matters: only the manifest callback's code exchange consumes it, and this route changes nothing — it reveals a project's page only to the person who already owns it. rank: public — as a GATE: it is a browser redirect, so no middleware 401s a signed-out visitor (they are sent through sign-in instead). WHO lands is decided in-handler from the live session: the project's own owner, no Archon override, and nobody else ever learns which project the state names. It reveals no secret and writes nothing.\n\n**Rank:** `public` — No authentication — any caller.",
|
|
16509
|
+
"x-rank": "public",
|
|
16510
|
+
"x-source": "modules/provisioning/routes/github-setup.js",
|
|
16511
|
+
"responses": {
|
|
16512
|
+
"200": {
|
|
16513
|
+
"description": "Success."
|
|
16514
|
+
},
|
|
16515
|
+
"400": {
|
|
16516
|
+
"$ref": "#/components/responses/BadRequest"
|
|
16517
|
+
}
|
|
16518
|
+
},
|
|
16519
|
+
"security": []
|
|
16520
|
+
}
|
|
16521
|
+
},
|
|
16463
16522
|
"/provisioning/github-app/setup": {
|
|
16464
16523
|
"get": {
|
|
16465
16524
|
"operationId": "get_provisioning_github_app_setup",
|
|
@@ -26773,6 +26832,19 @@
|
|
|
26773
26832
|
"capacity"
|
|
26774
26833
|
]
|
|
26775
26834
|
},
|
|
26835
|
+
"GetProvisioningGithubAppResumeResponse": {
|
|
26836
|
+
"type": "object",
|
|
26837
|
+
"properties": {
|
|
26838
|
+
"ok": {
|
|
26839
|
+
"type": "boolean"
|
|
26840
|
+
},
|
|
26841
|
+
"project": {}
|
|
26842
|
+
},
|
|
26843
|
+
"required": [
|
|
26844
|
+
"ok",
|
|
26845
|
+
"project"
|
|
26846
|
+
]
|
|
26847
|
+
},
|
|
26776
26848
|
"GetProvisioningGithubAppStatusResponse": {
|
|
26777
26849
|
"type": "object",
|
|
26778
26850
|
"properties": {
|
|
@@ -34253,9 +34325,9 @@
|
|
|
34253
34325
|
"description": "A required dependency/feature is not configured or is temporarily down."
|
|
34254
34326
|
}
|
|
34255
34327
|
},
|
|
34256
|
-
"x-endpoint-count":
|
|
34257
|
-
"x-schema-count":
|
|
34328
|
+
"x-endpoint-count": 536,
|
|
34329
|
+
"x-schema-count": 575,
|
|
34258
34330
|
"x-undocumented-bodies": 12,
|
|
34259
|
-
"x-response-schemas":
|
|
34331
|
+
"x-response-schemas": 381,
|
|
34260
34332
|
"x-generated-by": "scripts/gds/gen-api-docs.js"
|
|
34261
34333
|
}
|
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. 536 endpoints across 95 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`.
|
|
@@ -636,7 +636,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
636
636
|
| 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… |
|
|
637
637
|
| POST | `/api/bongos/projects/invite-guild` | `metic+archon` | `client_id`, `guild` | own-or-metic in effect, the SAME gate as POST /projects/invite above and for the same reasons (a non-inviter gets that route's unchanged … |
|
|
638
638
|
|
|
639
|
-
## `provisioning` (
|
|
639
|
+
## `provisioning` (45)
|
|
640
640
|
|
|
641
641
|
| Method | Path | Rank | Body | Description |
|
|
642
642
|
|---|---|---|---|---|
|
|
@@ -644,6 +644,8 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
644
644
|
| GET | `/api/bongos/provisioning/fleet` | `metic+archon` | — | GET /provisioning/fleet — the full instance roster across all owners. |
|
|
645
645
|
| GET | `/api/bongos/provisioning/fleet/cost-ledger` | `metic+archon` | — | GET /provisioning/fleet/cost-ledger — per-instance monthly cost to us + estimated cost to its owner, with totals. |
|
|
646
646
|
| GET | `/api/bongos/provisioning/github-app/callback` | `public` | — | GET /provisioning/github-app/callback?code=&state= — GitHub redirects the owner's BROWSER here after they approve the App Manifest (task … |
|
|
647
|
+
| GET | `/api/bongos/provisioning/github-app/resume` | `any-builder` | — | GET /provisioning/github-app/resume[?id=<n>] — the project page's "which project am I connecting?" read when its tab remembers nothing (t… |
|
|
648
|
+
| GET | `/api/bongos/provisioning/github-app/return` | `public` | — | GET /provisioning/github-app/return?state=<> — where the callback and setup pages send the founder back (task 1004650). |
|
|
647
649
|
| GET | `/api/bongos/provisioning/github-app/setup` | `public` | — | GET /provisioning/github-app/setup?installation_id=&setup_action=&state= — the App's setup_url (task 1004649). |
|
|
648
650
|
| GET | `/api/bongos/provisioning/github-app/status` | `public` | — | GET /provisioning/github-app/status?state=<> — the PUBLIC progress read (task 1004548; the checklist since task 1004649). |
|
|
649
651
|
| GET | `/api/bongos/provisioning/health` | `public` | — | GET /provisioning/health — liveness + the core version this module mounted against. |
|
|
@@ -59,7 +59,15 @@ This table replaces the blended flow's table below for every hub-side capability
|
|
|
59
59
|
- **The trip.** "Connect GitHub ↗" posts the app manifest to GitHub. The manifest now carries a `setup_url` (the hub's `/provisioning/github-app/setup`). After the approval GitHub returns to the manifest callback, which waits until the runner has placed the app's keys and recorded its name, then sends the same tab straight to `github.com/apps/<app>/installations/new`. When GitHub will describe the repo to an anonymous caller (a public repo), the link is narrowed with `/permissions?suggested_target_id=<owner id>&repository_ids[]=<repo id>`, so the founder only has to confirm. After the install, GitHub sends them to the `setup_url` with the attempt's `state`, and that page hands them back to the checklist.
|
|
60
60
|
- **The ticks are server facts, never clicks.** *Approve*: GitHub made the app and the runner placed its keys (the slug is recorded only after the placement write). *Install*: the runner asks GitHub `GET /repos/{owner}/{repo}/installation`, signed as the app with the app's own key. The `installation_id` GitHub appends to the `setup_url` is never trusted, because GitHub's docs warn it can be spoofed; it only makes the runner look again. *Builders can sign in*: the runner saw `auth_configured` on the project's `/api/bongos/healthz`. The root `/healthz` answers a plain "ok", and reading that one is why every setup used to be recorded as failed (task 1004577). *Command-line sign-in*: the runner starts a device sign-in with the app's client id, and GitHub does not refuse it with `device_flow_disabled`. The facts are rows in `provisioning_events`, so no new column was needed. The checklist is derived in `modules/provisioning/github-setup.js`; the runner's check is `scripts/gds/provision-github-setup.js`.
|
|
61
61
|
- **Device flow cannot be switched on for the founder (spike, task 1004649).** GitHub's manifest parameters are `name`, `url`, `hook_attributes`, `redirect_url`, `callback_urls`, `setup_url`, `setup_on_update`, `request_oauth_on_install`, `public`, `default_permissions`, `default_events` and `description`, and none of them is device flow. The REST API for apps (`/app`, `/app/installations…`, `/app-manifests/{code}/conversions`) has no endpoint that changes an app's registration. GitHub's own guide says device flow has to be enabled in the app's settings first. So the fourth step is **optional**: it reads "Optional — turn it on later" with a link to the app's settings, ticks itself when the runner sees it on, and never holds back "connected" or "is alive". Web sign-in works without it, and the CLI falls back to a web token meanwhile (`scripts/gds/device-flow-help.js`).
|
|
62
|
-
- **Left as seams for the sibling tasks.** The hand-back from any tab or device, and checking while the page is hidden (task 1004650). The page already re-learns the checklist from the owner's instance read (`github_setup`), and that read never carries the state token. A personal or an organisation account (task 1004651). Resuming a stopped step, and a fixing button for every failure, including "check again" after the runner's two-hour window (task 1004652).
|
|
62
|
+
- **Left as seams for the sibling tasks.** The hand-back from any tab or device, and checking while the page is hidden (task 1004650, built: see below). The page already re-learns the checklist from the owner's instance read (`github_setup`), and that read never carries the state token. A personal or an organisation account (task 1004651). Resuming a stopped step, and a fixing button for every failure, including "check again" after the runner's two-hour window (task 1004652).
|
|
63
|
+
|
|
64
|
+
### Coming back from any tab or device, as built (task 1004650)
|
|
65
|
+
|
|
66
|
+
- **The server names the project.** The callback page and the setup page no longer send the founder to `/projects?view=new#ghstate=…` and trust the tab to know which project that was. They send them to `/api/bongos/provisioning/github-app/return?state=…`. That route looks the one-time state up, finds the project it was minted for, and, if the person signed in owns that project, sends them to `/projects?view=new&id=<project>#ghstate=…`. Nothing is read from browser storage, so approving on a phone, in another window or in a fresh tab lands on the right project at part 03.
|
|
67
|
+
- **Only the owner lands.** Not signed in: through the web sign-in and back to the same return. Signed in as anyone else, an unknown or malformed state, or a project that is gone: one page that names no project ("This isn't your project"), the same for each case. There is no Archon override here. The state is still used once where it matters: only the manifest callback's code exchange uses it up, and the return route changes nothing.
|
|
68
|
+
- **The page asks the server when its tab cannot say.** `GET /provisioning/github-app/resume?id=<project>` (signed in, own projects only) answers with what part 03 needs: id, slug, address, kind and repo. A hand-back named by the return route always opens that project's part 03. Without an id, the read names the founder's newest project whose GitHub checklist is not connected yet, if it was made or last tried within a week. Opening the create page later then reopens part 03 for it, unless the founder is typing a new project or clicked "New project" (then it is offered on the "still watching" line). "Start another project" sets it down for that tab. The hub's other views are unchanged.
|
|
69
|
+
- **The page keeps checking while hidden.** Both of part 03's polls (the state-keyed checklist and the owner's project read) keep going while the tab is hidden, every 20 seconds instead of every 4 to 5. When the tab is seen again, a waiting check runs at once. They still stop when the founder leaves the create view (C8).
|
|
70
|
+
- **Left for the sibling tasks.** A personal or an organisation account (task 1004651). Picking up a stopped step, and a fixing button for every failure (task 1004652); the resume read already reopens part 03 for a failed attempt, which is where those buttons go.
|
|
63
71
|
|
|
64
72
|
### Who builds it
|
|
65
73
|
|
|
@@ -3025,5 +3025,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
3025
3025
|
landed since 1.21.92 with no explicit bump. run 37898035856. (task 1002620)
|
|
3026
3026
|
1.21.94 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3027
3027
|
landed since 1.21.93 with no explicit bump. run 37901444360. (task 1002620)
|
|
3028
|
+
1.21.95 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3029
|
+
landed since 1.21.94 with no explicit bump. run 37907054923. (task 1002620)
|
|
3028
3030
|
---------------------------------------------------------------------------
|
|
3029
3031
|
```
|
package/docs/page-readings.json
CHANGED
|
@@ -4570,7 +4570,7 @@
|
|
|
4570
4570
|
"surface": "landing",
|
|
4571
4571
|
"title": "{{productName}} — projects",
|
|
4572
4572
|
"states_read": ["out-map","in-map","in-map-projects","in-map-profile","in-map-kbd","in-map-search","in-map-mine-on","in-table","in-table-by-builders","in-mine","in-manage","in-manage-address","in-manage-planet","in-manage-card","in-manage-look","in-manage-kind","in-manage-invite","in-manage-invite-handoff","in-manage-invite-guild","in-manage-app-live","in-manage-app-building","in-manage-app-failed","in-manage-app-retry","in-manage-app-offer","in-manage-app-connect","in-manage-snag","in-manage-gone","in-manage-missing","out-manage","in-new","in-new-named","in-new-ready","in-new-name-prefilled","in-new-demo","in-new-demo-used","in-new-checks-filled","in-new-checks-entity","in-new-row-code","in-new-row-address","in-new-row-team","in-new-row-extras","in-new-row-rewards","in-new-row-app","in-new-row-run","in-new-row-ship","in-new-look","in-new-look-custom","in-new-create-blocked","in-new-done","in-new-resume-offer","out-new","out-map-projects","card","card-noart","card-self","in-manage-demo","in-mine-dns-pending","in-manage-dns-pending","in-mine-empty","card-floor","card-backdrop","in-new-done-live"],
|
|
4573
|
-
"files_hash": "
|
|
4573
|
+
"files_hash": "8c02f1901e82c185",
|
|
4574
4574
|
"reading_hash": "5bd7b2d212b112d6",
|
|
4575
4575
|
"counts": {"lines":1207,"placed":237,"shared":21,"unplaced":949},
|
|
4576
4576
|
"omitted": {"data":142},
|
|
@@ -27,6 +27,16 @@ function esc(s) {
|
|
|
27
27
|
));
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
+
// The way back to the project (task 1004650): the hub's return route, keyed on the attempt's
|
|
31
|
+
// one-time state. The SERVER resolves that state to the project it was minted for and lands
|
|
32
|
+
// its signed-in owner on that project's part 03 (routes/github-setup.js), so the hand-back no
|
|
33
|
+
// longer depends on what the starting tab kept in sessionStorage — approving on a phone or in
|
|
34
|
+
// another window lands on the right project. No state names no project: the projects list.
|
|
35
|
+
const RETURN_PATH = '/api/bongos/provisioning/github-app/return';
|
|
36
|
+
function returnHref(state) {
|
|
37
|
+
return state ? `${RETURN_PATH}?state=${encodeURIComponent(state)}` : '/projects?view=mine';
|
|
38
|
+
}
|
|
39
|
+
|
|
30
40
|
// Accent pair resolved from the instance's own branding — the pack is the palette
|
|
31
41
|
// authority (task 1002810); the literal fallbacks are the neutral pack's values, so
|
|
32
42
|
// a branding validation error still paints the current family, never a stale one.
|
|
@@ -65,15 +75,15 @@ code{font-family:"Fira Code",ui-monospace,SFMono-Regular,monospace;background:rg
|
|
|
65
75
|
// page hands them straight back: as the wizard's pop-up it closes itself so the checklist
|
|
66
76
|
// tab is in front again (that tab is already polling the same status and shows the wait);
|
|
67
77
|
// if the browser refuses the close, or this was a same-tab return (pop-up blocked), this
|
|
68
|
-
// tab becomes the checklist. The
|
|
69
|
-
// server
|
|
78
|
+
// tab becomes the checklist. The way back is the return route (returnHref above): the
|
|
79
|
+
// server names the project for the state, so the checklist opened here is the right one
|
|
80
|
+
// whatever this browser remembers (task 1004650).
|
|
70
81
|
// Deliberately contains NO backticks and NO ${...} so it survives the outer template
|
|
71
82
|
// literal verbatim; the only server data it reads is the JSON config block above it.
|
|
72
83
|
const HANDBACK_SCRIPT = `
|
|
73
84
|
(function(){
|
|
74
85
|
var cfg=window.__CB_SETUP__||{};
|
|
75
|
-
var back=cfg.back||'/projects?view=
|
|
76
|
-
if(cfg.state)back+='#ghstate='+encodeURIComponent(cfg.state);
|
|
86
|
+
var back=cfg.back||'/projects?view=mine';
|
|
77
87
|
var link=document.getElementById('back');if(link)link.href=back;
|
|
78
88
|
var popup=false;
|
|
79
89
|
try{popup=!!window.opener&&!window.opener.closed;}catch(e){}
|
|
@@ -94,8 +104,7 @@ const HANDBACK_SCRIPT = `
|
|
|
94
104
|
const INSTALL_SCRIPT = `
|
|
95
105
|
(function(){
|
|
96
106
|
var cfg=window.__CB_SETUP__||{};
|
|
97
|
-
var back=cfg.back||'/projects?view=
|
|
98
|
-
if(cfg.state)back+='#ghstate='+encodeURIComponent(cfg.state);
|
|
107
|
+
var back=cfg.back||'/projects?view=mine';
|
|
99
108
|
var link=document.getElementById('back');if(link)link.href=back;
|
|
100
109
|
var note=document.getElementById('note');
|
|
101
110
|
var say=function(t){if(note)note.textContent=t;};
|
|
@@ -142,7 +151,8 @@ const INSTALL_SCRIPT = `
|
|
|
142
151
|
// + `body` (server-authored, trusted HTML).
|
|
143
152
|
function callbackPage({ ok, title, body, state, domain, next }) {
|
|
144
153
|
const handback = !!(ok && state && domain);
|
|
145
|
-
const
|
|
154
|
+
const back = returnHref(state);
|
|
155
|
+
const cfgJson = JSON.stringify({ state: state || '', domain: domain || '', back }).replace(/</g, '\\u003c');
|
|
146
156
|
const head = `<!doctype html><html lang="en"><head><meta charset="utf-8">
|
|
147
157
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
148
158
|
<meta name="color-scheme" content="light dark">
|
|
@@ -157,7 +167,7 @@ function callbackPage({ ok, title, body, state, domain, next }) {
|
|
|
157
167
|
<h1>${esc(title)}</h1>
|
|
158
168
|
<p class="sub">Next, install it on your repo. Taking you there now.</p>
|
|
159
169
|
<p class="muted" id="note" role="status" aria-live="polite">Waiting for GitHub to hand over the app…</p>
|
|
160
|
-
<div class="cta"><a class="btn" id="back" href="
|
|
170
|
+
<div class="cta"><a class="btn" id="back" href="${esc(back)}">Back to my project</a></div>
|
|
161
171
|
</main>
|
|
162
172
|
<script>window.__CB_SETUP__=${cfgJson};</script>
|
|
163
173
|
<script>${INSTALL_SCRIPT}</script>
|
|
@@ -169,7 +179,7 @@ function callbackPage({ ok, title, body, state, domain, next }) {
|
|
|
169
179
|
<div class="badge-warn">✓</div>
|
|
170
180
|
<h1>${esc(title)}</h1>
|
|
171
181
|
<p class="sub">Taking you back to your setup checklist — it finishes setting up <code>${esc(domain)}</code> there.</p>
|
|
172
|
-
<div class="cta"><a class="btn" id="back" href="
|
|
182
|
+
<div class="cta"><a class="btn" id="back" href="${esc(back)}">Back to my checklist →</a></div>
|
|
173
183
|
</main>
|
|
174
184
|
<script>window.__CB_SETUP__=${cfgJson};</script>
|
|
175
185
|
<script>${HANDBACK_SCRIPT}</script>
|
|
@@ -184,4 +194,4 @@ function callbackPage({ ok, title, body, state, domain, next }) {
|
|
|
184
194
|
</body></html>`;
|
|
185
195
|
}
|
|
186
196
|
|
|
187
|
-
module.exports = { esc, callbackPage };
|
|
197
|
+
module.exports = { esc, callbackPage, returnHref, RETURN_PATH };
|