@bongos/core 1.19.330 → 1.19.331
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 +11 -11
- package/config/branding.neutral.json +1 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/src/bongos/routes/auth.js +19 -10
- package/src/module-api.js +3 -1
- package/tests/post_login_landing.mjs +35 -35
package/.bongos-core.json
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
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.331",
|
|
6
|
+
"core_contract": "1.19.331",
|
|
7
|
+
"source_commit": "cc85e05304300cfad9f701b9f9432f1f74b5cf53",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-08-
|
|
9
|
+
"built_at": "2026-08-25T00:01:28.994Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 324,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
19
|
"file_count": 1811,
|
|
20
|
-
"tree_sha256": "
|
|
20
|
+
"tree_sha256": "68c81c790b852a7c79d261a2d55f43ec6c2dbc17f1e89a80757b41023f929748",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -382,7 +382,7 @@
|
|
|
382
382
|
{
|
|
383
383
|
"path": "config/branding.neutral.json",
|
|
384
384
|
"mode": "0000644",
|
|
385
|
-
"sha256": "
|
|
385
|
+
"sha256": "7b204f9621ced68ef54b9f74aa8fbec53ab2fa81b0380133c762950ac4de1479"
|
|
386
386
|
},
|
|
387
387
|
{
|
|
388
388
|
"path": "config/design-tokens.neutral.json",
|
|
@@ -4667,12 +4667,12 @@
|
|
|
4667
4667
|
{
|
|
4668
4668
|
"path": "package-lock.json",
|
|
4669
4669
|
"mode": "0000644",
|
|
4670
|
-
"sha256": "
|
|
4670
|
+
"sha256": "0d95e9a5ad8a6d63dba589cbe1bc8f4497bebf1470776bdbfcf21f470a7bb81e"
|
|
4671
4671
|
},
|
|
4672
4672
|
{
|
|
4673
4673
|
"path": "package.json",
|
|
4674
4674
|
"mode": "0000644",
|
|
4675
|
-
"sha256": "
|
|
4675
|
+
"sha256": "ab2dde9733b1e67f8099474fc5d998b4e4c2060b2ac239ddd16db36bd1570fa5"
|
|
4676
4676
|
},
|
|
4677
4677
|
{
|
|
4678
4678
|
"path": "public-docs/index.html",
|
|
@@ -6342,7 +6342,7 @@
|
|
|
6342
6342
|
{
|
|
6343
6343
|
"path": "src/bongos/routes/auth.js",
|
|
6344
6344
|
"mode": "0000644",
|
|
6345
|
-
"sha256": "
|
|
6345
|
+
"sha256": "bb62110c21a07745a8bcfd3e2cf94f29deec1de5baea9d62fa903febcca54f2b"
|
|
6346
6346
|
},
|
|
6347
6347
|
{
|
|
6348
6348
|
"path": "src/bongos/routes/backup.js",
|
|
@@ -6452,7 +6452,7 @@
|
|
|
6452
6452
|
{
|
|
6453
6453
|
"path": "src/module-api.js",
|
|
6454
6454
|
"mode": "0000644",
|
|
6455
|
-
"sha256": "
|
|
6455
|
+
"sha256": "11aa1bff9445edc29d7fe5034536edc7a6758e2f3d4c91d4b16a45c8ca1091ba"
|
|
6456
6456
|
},
|
|
6457
6457
|
{
|
|
6458
6458
|
"path": "src/module-loader/catalog.js",
|
|
@@ -8277,7 +8277,7 @@
|
|
|
8277
8277
|
{
|
|
8278
8278
|
"path": "tests/post_login_landing.mjs",
|
|
8279
8279
|
"mode": "0000644",
|
|
8280
|
-
"sha256": "
|
|
8280
|
+
"sha256": "08a7496090f4617cef7e270afddcef8ee3a0b58bff6920b56bc2f2bbb49ed4ca"
|
|
8281
8281
|
},
|
|
8282
8282
|
{
|
|
8283
8283
|
"path": "tests/pre_compact.mjs",
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
}
|
|
104
104
|
},
|
|
105
105
|
"landing": {
|
|
106
|
-
"_note": "Where a successful sign-in lands when no explicit ?return= / same-apex Referer was carried (auth.js postLoginLanding). Portable default '/builders' — the hall always exists. A platform-home instance points this at its own front door (cloudbongos.com → '/
|
|
106
|
+
"_note": "Where a successful sign-in lands when no explicit ?return= / same-apex Referer was carried (auth.js postLoginLanding). Portable default '/builders' — the hall always exists. A platform-home instance points this at its own front door (cloudbongos.com → '/', its landing page; the retired '/gate/' orb sky folds to '/' — task 1003233). Validated through the open-redirect allowlist; env override <PREFIX>_POST_LOGIN_LANDING. Task 1002240.",
|
|
107
107
|
"postLogin": "/builders"
|
|
108
108
|
},
|
|
109
109
|
"envPrefix": "CLOUDBONGOS"
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.331",
|
|
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.331",
|
|
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.331",
|
|
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",
|
|
@@ -273,18 +273,27 @@ function configuredOAuthOrigin() {
|
|
|
273
273
|
// was stashed for this sign-in. Configurable per instance via
|
|
274
274
|
// branding.landing.postLogin (env override <PREFIX>_POST_LOGIN_LANDING) so a
|
|
275
275
|
// platform-home instance can land visitors on its OWN front door —
|
|
276
|
-
// cloudbongos.com
|
|
277
|
-
// the
|
|
278
|
-
// (task 1002240). Every other instance keeps the portable default
|
|
279
|
-
// the hall always exists, a
|
|
280
|
-
// run through the SAME open-redirect allowlist as ?return=
|
|
281
|
-
// misconfigured landing can never become an open redirect;
|
|
282
|
-
// absent falls back to '/builders'. Takes an optional
|
|
283
|
-
// path is unit-testable without disk I/O (mirrors
|
|
276
|
+
// cloudbongos.com points it at '/' (its landing page) so a visitor who signs in
|
|
277
|
+
// from the front door returns to it, never auto-redirected into the builders'
|
|
278
|
+
// hall (task 1002240). Every other instance keeps the portable default
|
|
279
|
+
// '/builders': the hall always exists, a front door of its own may not. The
|
|
280
|
+
// configured value is run through the SAME open-redirect allowlist as ?return=
|
|
281
|
+
// (safeReturnTo), so a misconfigured landing can never become an open redirect;
|
|
282
|
+
// anything unsafe or absent falls back to '/builders'. Takes an optional
|
|
283
|
+
// resolved pack so the pure path is unit-testable without disk I/O (mirrors
|
|
284
|
+
// clientBranding()).
|
|
285
|
+
//
|
|
286
|
+
// /gate/ — the orb sky this knob was first written for — was retired with the
|
|
287
|
+
// landing-page front door (task 1002743) and the apex answers a bare 404 there,
|
|
288
|
+
// so a pack still pointing at it would land every cookie-less sign-in on a
|
|
289
|
+
// 404. It folds to '/' instead (task 1003233).
|
|
290
|
+
const RETIRED_LANDINGS = new Set(['/gate']);
|
|
284
291
|
function postLoginLanding(brand) {
|
|
285
292
|
try {
|
|
286
293
|
const b = brand || branding();
|
|
287
|
-
|
|
294
|
+
const configured = safeReturnTo(b.landing?.postLogin) || '/builders';
|
|
295
|
+
const bare = configured.replace(/\/+$/, '').split('?')[0] || '/';
|
|
296
|
+
return RETIRED_LANDINGS.has(bare) ? '/' : configured;
|
|
288
297
|
} catch {
|
|
289
298
|
return '/builders';
|
|
290
299
|
}
|
|
@@ -568,7 +577,7 @@ module.exports = function buildAuthRouter() {
|
|
|
568
577
|
// Land back where sign-in began if a validated return target was stashed
|
|
569
578
|
// (e.g. the builders subdomain bounced through here); else the instance's
|
|
570
579
|
// configured post-login landing (default '/builders'; cloudbongos.com →
|
|
571
|
-
// /
|
|
580
|
+
// '/', its landing page — task 1002240).
|
|
572
581
|
const returnTo = safeReturnTo(parseCookie(req, RETURN_COOKIE));
|
|
573
582
|
res.clearCookie(RETURN_COOKIE, domainOpts);
|
|
574
583
|
res.redirect(returnTo || postLoginLanding());
|
package/src/module-api.js
CHANGED
|
@@ -1087,8 +1087,10 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
|
|
|
1087
1087
|
// landed since 1.19.328 with no explicit bump. run 32788827293. (task 1002620)
|
|
1088
1088
|
// 1.19.330 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1089
1089
|
// landed since 1.19.329 with no explicit bump. run 32789596635. (task 1002620)
|
|
1090
|
+
// 1.19.331 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1091
|
+
// landed since 1.19.330 with no explicit bump. run 32791877167. (task 1002620)
|
|
1090
1092
|
// ---------------------------------------------------------------------------
|
|
1091
|
-
const CORE_VERSION = '1.19.
|
|
1093
|
+
const CORE_VERSION = '1.19.331'; // CI auto-patch carrier (ADR 0161); see changelog above
|
|
1092
1094
|
|
|
1093
1095
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
1094
1096
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
// tests/post_login_landing.mjs —
|
|
1
|
+
// tests/post_login_landing.mjs — where a cookie-less sign-in lands (task 1003233,
|
|
2
|
+
// the pre-walk ops check for goal 1000058).
|
|
2
3
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// hardened through the SAME open-redirect allowlist as ?return= (safeReturnTo),
|
|
10
|
-
// so a misconfigured landing can never become an open redirect.
|
|
11
|
-
//
|
|
12
|
-
// Pure function, no DB — requiring the route module does not open a pool.
|
|
4
|
+
// The walk found that config/branding.neutral.json still documented the
|
|
5
|
+
// platform-home landing as '/gate/' — the orb sky retired with the landing-page
|
|
6
|
+
// front door (task 1002743), a bare 404 on the apex since. The live instance
|
|
7
|
+
// pack already points at '/', so nothing was broken on the box; this pins the
|
|
8
|
+
// fold that keeps an old pack from ever landing a founder on that 404, and the
|
|
9
|
+
// note that no longer sends an operator there.
|
|
13
10
|
|
|
11
|
+
import { strict as assert } from 'node:assert';
|
|
12
|
+
import { test } from 'node:test';
|
|
14
13
|
import { createRequire } from 'node:module';
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
import fs from 'node:fs';
|
|
15
|
+
import path from 'node:path';
|
|
16
|
+
import { fileURLToPath } from 'node:url';
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
else { fail++; console.log(` FAIL ${msg}`); }
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
console.log('\npostLoginLanding — portable default is the hall:');
|
|
25
|
-
ok(postLoginLanding({}) === '/builders', 'no landing config → /builders');
|
|
26
|
-
ok(postLoginLanding({ landing: {} }) === '/builders', 'empty landing block → /builders');
|
|
27
|
-
// No-arg path reads the real committed neutral pack, which ships postLogin:'/builders'.
|
|
28
|
-
ok(postLoginLanding() === '/builders', 'committed neutral pack → /builders');
|
|
18
|
+
const require = createRequire(import.meta.url);
|
|
19
|
+
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
20
|
+
const { postLoginLanding } = require(path.join(ROOT, 'src/bongos/routes/auth.js'));
|
|
29
21
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
22
|
+
test('a pack that still names the retired /gate/ lands on the front door, not a 404', () => {
|
|
23
|
+
assert.equal(postLoginLanding({ landing: { postLogin: '/gate/' } }), '/');
|
|
24
|
+
assert.equal(postLoginLanding({ landing: { postLogin: '/gate' } }), '/');
|
|
25
|
+
});
|
|
33
26
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
27
|
+
test('every live landing passes through untouched; absent or unsafe falls back to the hall', () => {
|
|
28
|
+
assert.equal(postLoginLanding({ landing: { postLogin: '/' } }), '/', 'cloudbongos.com today');
|
|
29
|
+
assert.equal(postLoginLanding({ landing: { postLogin: '/projects' } }), '/projects');
|
|
30
|
+
assert.equal(postLoginLanding({ landing: { postLogin: '/builders' } }), '/builders');
|
|
31
|
+
assert.equal(postLoginLanding({ landing: {} }), '/builders');
|
|
32
|
+
assert.equal(postLoginLanding({}), '/builders');
|
|
33
|
+
assert.equal(postLoginLanding({ landing: { postLogin: 'https://evil.example/x' } }), '/builders', 'the open-redirect allowlist still governs');
|
|
34
|
+
assert.equal(postLoginLanding({ landing: { postLogin: '//evil.example' } }), '/builders');
|
|
35
|
+
});
|
|
40
36
|
|
|
41
|
-
|
|
42
|
-
|
|
37
|
+
test('the neutral pack no longer documents the retired landing as live', () => {
|
|
38
|
+
const pack = JSON.parse(fs.readFileSync(path.join(ROOT, 'config/branding.neutral.json'), 'utf8'));
|
|
39
|
+
assert.equal(pack.landing.postLogin, '/builders', 'the portable default is unchanged');
|
|
40
|
+
assert.doesNotMatch(pack.landing._note, /'\/gate\/', the orbs/, 'the note stops calling /gate/ a front door');
|
|
41
|
+
assert.match(pack.landing._note, /retired '\/gate\/'/, 'and says what became of it');
|
|
42
|
+
});
|