@bongos/core 1.19.582 → 1.19.584

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.
@@ -3,9 +3,9 @@
3
3
  "generator": "scripts/gds/copy-inventory.js",
4
4
  "goal": 1000074,
5
5
  "counts": {
6
- "strings": 1709,
7
- "unique_ids": 1478,
8
- "certain": 1709,
6
+ "strings": 1710,
7
+ "unique_ids": 1479,
8
+ "certain": 1710,
9
9
  "heuristic": 0,
10
10
  "duplicate_ids": 162
11
11
  },
@@ -23,7 +23,7 @@
23
23
  "landing": {
24
24
  "at": "modules/public-landing/public",
25
25
  "files": 5,
26
- "strings": 372
26
+ "strings": 373
27
27
  }
28
28
  },
29
29
  "blind_spots": [
@@ -92,9 +92,9 @@
92
92
  "modules/public-landing/public/projects.html:1018",
93
93
  "modules/public-landing/public/projects.html:1049",
94
94
  "modules/public-landing/public/projects.html:1088",
95
- "modules/public-landing/public/projects.html:1160",
96
- "modules/public-landing/public/projects.html:1200",
97
- "modules/public-landing/public/projects.html:1213"
95
+ "modules/public-landing/public/projects.html:1167",
96
+ "modules/public-landing/public/projects.html:1207",
97
+ "modules/public-landing/public/projects.html:1220"
98
98
  ]
99
99
  },
100
100
  {
@@ -106,7 +106,7 @@
106
106
  "modules/public-landing/public/contact.html:71",
107
107
  "modules/public-landing/public/index.html:900",
108
108
  "modules/public-landing/public/privacy.html:80",
109
- "modules/public-landing/public/projects.html:1338",
109
+ "modules/public-landing/public/projects.html:1345",
110
110
  "modules/public-landing/public/terms.html:84"
111
111
  ]
112
112
  },
@@ -119,8 +119,8 @@
119
119
  "modules/public-landing/public/projects.html:1019",
120
120
  "modules/public-landing/public/projects.html:1052",
121
121
  "modules/public-landing/public/projects.html:1091",
122
- "modules/public-landing/public/projects.html:1161",
123
- "modules/public-landing/public/projects.html:1201"
122
+ "modules/public-landing/public/projects.html:1168",
123
+ "modules/public-landing/public/projects.html:1208"
124
124
  ]
125
125
  },
126
126
  {
@@ -132,7 +132,7 @@
132
132
  "modules/public-landing/public/contact.html:71",
133
133
  "modules/public-landing/public/index.html:900",
134
134
  "modules/public-landing/public/privacy.html:80",
135
- "modules/public-landing/public/projects.html:1338",
135
+ "modules/public-landing/public/projects.html:1345",
136
136
  "modules/public-landing/public/terms.html:84"
137
137
  ]
138
138
  },
@@ -183,7 +183,7 @@
183
183
  "modules/public-landing/public/index.html:906",
184
184
  "modules/public-landing/public/projects.html:550",
185
185
  "modules/public-landing/public/projects.html:550",
186
- "modules/public-landing/public/projects.html:1338"
186
+ "modules/public-landing/public/projects.html:1345"
187
187
  ]
188
188
  },
189
189
  {
@@ -218,8 +218,8 @@
218
218
  "at": [
219
219
  "modules/public-landing/public/projects.html:864",
220
220
  "modules/public-landing/public/projects.html:865",
221
- "modules/public-landing/public/projects.html:1240",
222
- "modules/public-landing/public/projects.html:1241"
221
+ "modules/public-landing/public/projects.html:1247",
222
+ "modules/public-landing/public/projects.html:1248"
223
223
  ]
224
224
  },
225
225
  {
@@ -13011,7 +13011,7 @@
13011
13011
  "surface": "landing",
13012
13012
  "text": "A non-profit, capture-resistant commons.",
13013
13013
  "file": "modules/public-landing/public/projects.html",
13014
- "line": 1338,
13014
+ "line": 1345,
13015
13015
  "origin": "html-text",
13016
13016
  "confidence": "certain"
13017
13017
  },
@@ -13029,7 +13029,7 @@
13029
13029
  "surface": "landing",
13030
13030
  "text": "A pair of bongo drums",
13031
13031
  "file": "modules/public-landing/public/projects.html",
13032
- "line": 1267,
13032
+ "line": 1274,
13033
13033
  "origin": "html-attr:aria-label",
13034
13034
  "confidence": "certain"
13035
13035
  },
@@ -13218,7 +13218,7 @@
13218
13218
  "surface": "landing",
13219
13219
  "text": "Builders' hall",
13220
13220
  "file": "modules/public-landing/public/projects.html",
13221
- "line": 1338,
13221
+ "line": 1345,
13222
13222
  "origin": "html-text",
13223
13223
  "confidence": "certain"
13224
13224
  },
@@ -13245,7 +13245,7 @@
13245
13245
  "surface": "landing",
13246
13246
  "text": "Built by agents, on",
13247
13247
  "file": "modules/public-landing/public/projects.html",
13248
- "line": 1338,
13248
+ "line": 1345,
13249
13249
  "origin": "html-text",
13250
13250
  "confidence": "certain"
13251
13251
  },
@@ -13425,7 +13425,7 @@
13425
13425
  "surface": "landing",
13426
13426
  "text": "Create my project",
13427
13427
  "file": "modules/public-landing/public/projects.html",
13428
- "line": 1214,
13428
+ "line": 1221,
13429
13429
  "origin": "html-text",
13430
13430
  "confidence": "certain"
13431
13431
  },
@@ -13461,7 +13461,7 @@
13461
13461
  "surface": "landing",
13462
13462
  "text": "Domain you own",
13463
13463
  "file": "modules/public-landing/public/projects.html",
13464
- "line": 1189,
13464
+ "line": 1196,
13465
13465
  "origin": "html-text",
13466
13466
  "confidence": "certain"
13467
13467
  },
@@ -13722,7 +13722,7 @@
13722
13722
  "surface": "landing",
13723
13723
  "text": "GitHub username",
13724
13724
  "file": "modules/public-landing/public/projects.html",
13725
- "line": 1240,
13725
+ "line": 1247,
13726
13726
  "origin": "html-text",
13727
13727
  "confidence": "certain"
13728
13728
  },
@@ -13731,7 +13731,7 @@
13731
13731
  "surface": "landing",
13732
13732
  "text": "GitHub username",
13733
13733
  "file": "modules/public-landing/public/projects.html",
13734
- "line": 1241,
13734
+ "line": 1248,
13735
13735
  "origin": "html-attr:placeholder",
13736
13736
  "confidence": "certain"
13737
13737
  },
@@ -13812,7 +13812,7 @@
13812
13812
  "surface": "landing",
13813
13813
  "text": "Invite builders",
13814
13814
  "file": "modules/public-landing/public/projects.html",
13815
- "line": 1237,
13815
+ "line": 1244,
13816
13816
  "origin": "html-text",
13817
13817
  "confidence": "certain"
13818
13818
  },
@@ -13848,7 +13848,7 @@
13848
13848
  "surface": "landing",
13849
13849
  "text": "Its address in the sky",
13850
13850
  "file": "modules/public-landing/public/projects.html",
13851
- "line": 1176,
13851
+ "line": 1183,
13852
13852
  "origin": "html-text",
13853
13853
  "confidence": "certain"
13854
13854
  },
@@ -14019,7 +14019,7 @@
14019
14019
  "surface": "landing",
14020
14020
  "text": "Next →",
14021
14021
  "file": "modules/public-landing/public/projects.html",
14022
- "line": 1161,
14022
+ "line": 1168,
14023
14023
  "origin": "html-text",
14024
14024
  "confidence": "certain"
14025
14025
  },
@@ -14028,7 +14028,7 @@
14028
14028
  "surface": "landing",
14029
14029
  "text": "Next →",
14030
14030
  "file": "modules/public-landing/public/projects.html",
14031
- "line": 1201,
14031
+ "line": 1208,
14032
14032
  "origin": "html-text",
14033
14033
  "confidence": "certain"
14034
14034
  },
@@ -14109,7 +14109,7 @@
14109
14109
  "surface": "landing",
14110
14110
  "text": "One tap files the request and the platform starts standing your project up — server, database, address. Here's the beat you're about to drop:",
14111
14111
  "file": "modules/public-landing/public/projects.html",
14112
- "line": 1209,
14112
+ "line": 1216,
14113
14113
  "origin": "html-text",
14114
14114
  "confidence": "certain"
14115
14115
  },
@@ -14163,7 +14163,7 @@
14163
14163
  "surface": "landing",
14164
14164
  "text": "Open source (AGPL-3.0)",
14165
14165
  "file": "modules/public-landing/public/projects.html",
14166
- "line": 1338,
14166
+ "line": 1345,
14167
14167
  "origin": "html-text",
14168
14168
  "confidence": "certain"
14169
14169
  },
@@ -14199,7 +14199,7 @@
14199
14199
  "surface": "landing",
14200
14200
  "text": "Optional — invite people by GitHub username. Each one gets an invitation to accept from their own projects page, and they need to have signed in here at least once. Skip this and invite anyone later; nothing about your project waits on it.",
14201
14201
  "file": "modules/public-landing/public/projects.html",
14202
- "line": 1238,
14202
+ "line": 1245,
14203
14203
  "origin": "html-text",
14204
14204
  "confidence": "certain"
14205
14205
  },
@@ -14280,7 +14280,7 @@
14280
14280
  "surface": "landing",
14281
14281
  "text": "Project handle",
14282
14282
  "file": "modules/public-landing/public/projects.html",
14283
- "line": 1179,
14283
+ "line": 1186,
14284
14284
  "origin": "html-text",
14285
14285
  "confidence": "certain"
14286
14286
  },
@@ -14316,7 +14316,7 @@
14316
14316
  "surface": "landing",
14317
14317
  "text": "Projects aren’t created from this instance — this is a project, not the platform that hosts them.",
14318
14318
  "file": "modules/public-landing/public/projects.html",
14319
- "line": 1330,
14319
+ "line": 1337,
14320
14320
  "origin": "html-text",
14321
14321
  "confidence": "certain"
14322
14322
  },
@@ -14469,7 +14469,7 @@
14469
14469
  "surface": "landing",
14470
14470
  "text": "Ready to roll",
14471
14471
  "file": "modules/public-landing/public/projects.html",
14472
- "line": 1208,
14472
+ "line": 1215,
14473
14473
  "origin": "html-text",
14474
14474
  "confidence": "certain"
14475
14475
  },
@@ -14775,7 +14775,7 @@
14775
14775
  "surface": "landing",
14776
14776
  "text": "Start without an address — possible, but sign-in on your project can’t be set up until it has one.",
14777
14777
  "file": "modules/public-landing/public/projects.html",
14778
- "line": 1196,
14778
+ "line": 1203,
14779
14779
  "origin": "html-text",
14780
14780
  "confidence": "certain"
14781
14781
  },
@@ -14883,7 +14883,7 @@
14883
14883
  "surface": "landing",
14884
14884
  "text": "The drums are rolling",
14885
14885
  "file": "modules/public-landing/public/projects.html",
14886
- "line": 1223,
14886
+ "line": 1230,
14887
14887
  "origin": "html-text",
14888
14888
  "confidence": "certain"
14889
14889
  },
@@ -14901,7 +14901,7 @@
14901
14901
  "surface": "landing",
14902
14902
  "text": "The handle names your project on the platform — and its address comes with it. Once it stands up, a few GitHub steps (the next screen walks you through them) switch sign-in on.",
14903
14903
  "file": "modules/public-landing/public/projects.html",
14904
- "line": 1177,
14904
+ "line": 1184,
14905
14905
  "origin": "html-text",
14906
14906
  "confidence": "certain"
14907
14907
  },
@@ -14991,7 +14991,7 @@
14991
14991
  "surface": "landing",
14992
14992
  "text": "These are the same steps however a project is created — nothing here is special to this page.",
14993
14993
  "file": "modules/public-landing/public/projects.html",
14994
- "line": 1258,
14994
+ "line": 1265,
14995
14995
  "origin": "html-text",
14996
14996
  "confidence": "certain"
14997
14997
  },
@@ -15018,7 +15018,7 @@
15018
15018
  "surface": "landing",
15019
15019
  "text": "This files the request; the control plane does the real standup and nothing touches servers from this page. You'll get the few steps only you can do right after.",
15020
15020
  "file": "modules/public-landing/public/projects.html",
15021
- "line": 1216,
15021
+ "line": 1223,
15022
15022
  "origin": "html-text",
15023
15023
  "confidence": "certain"
15024
15024
  },
@@ -15108,7 +15108,16 @@
15108
15108
  "surface": "landing",
15109
15109
  "text": "Use a domain I own instead",
15110
15110
  "file": "modules/public-landing/public/projects.html",
15111
- "line": 1187,
15111
+ "line": 1194,
15112
+ "origin": "html-text",
15113
+ "confidence": "certain"
15114
+ },
15115
+ {
15116
+ "id": "9be878db0d86",
15117
+ "surface": "landing",
15118
+ "text": "Use my GitHub repositories instead",
15119
+ "file": "modules/public-landing/public/projects.html",
15120
+ "line": 1163,
15112
15121
  "origin": "html-text",
15113
15122
  "confidence": "certain"
15114
15123
  },
@@ -15504,7 +15513,7 @@
15504
15513
  "surface": "landing",
15505
15514
  "text": "Your steps — the parts only you can play",
15506
15515
  "file": "modules/public-landing/public/projects.html",
15507
- "line": 1253,
15516
+ "line": 1260,
15508
15517
  "origin": "html-text",
15509
15518
  "confidence": "certain"
15510
15519
  },
@@ -15522,7 +15531,7 @@
15522
15531
  "surface": "landing",
15523
15532
  "text": "Yours from the moment it stands up. You can point a domain you own at it any time.",
15524
15533
  "file": "modules/public-landing/public/projects.html",
15525
- "line": 1185,
15534
+ "line": 1192,
15526
15535
  "origin": "html-text",
15527
15536
  "confidence": "certain"
15528
15537
  },
@@ -16179,7 +16188,7 @@
16179
16188
  "surface": "landing",
16180
16189
  "text": "← Back",
16181
16190
  "file": "modules/public-landing/public/projects.html",
16182
- "line": 1160,
16191
+ "line": 1167,
16183
16192
  "origin": "html-text",
16184
16193
  "confidence": "certain"
16185
16194
  },
@@ -16188,7 +16197,7 @@
16188
16197
  "surface": "landing",
16189
16198
  "text": "← Back",
16190
16199
  "file": "modules/public-landing/public/projects.html",
16191
- "line": 1200,
16200
+ "line": 1207,
16192
16201
  "origin": "html-text",
16193
16202
  "confidence": "certain"
16194
16203
  },
@@ -16197,7 +16206,7 @@
16197
16206
  "surface": "landing",
16198
16207
  "text": "← Back",
16199
16208
  "file": "modules/public-landing/public/projects.html",
16200
- "line": 1213,
16209
+ "line": 1220,
16201
16210
  "origin": "html-text",
16202
16211
  "confidence": "certain"
16203
16212
  },
@@ -1613,5 +1613,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
1613
1613
  landed since 1.19.580 with no explicit bump. run 34158683008. (task 1002620)
1614
1614
  1.19.582 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1615
1615
  landed since 1.19.581 with no explicit bump. run 34160253741. (task 1002620)
1616
+ 1.19.583 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1617
+ landed since 1.19.582 with no explicit bump. run 34162998083. (task 1002620)
1618
+ 1.19.584 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1619
+ landed since 1.19.583 with no explicit bump. run 34164936809. (task 1002620)
1616
1620
  ---------------------------------------------------------------------------
1617
1621
  ```
@@ -0,0 +1,57 @@
1
+ // modules/provisioning/paid-shape-gate.js — who may ask for METERED infrastructure
2
+ // (task 1003682).
3
+ //
4
+ // The create route is open to any authenticated builder, and it must stay that way:
5
+ // standing up a project is the platform's front door, not a privilege. But one of the
6
+ // hosting shapes it accepts is not free. `dedicated` is the only shape whose runner leg
7
+ // allocates a real droplet (`scripts/gds/provision.js` — billed monthly, defaulting to
8
+ // s-2vcpu-4gb when no tier is named); every other shape co-tenants on infrastructure the
9
+ // platform already pays for, which is why `costEstimateUsd` returns 0 for all of them.
10
+ //
11
+ // So the authority question belongs to the SHAPE, not the route. Gating the whole route
12
+ // would make ordinary project creation require a rank — the wrong trade entirely, and the
13
+ // reason this is a middleware over one field rather than a floor on the endpoint.
14
+ //
15
+ // The atom is `provisioning.fleet.manage` (floor: metic), deliberately the same one that
16
+ // already guards the fleet cost-ledger and force-teardown. Spending on the fleet and
17
+ // managing the fleet are one authority, and before this the route that SPENDS money was
18
+ // less gated than the route that stops it.
19
+ //
20
+ // Split into its own file rather than inlined beside the route for two reasons, both
21
+ // mechanical: `routes/provisioning.js` sits at its 1500-line fitness ratchet (the same
22
+ // pressure that produced `callback-page.js` under task 1003570), and a bare `req.body`
23
+ // read placed between two route declarations is attributed by the ADR 0118 body-validation
24
+ // scanner to the PRECEDING route, which turns a correct gate into a false "unvalidated
25
+ // write route" failure on an unrelated endpoint.
26
+ 'use strict';
27
+
28
+ // The shapes that cost money. Kept as a set of one rather than a bare `=== 'dedicated'`
29
+ // so a second metered shape is a one-line change here instead of a hunt through gates;
30
+ // `tests/provisioning_paid_shape_gate.mjs` pins HOSTING_SHAPES so adding one without
31
+ // revisiting this file fails loudly.
32
+ const METERED_SHAPES = Object.freeze(new Set(['dedicated']));
33
+
34
+ // isMeteredShape — does this hosting shape allocate infrastructure someone is billed for?
35
+ // Matches the exact wire value: the route's own validator refuses anything not in
36
+ // HOSTING_SHAPES, so a case or whitespace variant is rejected as a bad shape rather than
37
+ // admitted here as a cheap one.
38
+ function isMeteredShape(shape) {
39
+ return METERED_SHAPES.has(shape);
40
+ }
41
+
42
+ // requireAuthorityForMeteredShape — the create route's paid-shape gate. Mount it AFTER
43
+ // requireBuilder and BEFORE the handler, so a refusal leaves no row behind for the runner
44
+ // to drain later. `requirePermission` is injected (rather than required here) so the gate
45
+ // is exercisable without standing up the auth stack.
46
+ function requireAuthorityForMeteredShape(requirePermission) {
47
+ const gate = requirePermission('provisioning.fleet.manage');
48
+ return function meteredShapeGate(req, res, next) {
49
+ if (!isMeteredShape(req.body && req.body.hosting_shape)) return next();
50
+ return gate(req, res, next);
51
+ };
52
+ }
53
+
54
+ // Only the gate is exported. METERED_SHAPES and isMeteredShape are deliberately private:
55
+ // nothing outside this file needs to ask "is this shape metered" separately from being
56
+ // gated on it, and an export nobody consumes is one more thing to keep true.
57
+ module.exports = { requireAuthorityForMeteredShape };
@@ -12,6 +12,9 @@
12
12
  //
13
13
  // own-scoped (requireBuilder — the caller's OWN instances):
14
14
  // POST /provisioning/instances — request a new instance
15
+ // (a `dedicated` shape ALSO needs
16
+ // provisioning.fleet.manage — it is the
17
+ // only shape that bills; ../paid-shape-gate.js)
15
18
  // GET /provisioning/instances — list the caller's instances
16
19
  // GET /provisioning/instances/:id — read one of the caller's instances
17
20
  // (also SELF-HEALS its catalog projection,
@@ -45,6 +48,7 @@ const { onboardPlan, stepsForShape } = require('../onboard-plan');
45
48
  const { ALWAYS_ON_CORE, OPTIONAL_MODULES, starterBundleAnswerTable, optionalModules, effectiveModules } = require('../starter-bundles');
46
49
  const { recommendationsForDetails } = require('../recommendations');
47
50
  const { makeAskRateLimiter, clientIp } = require('../rate-limit');
51
+ const { requireAuthorityForMeteredShape } = require('../paid-shape-gate');
48
52
  const catalogBridge = require('../catalog-bridge');
49
53
  const { callbackPage } = require('./callback-page');
50
54
  // task 1003208: structured logging (pino via the doorway) — was console.*.
@@ -342,7 +346,9 @@ module.exports = function provisioningRoutes() {
342
346
  });
343
347
 
344
348
  // POST /provisioning/instances — request a new instance. rank: any authenticated
345
- // builder (own resource). ENQUEUES a 'provision' intent + records the request;
349
+ // builder (own resource); a `dedicated` (metered) shape additionally requires
350
+ // provisioning.fleet.manage — see requireAuthorityForMeteredShape above.
351
+ // ENQUEUES a 'provision' intent + records the request;
346
352
  // the runner (task P3) does the real standup. Idempotent on slug for the SAME
347
353
  // owner (re-request returns the existing row); a slug owned by ANOTHER builder → 409.
348
354
  // Body: { slug (required), target_ref?, hosting_shape? (co-tenant|dedicated),
@@ -353,7 +359,7 @@ module.exports = function provisioningRoutes() {
353
359
  // ALREADY has, so the runner must clone + layer onto its history instead of pushing a
354
360
  // fresh tree at `main` (which an existing repo rejects as unrelated history). Absent →
355
361
  // 'greenfield', the safe default.
356
- router.post('/provisioning/instances', auth.requireBuilder, async (req, res) => {
362
+ router.post('/provisioning/instances', auth.requireBuilder, requireAuthorityForMeteredShape(auth.requirePermission), async (req, res) => {
357
363
  if (validateOrRespond(req, res, {
358
364
  slug: { required: true, type: 'string', maxLength: 40 },
359
365
  target_ref: { type: 'string', maxLength: 200 },
@@ -1154,6 +1154,13 @@ summary{min-height:24px;padding:3px 0;}
1154
1154
  <!-- visibility stated BEFORE GitHub's own radio is the first place it
1155
1155
  appears (task 1002721, owner firsthand in the QA walk) -->
1156
1156
  <div class="hint" style="grid-column:1 / -1;">Creating the repo yourself on GitHub? Public or private is your choice there — both work here, and we never change it.</div>
1157
+ <!-- the way back from the manual fallback (task 1003683). Choosing "or enter
1158
+ it manually" used to hide the connect offer for good: #ghConnect renders
1159
+ only while repoAccess is 'need-connect', and nothing ever set it back, so
1160
+ a full reload was the only route to the button. Stays hidden when the
1161
+ fallback was FORCED (repoAccess 'unavailable'), where connecting cannot
1162
+ help and the offer would be a lie. -->
1163
+ <button type="button" class="linklike" id="ghManualBack" style="grid-column:1 / -1;" hidden>Use my GitHub repositories instead</button>
1157
1164
  </div>
1158
1165
  <div class="hint" id="h-home">&nbsp;</div>
1159
1166
  <div class="nav">
@@ -3498,6 +3505,7 @@ summary{min-height:24px;padding:3px 0;}
3498
3505
  }
3499
3506
  $('ghConnectBtn').addEventListener('click', connectRepos);
3500
3507
  $('ghManualToggle').addEventListener('click', function () { repoAccess = 'manual'; syncHome(); $('f-owner').focus(); });
3508
+ $('ghManualBack').addEventListener('click', function () { repoAccess = 'need-connect'; syncHome(); $('ghConnectBtn').focus(); });
3501
3509
 
3502
3510
  function syncHome() {
3503
3511
  var need = repoAccess === 'need-connect';
@@ -3508,6 +3516,9 @@ summary{min-height:24px;padding:3px 0;}
3508
3516
  $('ghAdopt').hidden = !(ok && adopt);
3509
3517
  $('ghFresh').hidden = !(ok && !adopt);
3510
3518
  $('manualHome').hidden = !isManualHome();
3519
+ /* only when the visitor CHOSE manual: with 'unavailable' the server cannot hold a
3520
+ token, so a connect round-trip would land back here having changed nothing */
3521
+ $('ghManualBack').hidden = repoAccess !== 'manual';
3511
3522
  if (need) {
3512
3523
  /* Informed consent (ADR 0155): this grants `repo`, which GitHub's own screen
3513
3524
  words as full control of ALL your repositories — so say plainly why we ask
@@ -4568,7 +4579,14 @@ summary{min-height:24px;padding:3px 0;}
4568
4579
  re-enters to the real draft step the moment /me answers */
4569
4580
  var step = authKnown && state.step >= 1 && state.step <= 7 ? state.step : 1;
4570
4581
  if (step === 1) {
4582
+ /* Pre-auth, step 1 is a PLACEHOLDER, not where the visitor is — but show()
4583
+ persists whatever step it renders, so it used to overwrite the draft's real
4584
+ position with 1 and leave onAuth() nothing to re-enter to (task 1003683). Every
4585
+ return through GitHub landed the visitor back at the name step. Put the real
4586
+ step back after rendering the placeholder, in memory AND in the draft. */
4587
+ var resumeStep = state.step;
4571
4588
  show(1, false);
4589
+ if (!authKnown && resumeStep >= 1 && resumeStep <= 7) { state.step = resumeStep; saveDraft(); }
4572
4590
  if (focus) $('newName').focus();
4573
4591
  } else {
4574
4592
  show(step, !!focus);
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.582",
3
+ "version": "1.19.584",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.19.582",
9
+ "version": "1.19.584",
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.582",
3
+ "version": "1.19.584",
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/src/module-api.js CHANGED
@@ -55,7 +55,7 @@ const { buildInfo } = require('./build-info');
55
55
  // there. scripts/gds/bump-version.js still rewrites the literal below; it appends
56
56
  // the entry to that file. Look for a version's history there, not here.
57
57
  // ---------------------------------------------------------------------------
58
- const CORE_VERSION = '1.19.582'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
58
+ const CORE_VERSION = '1.19.584'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
59
59
 
60
60
  // A namespaced logger so a module's log lines are attributable + consistent.
61
61
  // Usage: const log = api.logger('dev-box'); log.info('mounted');