@bongos/core 1.19.1076 → 1.19.1077
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 +31 -26
- 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/adr/0145-free-hosted-project-tier-isolation-and-domain-separation.md +7 -0
- package/docs/api/openapi.json +22 -1
- package/docs/api-reference.md +3 -2
- package/docs/module-api-changelog.md +2 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +6 -0
- package/src/bongos/auth.js +8 -1
- package/src/bongos/middleware/rate-limit.js +1 -1
- package/src/bongos/routes/auth.js +271 -73
- package/src/module-api.js +1 -1
- package/tests/hub_cookie_host_only.mjs +279 -0
- package/tests/landing_page.mjs +4 -1
- package/tests/session_rename_fallback.mjs +19 -11
- package/tests/subdomain_auth.mjs +17 -15
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.1077",
|
|
6
|
+
"core_contract": "1.19.1077",
|
|
7
|
+
"source_commit": "8213cd0b6b6ae2e91300c953bee2bed1d3558da3",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-
|
|
9
|
+
"built_at": "2026-09-29T10:54:54.299Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 550,
|
|
13
13
|
"agent_docs_stubbed": 25,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 2530,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 3106,
|
|
20
|
+
"tree_sha256": "90651971ad753afab30ed83277bfc27c910ad7279d6264170b9045d3726e1d5f",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -322,12 +322,12 @@
|
|
|
322
322
|
{
|
|
323
323
|
"path": "clients/bongos-client/README.md",
|
|
324
324
|
"mode": "0000644",
|
|
325
|
-
"sha256": "
|
|
325
|
+
"sha256": "9d1e621dcf8b0a3b92cd67f700fd1d48f469d55833b494147e0a4c29be452d37"
|
|
326
326
|
},
|
|
327
327
|
{
|
|
328
328
|
"path": "clients/bongos-client/bongos-client.global.js",
|
|
329
329
|
"mode": "0000644",
|
|
330
|
-
"sha256": "
|
|
330
|
+
"sha256": "9fcd3ca52df7d24f22ee6efcd5a0167af53835ec8bd3ffad139185a7aebb90b0"
|
|
331
331
|
},
|
|
332
332
|
{
|
|
333
333
|
"path": "clients/bongos-client/examples/hello-world.mjs",
|
|
@@ -337,17 +337,17 @@
|
|
|
337
337
|
{
|
|
338
338
|
"path": "clients/bongos-client/index.cjs",
|
|
339
339
|
"mode": "0000644",
|
|
340
|
-
"sha256": "
|
|
340
|
+
"sha256": "0bbe77783e3bf8a1dd8bc594dc28372a8c982be8e10a468f97d17ec8a5ff8cfc"
|
|
341
341
|
},
|
|
342
342
|
{
|
|
343
343
|
"path": "clients/bongos-client/index.d.ts",
|
|
344
344
|
"mode": "0000644",
|
|
345
|
-
"sha256": "
|
|
345
|
+
"sha256": "7aa307fe6518433b5d85216d098c1d4cfedb25995aceb5717113e2233de62f48"
|
|
346
346
|
},
|
|
347
347
|
{
|
|
348
348
|
"path": "clients/bongos-client/index.mjs",
|
|
349
349
|
"mode": "0000644",
|
|
350
|
-
"sha256": "
|
|
350
|
+
"sha256": "a9ca2bf984f00e1b6506904f789fccf8acfedd7ca7418322f50713d82680f783"
|
|
351
351
|
},
|
|
352
352
|
{
|
|
353
353
|
"path": "clients/bongos-client/package.json",
|
|
@@ -1167,7 +1167,7 @@
|
|
|
1167
1167
|
{
|
|
1168
1168
|
"path": "docs/adr/0145-free-hosted-project-tier-isolation-and-domain-separation.md",
|
|
1169
1169
|
"mode": "0000644",
|
|
1170
|
-
"sha256": "
|
|
1170
|
+
"sha256": "7735acb6a10465a34e9c1b8ce75f045256ef0ed92bd94a5f383ddf7020afee82"
|
|
1171
1171
|
},
|
|
1172
1172
|
{
|
|
1173
1173
|
"path": "docs/adr/0146-configurable-reward-mode-cost-plus-only.md",
|
|
@@ -2207,12 +2207,12 @@
|
|
|
2207
2207
|
{
|
|
2208
2208
|
"path": "docs/api-reference.md",
|
|
2209
2209
|
"mode": "0000644",
|
|
2210
|
-
"sha256": "
|
|
2210
|
+
"sha256": "1b53174253962c6d9d45d3fc107770fa0af26899c7a638fa2ed8be55712a001c"
|
|
2211
2211
|
},
|
|
2212
2212
|
{
|
|
2213
2213
|
"path": "docs/api/openapi.json",
|
|
2214
2214
|
"mode": "0000644",
|
|
2215
|
-
"sha256": "
|
|
2215
|
+
"sha256": "efbdeaf4b09c7113ece416afdc79b4a46a4088504d5398ce02afd4d9aa5f917e"
|
|
2216
2216
|
},
|
|
2217
2217
|
{
|
|
2218
2218
|
"path": "docs/architecture.md",
|
|
@@ -2742,7 +2742,7 @@
|
|
|
2742
2742
|
{
|
|
2743
2743
|
"path": "docs/module-api-changelog.md",
|
|
2744
2744
|
"mode": "0000644",
|
|
2745
|
-
"sha256": "
|
|
2745
|
+
"sha256": "3c225690f0579fca6dbada87f49ee760d816a1135a3ae8ae30dcea4983ccccc8"
|
|
2746
2746
|
},
|
|
2747
2747
|
{
|
|
2748
2748
|
"path": "docs/modules-contract.md",
|
|
@@ -8597,12 +8597,12 @@
|
|
|
8597
8597
|
{
|
|
8598
8598
|
"path": "package-lock.json",
|
|
8599
8599
|
"mode": "0000644",
|
|
8600
|
-
"sha256": "
|
|
8600
|
+
"sha256": "f474f9d00b0d9bdcbb709d52ebb4f1e61e24b06ebe698ea4a423a3e67bfd3abe"
|
|
8601
8601
|
},
|
|
8602
8602
|
{
|
|
8603
8603
|
"path": "package.json",
|
|
8604
8604
|
"mode": "0000644",
|
|
8605
|
-
"sha256": "
|
|
8605
|
+
"sha256": "9fcd91f348d585a802db0d0c881b29f64c915c1af4bebe34f3c25d76f322efb8"
|
|
8606
8606
|
},
|
|
8607
8607
|
{
|
|
8608
8608
|
"path": "public-docs/index.html",
|
|
@@ -8622,7 +8622,7 @@
|
|
|
8622
8622
|
{
|
|
8623
8623
|
"path": "release-notes.json",
|
|
8624
8624
|
"mode": "0000644",
|
|
8625
|
-
"sha256": "
|
|
8625
|
+
"sha256": "797b5505242d566628e1fef62b4afc9e66cc77708ac3115eb48791ff15b763fe"
|
|
8626
8626
|
},
|
|
8627
8627
|
{
|
|
8628
8628
|
"path": "scripts/bongos-mcp.js",
|
|
@@ -10392,7 +10392,7 @@
|
|
|
10392
10392
|
{
|
|
10393
10393
|
"path": "src/bongos/auth.js",
|
|
10394
10394
|
"mode": "0000644",
|
|
10395
|
-
"sha256": "
|
|
10395
|
+
"sha256": "a46826214509f317fbe982265c0045edf9c3aa4c94bd2fa54232af51cbc51573"
|
|
10396
10396
|
},
|
|
10397
10397
|
{
|
|
10398
10398
|
"path": "src/bongos/cascade-dispatch.js",
|
|
@@ -10472,7 +10472,7 @@
|
|
|
10472
10472
|
{
|
|
10473
10473
|
"path": "src/bongos/middleware/rate-limit.js",
|
|
10474
10474
|
"mode": "0000644",
|
|
10475
|
-
"sha256": "
|
|
10475
|
+
"sha256": "efe34f92930419444ec31d84c7787488db4984ea761d1bb77d5375388758e68c"
|
|
10476
10476
|
},
|
|
10477
10477
|
{
|
|
10478
10478
|
"path": "src/bongos/module-overrides.js",
|
|
@@ -10572,7 +10572,7 @@
|
|
|
10572
10572
|
{
|
|
10573
10573
|
"path": "src/bongos/routes/auth.js",
|
|
10574
10574
|
"mode": "0000644",
|
|
10575
|
-
"sha256": "
|
|
10575
|
+
"sha256": "951276d7d3bd022cd9250fe8cd7bd141278d46c4bc6bc06463867f2889e52bc3"
|
|
10576
10576
|
},
|
|
10577
10577
|
{
|
|
10578
10578
|
"path": "src/bongos/routes/backup.js",
|
|
@@ -10692,7 +10692,7 @@
|
|
|
10692
10692
|
{
|
|
10693
10693
|
"path": "src/module-api.js",
|
|
10694
10694
|
"mode": "0000644",
|
|
10695
|
-
"sha256": "
|
|
10695
|
+
"sha256": "30a3d4c45217ac814326057165b0ff3f6627a03fb15e80586e6b602bfa9e8514"
|
|
10696
10696
|
},
|
|
10697
10697
|
{
|
|
10698
10698
|
"path": "src/module-loader/catalog.js",
|
|
@@ -12894,6 +12894,11 @@
|
|
|
12894
12894
|
"mode": "0000644",
|
|
12895
12895
|
"sha256": "5281b73558af27b1be5a839718d845ef47190734d248a3edb5d547c92621f432"
|
|
12896
12896
|
},
|
|
12897
|
+
{
|
|
12898
|
+
"path": "tests/hub_cookie_host_only.mjs",
|
|
12899
|
+
"mode": "0000644",
|
|
12900
|
+
"sha256": "96698c6be76c8c6d6cc5f09522d110514c420cb1a7279ca86871a034892c7328"
|
|
12901
|
+
},
|
|
12897
12902
|
{
|
|
12898
12903
|
"path": "tests/hub_disconnect_ui.mjs",
|
|
12899
12904
|
"mode": "0000644",
|
|
@@ -13267,7 +13272,7 @@
|
|
|
13267
13272
|
{
|
|
13268
13273
|
"path": "tests/landing_page.mjs",
|
|
13269
13274
|
"mode": "0000644",
|
|
13270
|
-
"sha256": "
|
|
13275
|
+
"sha256": "cb0dbcf0f4cc6fc67f7eeda609b2ea4c879bd8ad9efea7556fcbb8c7afe85bd4"
|
|
13271
13276
|
},
|
|
13272
13277
|
{
|
|
13273
13278
|
"path": "tests/leak_scan_allowlist.mjs",
|
|
@@ -14692,7 +14697,7 @@
|
|
|
14692
14697
|
{
|
|
14693
14698
|
"path": "tests/session_rename_fallback.mjs",
|
|
14694
14699
|
"mode": "0000644",
|
|
14695
|
-
"sha256": "
|
|
14700
|
+
"sha256": "9d6964a9df8051430d7cf495ca1fa93c22a60b9cf6c90174da209255ff3e551d"
|
|
14696
14701
|
},
|
|
14697
14702
|
{
|
|
14698
14703
|
"path": "tests/session_reward_on_land.mjs",
|
|
@@ -15122,7 +15127,7 @@
|
|
|
15122
15127
|
{
|
|
15123
15128
|
"path": "tests/subdomain_auth.mjs",
|
|
15124
15129
|
"mode": "0000644",
|
|
15125
|
-
"sha256": "
|
|
15130
|
+
"sha256": "a9f2b527557bdd86ccabb6c7aff779a235cdd20374f278232cfe7451d9f22d9b"
|
|
15126
15131
|
},
|
|
15127
15132
|
{
|
|
15128
15133
|
"path": "tests/sweep_app_account.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
|
+
- 434 operations across 67 resource groups
|
|
9
9
|
|
|
10
10
|
## Use it from your project
|
|
11
11
|
|
|
@@ -163,6 +163,8 @@ function createClient(opts = {}) {
|
|
|
163
163
|
getAuthWebAdmissionStatus: (args) => request("GET", "/auth/web/admission-status", { hasBody: false }, args),
|
|
164
164
|
// GET /auth/web/callback — rank: public — GET /auth/web/callback
|
|
165
165
|
getAuthWebCallback: (args) => request("GET", "/auth/web/callback", { hasBody: false }, args),
|
|
166
|
+
// GET /auth/web/handoff — rank: public — GET /auth/web/handoff
|
|
167
|
+
getAuthWebHandoff: (args) => request("GET", "/auth/web/handoff", { hasBody: false }, args),
|
|
166
168
|
// GET /auth/web/start — rank: public — GET /auth/web/start
|
|
167
169
|
getAuthWebStart: (args) => request("GET", "/auth/web/start", { hasBody: false }, args),
|
|
168
170
|
},
|
|
@@ -162,6 +162,8 @@ function createClient(opts = {}) {
|
|
|
162
162
|
getAuthWebAdmissionStatus: (args) => request("GET", "/auth/web/admission-status", { hasBody: false }, args),
|
|
163
163
|
// GET /auth/web/callback — rank: public — GET /auth/web/callback
|
|
164
164
|
getAuthWebCallback: (args) => request("GET", "/auth/web/callback", { hasBody: false }, args),
|
|
165
|
+
// GET /auth/web/handoff — rank: public — GET /auth/web/handoff
|
|
166
|
+
getAuthWebHandoff: (args) => request("GET", "/auth/web/handoff", { hasBody: false }, args),
|
|
165
167
|
// GET /auth/web/start — rank: public — GET /auth/web/start
|
|
166
168
|
getAuthWebStart: (args) => request("GET", "/auth/web/start", { hasBody: false }, args),
|
|
167
169
|
},
|
|
@@ -562,6 +562,8 @@ export interface BongosClient {
|
|
|
562
562
|
getAuthWebAdmissionStatus(args?: RequestArgs): Promise<GetAuthWebAdmissionStatusResponse>;
|
|
563
563
|
/** GET /auth/web/callback — rank: public */
|
|
564
564
|
getAuthWebCallback(args?: RequestArgs): Promise<ApiResponse>;
|
|
565
|
+
/** GET /auth/web/handoff — rank: public */
|
|
566
|
+
getAuthWebHandoff(args?: RequestArgs): Promise<ApiResponse>;
|
|
565
567
|
/** GET /auth/web/start — rank: public */
|
|
566
568
|
getAuthWebStart(args?: RequestArgs): Promise<ApiResponse>;
|
|
567
569
|
};
|
|
@@ -159,6 +159,8 @@ export function createClient(opts = {}) {
|
|
|
159
159
|
getAuthWebAdmissionStatus: (args) => request("GET", "/auth/web/admission-status", { hasBody: false }, args),
|
|
160
160
|
// GET /auth/web/callback — rank: public — GET /auth/web/callback
|
|
161
161
|
getAuthWebCallback: (args) => request("GET", "/auth/web/callback", { hasBody: false }, args),
|
|
162
|
+
// GET /auth/web/handoff — rank: public — GET /auth/web/handoff
|
|
163
|
+
getAuthWebHandoff: (args) => request("GET", "/auth/web/handoff", { hasBody: false }, args),
|
|
162
164
|
// GET /auth/web/start — rank: public — GET /auth/web/start
|
|
163
165
|
getAuthWebStart: (args) => request("GET", "/auth/web/start", { hasBody: false }, args),
|
|
164
166
|
},
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# 0145 — A free "own-repo" hosted project tier needs domain separation + per-project isolation (not a bare cloudbongos.com subdomain)
|
|
2
2
|
|
|
3
|
+
- **Status update 2026-09-29 — Finding 1 is FIXED by host-only hub cookies ([task 1004357](https://cloudbongos.com/builders#/task/1004357); build sequence step 1, the cookie half).** Option A was chosen over a separate registrable domain for halls: it needs no new domain, no DNS or TLS work and no change to any project's address, and it closes the hole for every hall already live. What changed, all in `src/bongos/routes/auth.js`:
|
|
4
|
+
- **Nothing the hub sets carries a `Domain` attribute any more.** The session is `__Host-bongos_session` over https (a browser only accepts a `__Host-` cookie that is Secure, `Path=/` and host-only), plain `bongos_session` on local http. The OAuth and Discord handshake cookies are host-only too.
|
|
5
|
+
- **`builders.` / `status.` / `www.` get the session through a one-time handoff.** A sign-in begun on one of them restarts on the canonical host (the only host the GitHub callback reaches). The canonical host then redirects back with a single-use, 60-second code bound to that one host, and `GET /auth/web/handoff` trades it for that host's own host-only copy of the same token. A builder already signed in on the apex who opens `builders.` skips GitHub entirely. A code is only ever minted for one of the hub's four hosts, never a hall.
|
|
6
|
+
- **Existing browsers are moved over.** Every hub API request that carries a pre-fix session cookie and no `__Host-` one re-issues the same token host-only and expires the apex-scoped copy.
|
|
7
|
+
- **Proof:** `tests/hub_cookie_host_only.mjs` runs the real router through an RFC 6265 cookie jar and asserts a hall at `<handle>.<apex>` receives no hub cookie after the full flow.
|
|
8
|
+
- **Still open from step 1:** CSRF tokens on state-changing hub endpoints. `SameSite=Lax` does not separate a hall from the hub, because they are the same site. The legacy session names are still ACCEPTED on read (so nobody was signed out at deploy), which leaves a hall able to plant a cookie under an old name. Retiring those names (task 1003706's Part 4) closes that. A token copied by a hall BEFORE this shipped stays valid until it expires or its builder signs out.
|
|
9
|
+
|
|
3
10
|
- **Status update 2026-09-28 — Finding 1 is OPEN again, and permanently ([ADR 0345](0345-we-host-every-projects-hall-and-its-app-deploys-where-the-owner-chooses.md) decision 6).** Project halls now stay hosted on our box, so ADR 0323's "closed by removing its precondition" below no longer holds. Measured: the hub still sets `Domain=.cloudbongos.com`, and a hall loads modules from its own repository, so a hall at one of our addresses can read a visiting hub builder's session. The sign-in hardening is a **blocking prerequisite again** for any new hall at one of our addresses, filed as [task 1004357](https://cloudbongos.com/builders#/task/1004357). A hall on the owner's own domain is not exposed.
|
|
4
11
|
- **Status:** **Superseded in part by [ADR 0323](0323-hosting-is-three-shapes-and-we-are-not-the-landlord.md)** (2026-09-21). Three of this ADR's decisions are replaced: the free tier becomes a **capped trial**, not all-free; customer projects leave the shared box for a managed platform, so **container isolation on our own box is no longer the plan**; and **Finding 1 is closed by removing its precondition** — with no customer code on a `cloudbongos.com` subdomain there is no tenant to receive the hub session cookie, so the sign-in hardening in the build sequence below is no longer a blocking prerequisite (it remains worth doing on its own merits). The two security FINDINGS below stand as analysis and are the reason the new direction is safe.
|
|
5
12
|
- **Status:** Accepted — owner decided 2026-07-15: **keep `cloudbongos.com`** (no separate domain), **container** isolation, **all-free** for now. Choosing the literal same domain makes hardening core sign-in a required prerequisite (see "Decisions" + "Required build sequence"). Build unblocked ([task 1002251](https://cloudbongos.com/builders#/task/1002251)); blocker 1000080 resolved.
|
package/docs/api/openapi.json
CHANGED
|
@@ -1662,6 +1662,27 @@
|
|
|
1662
1662
|
"security": []
|
|
1663
1663
|
}
|
|
1664
1664
|
},
|
|
1665
|
+
"/auth/web/handoff": {
|
|
1666
|
+
"get": {
|
|
1667
|
+
"operationId": "get_auth_web_handoff",
|
|
1668
|
+
"tags": [
|
|
1669
|
+
"auth"
|
|
1670
|
+
],
|
|
1671
|
+
"summary": "GET /auth/web/handoff",
|
|
1672
|
+
"description": "GET /auth/web/handoff?code=&return= — the far side of the one-time session handoff (task 1004357). The canonical host minted `code` for THIS host after a sign-in (or for a builder already signed in there); trading it sets this host's own host-only copy of the session, then lands on `return` — a relative path only, so the handoff can never become an open redirect. rank: public — auth establishment; the one-time code is the bearer, bound to this exact host, single-use and alive for HANDOFF_TTL_MS.\n\n**Rank:** `public` — No authentication — any caller.",
|
|
1673
|
+
"x-rank": "public",
|
|
1674
|
+
"x-source": "src/bongos/routes/auth.js",
|
|
1675
|
+
"responses": {
|
|
1676
|
+
"200": {
|
|
1677
|
+
"description": "Success."
|
|
1678
|
+
},
|
|
1679
|
+
"400": {
|
|
1680
|
+
"$ref": "#/components/responses/BadRequest"
|
|
1681
|
+
}
|
|
1682
|
+
},
|
|
1683
|
+
"security": []
|
|
1684
|
+
}
|
|
1685
|
+
},
|
|
1665
1686
|
"/auth/web/start": {
|
|
1666
1687
|
"get": {
|
|
1667
1688
|
"operationId": "get_auth_web_start",
|
|
@@ -27716,7 +27737,7 @@
|
|
|
27716
27737
|
"description": "A required dependency/feature is not configured or is temporarily down."
|
|
27717
27738
|
}
|
|
27718
27739
|
},
|
|
27719
|
-
"x-endpoint-count":
|
|
27740
|
+
"x-endpoint-count": 434,
|
|
27720
27741
|
"x-schema-count": 466,
|
|
27721
27742
|
"x-undocumented-bodies": 11,
|
|
27722
27743
|
"x-response-schemas": 319,
|
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. 434 endpoints across 75 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`.
|
|
@@ -61,7 +61,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
61
61
|
|---|---|---|---|---|
|
|
62
62
|
| GET | `/api/bongos/audit-log` | `metic+archon` | — | GET /api/bongos/audit-log?limit=&offset=&builder_id=&method= Paginated, newest-first. |
|
|
63
63
|
|
|
64
|
-
## `auth` (
|
|
64
|
+
## `auth` (15)
|
|
65
65
|
|
|
66
66
|
| Method | Path | Rank | Body | Description |
|
|
67
67
|
|---|---|---|---|---|
|
|
@@ -78,6 +78,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
78
78
|
| POST | `/api/bongos/auth/revoke-all` | `archon` | `builder_id` | POST /auth/revoke-all — V3.R38 / task 259. |
|
|
79
79
|
| GET | `/api/bongos/auth/web/admission-status` | `public` | — | GET /auth/web/admission-status?login=X — the probe renderAccessPendingPage polls (task 1002097). |
|
|
80
80
|
| GET | `/api/bongos/auth/web/callback` | `public` | — | OAuth callback; the state cookie + code are the bearer. |
|
|
81
|
+
| GET | `/api/bongos/auth/web/handoff` | `public` | — | GET /auth/web/handoff?code=&return= — the far side of the one-time session handoff (task 1004357). |
|
|
81
82
|
| GET | `/api/bongos/auth/web/start` | `public` | — | /auth/web — browser flow (used by the /builders page). |
|
|
82
83
|
|
|
83
84
|
## `autonomy` (8)
|
|
@@ -2643,5 +2643,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
2643
2643
|
the doorway loses nothing inside 1.x; it goes at the next MAJOR.
|
|
2644
2644
|
1.19.1076 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2645
2645
|
landed since 1.19.1075 with no explicit bump. run 36523068301. (task 1002620)
|
|
2646
|
+
1.19.1077 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2647
|
+
landed since 1.19.1076 with no explicit bump. run 36558431394. (task 1002620)
|
|
2646
2648
|
---------------------------------------------------------------------------
|
|
2647
2649
|
```
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.1077",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.19.
|
|
9
|
+
"version": "1.19.1077",
|
|
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.19.
|
|
3
|
+
"version": "1.19.1077",
|
|
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
|
@@ -7849,5 +7849,11 @@
|
|
|
7849
7849
|
"id": "1003898",
|
|
7850
7850
|
"text": "The dev box's removal is written up in one decision record (ADR 0346), and the 20 older records that described it now point there. The live guides, the design mockups and the README no longer tell anyone to use a dev box."
|
|
7851
7851
|
}
|
|
7852
|
+
],
|
|
7853
|
+
"1.19.1077": [
|
|
7854
|
+
{
|
|
7855
|
+
"id": "1004357",
|
|
7856
|
+
"text": "A project's hall on one of our addresses can no longer read the sign-in of a hub builder who visits it. Hub sign-in cookies now stay on the exact address that set them. builders. and status. still sign you in automatically thr"
|
|
7857
|
+
}
|
|
7852
7858
|
]
|
|
7853
7859
|
}
|
package/src/bongos/auth.js
CHANGED
|
@@ -69,7 +69,14 @@ const MAX_AUTH_TOKEN_CANDIDATES = 6;
|
|
|
69
69
|
// in the wild, so the list is three long, not two (task 1003704). The server
|
|
70
70
|
// SETS only the head; routes/auth.js clears the tail on the next write. Part 4
|
|
71
71
|
// (task 1003706) retires the tail behind a test of its absence.
|
|
72
|
-
|
|
72
|
+
//
|
|
73
|
+
// The head is `__Host-bongos_session` (task 1004357, ADR 0145 Finding 1): a
|
|
74
|
+
// browser only accepts a `__Host-` cookie that is Secure, Path=/ and carries NO
|
|
75
|
+
// Domain attribute, so the prefix itself guarantees the session never reaches a
|
|
76
|
+
// project hall on another subdomain. A browser refuses a `__Host-` cookie over
|
|
77
|
+
// plain http, so localhost dev keeps setting `bongos_session` (host-only there
|
|
78
|
+
// too) — routes/auth.js picks between the first two by the request's scheme.
|
|
79
|
+
const SESSION_COOKIE_NAMES = Object.freeze(['__Host-bongos_session', 'bongos_session', 'gds_session', 'pms_session']);
|
|
73
80
|
|
|
74
81
|
function extractTokens(req) {
|
|
75
82
|
const out = [];
|
|
@@ -157,7 +157,7 @@ function pruneAndCount(bucket, now, windowMs) {
|
|
|
157
157
|
// Deliberately duplicated from SESSION_COOKIE_NAMES in src/bongos/auth.js rather
|
|
158
158
|
// than imported: this middleware is dependency-free by design. The copy is pinned
|
|
159
159
|
// against the real list by tests/session_rename_fallback.mjs (task 1003704).
|
|
160
|
-
const SESSION_COOKIE_RES = ['bongos_session', 'gds_session', 'pms_session']
|
|
160
|
+
const SESSION_COOKIE_RES = ['__Host-bongos_session', 'bongos_session', 'gds_session', 'pms_session']
|
|
161
161
|
.map((n) => new RegExp('(?:^|;\\s*)' + n + '=([^;]+)'));
|
|
162
162
|
|
|
163
163
|
function extractSessionKey(req) {
|