@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 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.330",
6
- "core_contract": "1.19.330",
7
- "source_commit": "acf9d9dd29679f6c527824b2803950999664958e",
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-24T23:30:13.047Z",
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": "40c5457e809c4588d34d3be61fccf5c49606fc002cbf64170aaf50c56ffa7652",
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": "d1d2622e002edaed8a98deb8b69ff5a77c6eeab7993e3b0e7f1513f32ff027c6"
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": "9bb6d40a874f3fa2ac02ff97883933dd86765c7c0d0f12aee6914961584b9702"
4670
+ "sha256": "0d95e9a5ad8a6d63dba589cbe1bc8f4497bebf1470776bdbfcf21f470a7bb81e"
4671
4671
  },
4672
4672
  {
4673
4673
  "path": "package.json",
4674
4674
  "mode": "0000644",
4675
- "sha256": "2b5ad8d6ae7d079ecc2d53f39c32f076521b843514fe80b71851f80440463ab6"
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": "c5688194f21600a64ced6b27aa5c12b4f580db786ffcf85a151422635269aa40"
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": "da4209544a6cd0b389cccc563cd45f6c04fc22816f7b132772024f77fa2900f8"
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": "942b2a9b0d5e2d2dd337b3ff738b7193ce0936d196a936f61bef51b74ed11ad0"
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 → '/gate/', the orbs). Validated through the open-redirect allowlist; env override <PREFIX>_POST_LOGIN_LANDING. Task 1002240.",
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.330",
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.330",
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.330",
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 sets it to /gate/ (the orbs) so a visitor who signs in from
277
- // the orbs returns to the orbs, never auto-redirected into the builders' hall
278
- // (task 1002240). Every other instance keeps the portable default '/builders':
279
- // the hall always exists, a /gate/ orbs site does not. The configured value is
280
- // run through the SAME open-redirect allowlist as ?return= (safeReturnTo), so a
281
- // misconfigured landing can never become an open redirect; anything unsafe or
282
- // absent falls back to '/builders'. Takes an optional resolved pack so the pure
283
- // path is unit-testable without disk I/O (mirrors clientBranding()).
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
- return safeReturnTo(b.landing?.postLogin) || '/builders';
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
- // /gate/, the orbs — task 1002240).
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.330'; // CI auto-patch carrier (ADR 0161); see changelog above
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 — the configurable post-sign-in landing (task 1002240).
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
- // postLoginLanding(brand) resolves the redirect target used after a successful
4
- // web sign-in when NO explicit ?return= / same-apex Referer was carried. It is
5
- // the ONE seam that lets a platform-home instance (cloudbongos.com) land a
6
- // visitor back on its orbs (/gate/) instead of the builders' hall, while every
7
- // other instance keeps the portable '/builders' default (the hall always
8
- // exists; a /gate/ orbs site does not). Pure over an injected brand pack, and
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
- const require = createRequire(import.meta.url);
16
- const { postLoginLanding } = require('../src/bongos/routes/auth.js');
14
+ import fs from 'node:fs';
15
+ import path from 'node:path';
16
+ import { fileURLToPath } from 'node:url';
17
17
 
18
- let pass = 0, fail = 0;
19
- function ok(cond, msg) {
20
- if (cond) { pass++; console.log(` ok ${msg}`); }
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
- console.log('\npostLoginLanding — an instance lands visitors on its own front door:');
31
- ok(postLoginLanding({ landing: { postLogin: '/gate/' } }) === '/gate/', 'cloudbongos orbs → /gate/');
32
- ok(postLoginLanding({ landing: { postLogin: '/gate/?entered=1' } }) === '/gate/?entered=1', 'relative path with query preserved');
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
- console.log('\npostLoginLanding — a misconfigured landing can never become an open redirect:');
35
- ok(postLoginLanding({ landing: { postLogin: 'https://evil.com/' } }) === '/builders', 'foreign https origin → fallback');
36
- ok(postLoginLanding({ landing: { postLogin: '//evil.com' } }) === '/builders', 'protocol-relative → fallback');
37
- ok(postLoginLanding({ landing: { postLogin: 'javascript:alert(1)' } }) === '/builders', 'javascript: scheme → fallback');
38
- ok(postLoginLanding({ landing: { postLogin: '/a\\b' } }) === '/builders', 'backslash path → fallback');
39
- ok(postLoginLanding({ landing: { postLogin: 42 } }) === '/builders', 'non-string value → fallback');
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
- console.log(`\nPost-login-landing tests: ${pass} passed, ${fail} failed`);
42
- if (fail) process.exit(1);
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
+ });