@bongos/core 1.24.5 → 1.24.6

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.
Files changed (44) hide show
  1. package/.bongos-core.json +70 -45
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +6 -0
  4. package/clients/bongos-client/index.cjs +6 -0
  5. package/clients/bongos-client/index.d.ts +7 -0
  6. package/clients/bongos-client/index.mjs +6 -0
  7. package/docs/adr/0396-google-sign-in-a-stand-in-login-and-a-browser-approved-cli-sign-in.md +8 -0
  8. package/docs/api/openapi.json +110 -5
  9. package/docs/api-reference.md +6 -3
  10. package/docs/copy-inventory.md +36 -32
  11. package/docs/copy-registry.json +69 -33
  12. package/docs/module-api-changelog.md +2 -0
  13. package/docs/page-inventory.json +2 -1
  14. package/docs/page-readings.json +63 -55
  15. package/migrations/core_286_credit_log_no_spend.sql +128 -0
  16. package/modules/copy-desk/auto-close.js +5 -3
  17. package/modules/copy-desk/page-status.js +7 -4
  18. package/modules/copy-desk/tests/copy_page_auto_close.mjs +4 -4
  19. package/modules/lifecycle/routes/claims.js +7 -1
  20. package/modules/platform-identity/account-logins.js +131 -0
  21. package/modules/platform-identity/migrations/platform_identity_035_account_login_email_idx.sql +19 -0
  22. package/modules/platform-identity/routes/profile.js +29 -1
  23. package/modules/platform-identity/routes/sso.js +25 -3
  24. package/modules/public-landing/public/account.html +114 -0
  25. package/modules/public-landing/public/account.states.json +1 -0
  26. package/modules/ui-design/kit/serve.js +24 -0
  27. package/package-lock.json +2 -2
  28. package/package.json +1 -1
  29. package/release-notes.json +18 -0
  30. package/scripts/bongos/run-unit-tests.js +4 -0
  31. package/src/bongos/auth-github.js +24 -7
  32. package/src/bongos/routes/auth-google.js +71 -5
  33. package/src/bongos/routes/auth-link.js +132 -0
  34. package/src/bongos/routes.js +2 -0
  35. package/src/bongos/sign-in-pages.js +20 -1
  36. package/src/module-api.js +1 -1
  37. package/tests/account_linking.mjs +289 -0
  38. package/tests/account_logins_db.mjs +56 -0
  39. package/tests/claims_batch_routes.mjs +79 -12
  40. package/tests/copy_desk_page_release.mjs +20 -0
  41. package/tests/copy_stuck_page_tweaks.mjs +2 -2
  42. package/tests/credit_log_no_spend_db.mjs +160 -0
  43. package/tests/effective_visibility_predicate.mjs +8 -0
  44. package/tests/hub_account_page.mjs +91 -5
package/.bongos-core.json CHANGED
@@ -2,22 +2,22 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/bongos/package-core.js",
5
- "core_version": "1.24.5",
6
- "core_contract": "1.24.5",
7
- "source_commit": "3c88fbd178c93e32bc27e47490d2ea89fd628787",
5
+ "core_version": "1.24.6",
6
+ "core_contract": "1.24.6",
7
+ "source_commit": "d76131851e558718f994bff2dc61d927392b2e35",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-10-30T05:11:49.262Z",
9
+ "built_at": "2026-10-30T05:27:20.349Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 628,
13
13
  "agent_docs_stubbed": 32,
14
- "functional_verbatim": 3722,
14
+ "functional_verbatim": 3727,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 4383,
20
- "tree_sha256": "64ec9b67115939200ddd1d5f3b89f1e941f4da2580d278b86e511986fc017c01",
19
+ "file_count": 4388,
20
+ "tree_sha256": "eb6a2ecfa756bd24aa031a917dab6182cac8e59bc49405c09287beb69ea68e40",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -327,12 +327,12 @@
327
327
  {
328
328
  "path": "clients/bongos-client/README.md",
329
329
  "mode": "0000644",
330
- "sha256": "b2735326bb4b3ef29ce7684200cb45900d44442c978994166eecbfd2fff352ec"
330
+ "sha256": "6aa2a4269ce603ae9b21a26c16fb4a19316a4b740981067e60de4825dfc99e34"
331
331
  },
332
332
  {
333
333
  "path": "clients/bongos-client/bongos-client.global.js",
334
334
  "mode": "0000644",
335
- "sha256": "133a43fcfbaca89e438e23df227fad435a0ebb48a0f5e57241ca0779cdea0df5"
335
+ "sha256": "6de6d6f401db915703edc4068bfa650e526695542f3c547b4563f6d8d24e5fe5"
336
336
  },
337
337
  {
338
338
  "path": "clients/bongos-client/examples/hello-world.mjs",
@@ -342,17 +342,17 @@
342
342
  {
343
343
  "path": "clients/bongos-client/index.cjs",
344
344
  "mode": "0000644",
345
- "sha256": "59158230c9f3f96fd2cd12774f374deef70a11b50c495a09035cbdef967667b5"
345
+ "sha256": "89e68bce31d01cececb2ab1a28766828e37281523462acda77d5c20e17106470"
346
346
  },
347
347
  {
348
348
  "path": "clients/bongos-client/index.d.ts",
349
349
  "mode": "0000644",
350
- "sha256": "7d3aeae646fa5a13e0ddc1d7455ac5fb109275aaa35d0a524bf2bafc80874e80"
350
+ "sha256": "13dc1594495f2cbf4209d8b1ff77b0b7db0a3e6d33c74d8236fd62e97e356156"
351
351
  },
352
352
  {
353
353
  "path": "clients/bongos-client/index.mjs",
354
354
  "mode": "0000644",
355
- "sha256": "e365441cfcaec48546855c42f330d4dc358c95aabbcc4cd9a51fc11209bcf14d"
355
+ "sha256": "c5c8097091dba7e2471eec9b81175cf1f9458a164f7b8a4ebaf3c9476197155f"
356
356
  },
357
357
  {
358
358
  "path": "clients/bongos-client/package.json",
@@ -2437,7 +2437,7 @@
2437
2437
  {
2438
2438
  "path": "docs/adr/0396-google-sign-in-a-stand-in-login-and-a-browser-approved-cli-sign-in.md",
2439
2439
  "mode": "0000644",
2440
- "sha256": "15a008d87ff72366e6e5d9e8cbe54eb6060cbb62aedbc40013147739f97d54bc"
2440
+ "sha256": "7c13a3f082ab91435a181f8b197f1e46708cc1b24a9ad80463c74f3726280d70"
2441
2441
  },
2442
2442
  {
2443
2443
  "path": "docs/adr/README.md",
@@ -2447,12 +2447,12 @@
2447
2447
  {
2448
2448
  "path": "docs/api-reference.md",
2449
2449
  "mode": "0000644",
2450
- "sha256": "8a5820f4be8038f02e65107f076ff694304459eda1c514903ae22c1f53a1522f"
2450
+ "sha256": "eb2fd9c8c2cdca2d4b8b893bbc7b728d78a1846c126d2bb1d8ec77f7d5d3bd8e"
2451
2451
  },
2452
2452
  {
2453
2453
  "path": "docs/api/openapi.json",
2454
2454
  "mode": "0000644",
2455
- "sha256": "6dbe0723050ce5d1bdd1b5af8b7235bdf1f886ffa98150fa4320756adc428964"
2455
+ "sha256": "abc9ef4763a8701a9078fb7e8741c9680a4c34e5263ac44a06109f108896a6fa"
2456
2456
  },
2457
2457
  {
2458
2458
  "path": "docs/architecture.md",
@@ -2477,12 +2477,12 @@
2477
2477
  {
2478
2478
  "path": "docs/copy-inventory.md",
2479
2479
  "mode": "0000644",
2480
- "sha256": "451e8acde051b614a3d1c788ff8e737f8b15b7c99bebbb6a0e57f0d634de7532"
2480
+ "sha256": "9f2b88606c2a78aafc2c9ba7d000364f8afa0d72cc2d63978f629d8928bb4554"
2481
2481
  },
2482
2482
  {
2483
2483
  "path": "docs/copy-registry.json",
2484
2484
  "mode": "0000644",
2485
- "sha256": "d0fd1935049c2ecb48aea5a9e974f1725cd56a816b86dd1891e5632ec491fa4f"
2485
+ "sha256": "6649e2a3c4b0f51f78535cbaeb4f7a70f07363aea6460028300ba7f47258b100"
2486
2486
  },
2487
2487
  {
2488
2488
  "path": "docs/design/apex-pass-2-direction.md",
@@ -2992,7 +2992,7 @@
2992
2992
  {
2993
2993
  "path": "docs/module-api-changelog.md",
2994
2994
  "mode": "0000644",
2995
- "sha256": "9d657541cca4abb87aea4ea612e2072d025bb40dcd2aa68458322690fd9917d6"
2995
+ "sha256": "6c408dfa0fdfdf0b6544b8845aee952ecbf85b93205d2f04293fc88653cead39"
2996
2996
  },
2997
2997
  {
2998
2998
  "path": "docs/modules-contract.md",
@@ -3077,12 +3077,12 @@
3077
3077
  {
3078
3078
  "path": "docs/page-inventory.json",
3079
3079
  "mode": "0000644",
3080
- "sha256": "c01a06e925175fa20e8763e9892cc2431262b163e82a07ed7b0990e914a1d3c1"
3080
+ "sha256": "143bc5348d7b717165493315352709bdf95bbce55f3158044fbd151d2525e296"
3081
3081
  },
3082
3082
  {
3083
3083
  "path": "docs/page-readings.json",
3084
3084
  "mode": "0000644",
3085
- "sha256": "9294370708bcefc1a344e8d383f5b77a0161d4e7abec6111c29995cef93391ed"
3085
+ "sha256": "eaae3054433e68b47ef74a0fd60c6d8eaaa66e22055d91e75c7ccf75ed807019"
3086
3086
  },
3087
3087
  {
3088
3088
  "path": "docs/project-context.template.md",
@@ -4279,6 +4279,11 @@
4279
4279
  "mode": "0000644",
4280
4280
  "sha256": "ac98b2770c87a6c23758807b43ed74f8480e41d2b17cbdaf01b2017aac2f9b55"
4281
4281
  },
4282
+ {
4283
+ "path": "migrations/core_286_credit_log_no_spend.sql",
4284
+ "mode": "0000644",
4285
+ "sha256": "5b0f9d39bc66732b3bc2ad53562c8238152904a1d71790bcba9f8fae3386ccb3"
4286
+ },
4282
4287
  {
4283
4288
  "path": "modules/agents/CLAUDE.md",
4284
4289
  "mode": "0000644",
@@ -4647,7 +4652,7 @@
4647
4652
  {
4648
4653
  "path": "modules/copy-desk/auto-close.js",
4649
4654
  "mode": "0000644",
4650
- "sha256": "413e0bd992b3db551f572c53b9e9074f59aec9700ef2dfba889d3c3edf52bcee"
4655
+ "sha256": "5f58ac6c1791e5fd1cbab462c531a6a5c34d7cbac6346f5c9c8f24b62e2b2351"
4651
4656
  },
4652
4657
  {
4653
4658
  "path": "modules/copy-desk/chrome-pages.js",
@@ -4702,7 +4707,7 @@
4702
4707
  {
4703
4708
  "path": "modules/copy-desk/page-status.js",
4704
4709
  "mode": "0000644",
4705
- "sha256": "d56343c59fa538461442a279db620dd1bca9b1545e27ecf4170950c54537948e"
4710
+ "sha256": "b3cfad9eef5ad3b5fcb270e06e8730fcb6f3635e5328f122ac2e064f082891ed"
4706
4711
  },
4707
4712
  {
4708
4713
  "path": "modules/copy-desk/pages.js",
@@ -4777,7 +4782,7 @@
4777
4782
  {
4778
4783
  "path": "modules/copy-desk/tests/copy_page_auto_close.mjs",
4779
4784
  "mode": "0000644",
4780
- "sha256": "963c439133ed1e4887d9d21cb657646203e7776fa57af8cd22e04a4e26aaad99"
4785
+ "sha256": "55c2cce578d9625e791fa4ac2fd3cb43fdfcf719e1fe9b78d7f1cf010b829371"
4781
4786
  },
4782
4787
  {
4783
4788
  "path": "modules/copy-desk/tests/copy_page_draft.mjs",
@@ -8087,7 +8092,7 @@
8087
8092
  {
8088
8093
  "path": "modules/lifecycle/routes/claims.js",
8089
8094
  "mode": "0000644",
8090
- "sha256": "2e6b8f8281063bb584937fe469d19ff9573bc22fe4282e1b1d0c0d21e745e53b"
8095
+ "sha256": "597ed82a59be1e0bff249770858f203f35faab055cd0a6c7fc644518686f48d8"
8091
8096
  },
8092
8097
  {
8093
8098
  "path": "modules/lifecycle/routes/closeness.js",
@@ -8712,7 +8717,7 @@
8712
8717
  {
8713
8718
  "path": "modules/platform-identity/account-logins.js",
8714
8719
  "mode": "0000644",
8715
- "sha256": "287ddbff0de072b9400d37d7f7caa87d6feeb96d2cf8da158839b6f979b712a2"
8720
+ "sha256": "5213c0f4692acc47a138684f88d695476cdb663d1949124d766a65406a76ff3e"
8716
8721
  },
8717
8722
  {
8718
8723
  "path": "modules/platform-identity/account-visibility.js",
@@ -8999,6 +9004,11 @@
8999
9004
  "mode": "0000644",
9000
9005
  "sha256": "113da8e634c51de0ba027bbcc1438162d3f906e3cc6cd663327509a36f4500e2"
9001
9006
  },
9007
+ {
9008
+ "path": "modules/platform-identity/migrations/platform_identity_035_account_login_email_idx.sql",
9009
+ "mode": "0000644",
9010
+ "sha256": "91aa11c7171adbe4bc24f16572f73a6c9d37aba4132a51e9ac640bef2fb2770f"
9011
+ },
9002
9012
  {
9003
9013
  "path": "modules/platform-identity/module.json",
9004
9014
  "mode": "0000644",
@@ -9092,7 +9102,7 @@
9092
9102
  {
9093
9103
  "path": "modules/platform-identity/routes/profile.js",
9094
9104
  "mode": "0000644",
9095
- "sha256": "51df5a8c1a91ddcd03ddee932e907a6444c62443df6c0750fb8bdc1bdc402233"
9105
+ "sha256": "4738146d5b0c733c0ff33ff34a6ebd0d2615391a8ae1d76e7686e07be990370a"
9096
9106
  },
9097
9107
  {
9098
9108
  "path": "modules/platform-identity/routes/projects.js",
@@ -9117,7 +9127,7 @@
9117
9127
  {
9118
9128
  "path": "modules/platform-identity/routes/sso.js",
9119
9129
  "mode": "0000644",
9120
- "sha256": "3a9e4c5ef8d99b89c7e6a35d9e8c2788705be515958f250467b8db45db9bd51b"
9130
+ "sha256": "7f114183ad0e66820d78bf1ff1af692eb9fee77226a3215aeaba5200cadb1b7a"
9121
9131
  },
9122
9132
  {
9123
9133
  "path": "modules/platform-identity/scouting-authz.js",
@@ -9647,7 +9657,7 @@
9647
9657
  {
9648
9658
  "path": "modules/public-landing/public/account.html",
9649
9659
  "mode": "0000644",
9650
- "sha256": "48a8f7fbca2bffe8a5cee038851dd1dcafd9cab096e0abd08850293fd54705d9"
9660
+ "sha256": "717739c73bce0f261b938c587f1ebb0dc677dfffc2beb61a12f5f304317699d9"
9651
9661
  },
9652
9662
  {
9653
9663
  "path": "modules/public-landing/public/account.probes.json",
@@ -9657,7 +9667,7 @@
9657
9667
  {
9658
9668
  "path": "modules/public-landing/public/account.states.json",
9659
9669
  "mode": "0000644",
9660
- "sha256": "0c05a41ce426082b56f0a267a60fb04f11c99bed9fcff2fbba7aca896d1af29e"
9670
+ "sha256": "a3551bd3b21ae558699216216ed7c4809090276fc3133befa1f5fda8104bf033"
9661
9671
  },
9662
9672
  {
9663
9673
  "path": "modules/public-landing/public/assets/anim/idle/frame_00.webp",
@@ -11292,7 +11302,7 @@
11292
11302
  {
11293
11303
  "path": "modules/ui-design/kit/serve.js",
11294
11304
  "mode": "0000644",
11295
- "sha256": "a50f940fc73e0ee018ce85eebb1b737c197c64722ea2c32e90559d792e76ef0b"
11305
+ "sha256": "2e35dc760a2085435e257699eefb8c8640c2f46cf0242eb8801e8887e2e6382c"
11296
11306
  },
11297
11307
  {
11298
11308
  "path": "modules/ui-design/kit/tells.js",
@@ -11427,12 +11437,12 @@
11427
11437
  {
11428
11438
  "path": "package-lock.json",
11429
11439
  "mode": "0000644",
11430
- "sha256": "c8346ef5a2a69cb674976854cd033dc1209c05caa8502d6aec943e36d1d87d61"
11440
+ "sha256": "82aa98487b46e7fb59752d5ec7e806b0fd6c5b9084a2585daf836d9016dc68bd"
11431
11441
  },
11432
11442
  {
11433
11443
  "path": "package.json",
11434
11444
  "mode": "0000644",
11435
- "sha256": "f2163c967b304cf6d707a11dfdd47960a3490c54c2530dfd245cf7f1d643ea66"
11445
+ "sha256": "1be6fc34aee13b557f6781a1d797279282b3ac6eb28024d819f1818fdc1a9bd4"
11436
11446
  },
11437
11447
  {
11438
11448
  "path": "public-docs/index.html",
@@ -11452,7 +11462,7 @@
11452
11462
  {
11453
11463
  "path": "release-notes.json",
11454
11464
  "mode": "0000644",
11455
- "sha256": "d2dbd5bbf56312c0f5c1e00c9a73e60591fe85609e1fcb6047ec0e677e3a923a"
11465
+ "sha256": "26a6fdb22f186250ff50160198520658b0bd77795af3c4b6afc63e35e36d1b07"
11456
11466
  },
11457
11467
  {
11458
11468
  "path": "scripts/bongos/CLAUDE.md",
@@ -12677,7 +12687,7 @@
12677
12687
  {
12678
12688
  "path": "scripts/bongos/run-unit-tests.js",
12679
12689
  "mode": "0000644",
12680
- "sha256": "b18f796ef910e5257bb2c59509fac600f4c983b2e0e1fd2b7c96508d7a112e97"
12690
+ "sha256": "761091c93930535e1ec22e9c268897aeef935ca0c985aea5e194fa50e17393f6"
12681
12691
  },
12682
12692
  {
12683
12693
  "path": "scripts/bongos/runner-drift.js",
@@ -14837,7 +14847,7 @@
14837
14847
  {
14838
14848
  "path": "src/bongos/auth-github.js",
14839
14849
  "mode": "0000644",
14840
- "sha256": "fa9320999a0ed200a174bf8d994482e6a19e69b214170d3008d42f8dd3b5d598"
14850
+ "sha256": "b49add7da84090e626f6812c54574073a959ab78e24e56158983c82363a571d0"
14841
14851
  },
14842
14852
  {
14843
14853
  "path": "src/bongos/auth-google.js",
@@ -15092,7 +15102,7 @@
15092
15102
  {
15093
15103
  "path": "src/bongos/routes.js",
15094
15104
  "mode": "0000644",
15095
- "sha256": "06a7286695be0689d2806d4ded027db28923886a0941478fe7aa818b543f2dd7"
15105
+ "sha256": "2ca88b6cb7f879e489a8a19eac49de12e7cbc32ec9336682dc72de3a4fcd9279"
15096
15106
  },
15097
15107
  {
15098
15108
  "path": "src/bongos/routes/CLAUDE.md",
@@ -15112,7 +15122,12 @@
15112
15122
  {
15113
15123
  "path": "src/bongos/routes/auth-google.js",
15114
15124
  "mode": "0000644",
15115
- "sha256": "e89e9a1e8838795c565ce2e7d018af82d96c10db643a2de4c1c5c37063d67a68"
15125
+ "sha256": "f7531eefb5d958f4924aff1e0e1bf8bf258f82cc676d7bdb0f26e6235a181ae4"
15126
+ },
15127
+ {
15128
+ "path": "src/bongos/routes/auth-link.js",
15129
+ "mode": "0000644",
15130
+ "sha256": "9026bef41c5f079cd80720b95d5e6d376c3280f63e1ad389e99c7f5dfc67ae8f"
15116
15131
  },
15117
15132
  {
15118
15133
  "path": "src/bongos/routes/auth.js",
@@ -15242,7 +15257,7 @@
15242
15257
  {
15243
15258
  "path": "src/bongos/sign-in-pages.js",
15244
15259
  "mode": "0000644",
15245
- "sha256": "f2fd4a71875e75584ca0f238d289b926ff7b13127ac98646aaeb3e63940f01c7"
15260
+ "sha256": "c8cb78f67fce5c42bbe896207d1a0d323215592a36c5d231d7f586e41479b409"
15246
15261
  },
15247
15262
  {
15248
15263
  "path": "src/bongos/software-update.js",
@@ -15292,7 +15307,7 @@
15292
15307
  {
15293
15308
  "path": "src/module-api.js",
15294
15309
  "mode": "0000644",
15295
- "sha256": "db9f13a1a0bf6937f8b42578eaefe3febbc72ef8c822dbc6abca2e512b4b06db"
15310
+ "sha256": "936890d242b9f24422e4f62d387666b34bac68a405291a02d3e22af6cc00ea38"
15296
15311
  },
15297
15312
  {
15298
15313
  "path": "src/module-loader/catalog.js",
@@ -15404,6 +15419,11 @@
15404
15419
  "mode": "0000644",
15405
15420
  "sha256": "41b8175653a86b79a5dae1e0be041eb4a286720cb41cbcd069afe9bc78b172ac"
15406
15421
  },
15422
+ {
15423
+ "path": "tests/account_linking.mjs",
15424
+ "mode": "0000644",
15425
+ "sha256": "aabe503e1a8ae00c62a72331f24d26efc8b5739704950a9c4e6b426d5593bce4"
15426
+ },
15407
15427
  {
15408
15428
  "path": "tests/account_logins.mjs",
15409
15429
  "mode": "0000644",
@@ -15412,7 +15432,7 @@
15412
15432
  {
15413
15433
  "path": "tests/account_logins_db.mjs",
15414
15434
  "mode": "0000644",
15415
- "sha256": "f9c338d05c7339b5ac77055ed71370840b6186165b331ebe5e74e2dca70ee16b"
15435
+ "sha256": "a958dbca24f8bae620c826f0bdab21441ffb9b213c9c4f0304bc9905fe9c0bb6"
15416
15436
  },
15417
15437
  {
15418
15438
  "path": "tests/account_privacy_flags.mjs",
@@ -16197,7 +16217,7 @@
16197
16217
  {
16198
16218
  "path": "tests/claims_batch_routes.mjs",
16199
16219
  "mode": "0000644",
16200
- "sha256": "53cdb47f665e27df47f122fc81a554827a7f971ef3fe9b735088d9c691cc18aa"
16220
+ "sha256": "02c8680d636667472f07d3389c1056fed290fdfa61a79135cc00674070615446"
16201
16221
  },
16202
16222
  {
16203
16223
  "path": "tests/claims_bind_session.mjs",
@@ -16422,7 +16442,7 @@
16422
16442
  {
16423
16443
  "path": "tests/copy_desk_page_release.mjs",
16424
16444
  "mode": "0000644",
16425
- "sha256": "0107dc58b7a59c030d2ac6e45ed61b8a166804879e2c7bcdacb058d7c4bd36dd"
16445
+ "sha256": "a8eca478657a52ef1c00837afaa757ce41dc4faf7a21ec030e1c818516706c35"
16426
16446
  },
16427
16447
  {
16428
16448
  "path": "tests/copy_desk_page_submit.mjs",
@@ -16442,7 +16462,7 @@
16442
16462
  {
16443
16463
  "path": "tests/copy_stuck_page_tweaks.mjs",
16444
16464
  "mode": "0000644",
16445
- "sha256": "5afcb83b32338d30c0dec85c9caecb57fd928f2129cca23701ced4517f9a1ccc"
16465
+ "sha256": "ed093cbf72005b6417f1b2e0e11bc180540b85c3fa77e8466110c36dae0a113b"
16446
16466
  },
16447
16467
  {
16448
16468
  "path": "tests/core_258_box_session_claims_db.mjs",
@@ -16579,6 +16599,11 @@
16579
16599
  "mode": "0000644",
16580
16600
  "sha256": "d7c96a67f1eda974a9387a47d12bf70d7f2125ea77c1ddb313e5a3feb47ae04f"
16581
16601
  },
16602
+ {
16603
+ "path": "tests/credit_log_no_spend_db.mjs",
16604
+ "mode": "0000644",
16605
+ "sha256": "82cfb61e859da3ac3515fdd3e0a0df0d06ffe2a198fb640f327f46312aaa5e86"
16606
+ },
16582
16607
  {
16583
16608
  "path": "tests/credit_log_single_writer.mjs",
16584
16609
  "mode": "0000644",
@@ -16902,7 +16927,7 @@
16902
16927
  {
16903
16928
  "path": "tests/effective_visibility_predicate.mjs",
16904
16929
  "mode": "0000644",
16905
- "sha256": "2bae0bc521ccff03a13484c756dbe0d0515b63fa0babd9174a645e63397f12eb"
16930
+ "sha256": "7bd63d2a1f097fdde204803ec8b6fc0ae75843080af6d442c969ed02b7fb41dd"
16906
16931
  },
16907
16932
  {
16908
16933
  "path": "tests/env_knobs_neutral_prefix.mjs",
@@ -18372,7 +18397,7 @@
18372
18397
  {
18373
18398
  "path": "tests/hub_account_page.mjs",
18374
18399
  "mode": "0000644",
18375
- "sha256": "0fbcec7a0f77ff149a5b2d8486e7e239101816acdcf81bea8b54207803d400ae"
18400
+ "sha256": "e1e282e2c1e9417f463d959435a0a287d6b6e332513bc6b8ecaf2d616f60661d"
18376
18401
  },
18377
18402
  {
18378
18403
  "path": "tests/hub_community_page.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
- - 636 operations across 80 resource groups
8
+ - 639 operations across 80 resource groups
9
9
 
10
10
  ## Use it from your project
11
11
 
@@ -187,6 +187,8 @@ function createClient(opts = {}) {
187
187
  getAuthGoogleCallback: (args) => request("GET", "/auth/google/callback", { hasBody: false }, args),
188
188
  // GET /auth/google/start — rank: public — GET /auth/google/start
189
189
  getAuthGoogleStart: (args) => request("GET", "/auth/google/start", { hasBody: false }, args),
190
+ // GET /auth/link/github/start — rank: public — GET /auth/link/github/start
191
+ getAuthLinkGithubStart: (args) => request("GET", "/auth/link/github/start", { hasBody: false }, args),
190
192
  // POST /auth/logout — rank: any-builder — POST /auth/logout
191
193
  postAuthLogout: (args) => request("POST", "/auth/logout", { hasBody: true }, args),
192
194
  // POST /auth/revoke — rank: archon — POST /auth/revoke
@@ -197,6 +199,8 @@ function createClient(opts = {}) {
197
199
  getAuthWebAdmissionStatus: (args) => request("GET", "/auth/web/admission-status", { hasBody: false }, args),
198
200
  // GET /auth/web/callback — rank: public — GET /auth/web/callback
199
201
  getAuthWebCallback: (args) => request("GET", "/auth/web/callback", { hasBody: false }, args),
202
+ // GET /auth/web/callback/link — rank: public — GET /auth/web/callback/link
203
+ getAuthWebCallbackLink: (args) => request("GET", "/auth/web/callback/link", { hasBody: false }, args),
200
204
  // GET /auth/web/handoff — rank: public — GET /auth/web/handoff
201
205
  getAuthWebHandoff: (args) => request("GET", "/auth/web/handoff", { hasBody: false }, args),
202
206
  // GET /auth/web/start — rank: public — GET /auth/web/start
@@ -855,6 +859,8 @@ function createClient(opts = {}) {
855
859
  postMeSessionsRevokeAll: (args) => request("POST", "/me/sessions/revoke-all", { hasBody: true }, args),
856
860
  // GET /me/sign-in-methods — rank: any-builder — GET /me/sign-in-methods
857
861
  getMeSignInMethods: (args) => request("GET", "/me/sign-in-methods", { hasBody: false }, args),
862
+ // DELETE /me/sign-in-methods/{provider} — rank: any-builder — DELETE /me/sign-in-methods/:provider
863
+ deleteMeSignInMethodsProvider: (args) => request("DELETE", "/me/sign-in-methods/{provider}", { hasBody: false }, args),
858
864
  // GET /me/skill-prefs — rank: any-builder — GET /me/skill-prefs
859
865
  getMeSkillPrefs: (args) => request("GET", "/me/skill-prefs", { hasBody: false }, args),
860
866
  // PATCH /me/skill-prefs — rank: any-builder — PATCH /me/skill-prefs
@@ -186,6 +186,8 @@ function createClient(opts = {}) {
186
186
  getAuthGoogleCallback: (args) => request("GET", "/auth/google/callback", { hasBody: false }, args),
187
187
  // GET /auth/google/start — rank: public — GET /auth/google/start
188
188
  getAuthGoogleStart: (args) => request("GET", "/auth/google/start", { hasBody: false }, args),
189
+ // GET /auth/link/github/start — rank: public — GET /auth/link/github/start
190
+ getAuthLinkGithubStart: (args) => request("GET", "/auth/link/github/start", { hasBody: false }, args),
189
191
  // POST /auth/logout — rank: any-builder — POST /auth/logout
190
192
  postAuthLogout: (args) => request("POST", "/auth/logout", { hasBody: true }, args),
191
193
  // POST /auth/revoke — rank: archon — POST /auth/revoke
@@ -196,6 +198,8 @@ function createClient(opts = {}) {
196
198
  getAuthWebAdmissionStatus: (args) => request("GET", "/auth/web/admission-status", { hasBody: false }, args),
197
199
  // GET /auth/web/callback — rank: public — GET /auth/web/callback
198
200
  getAuthWebCallback: (args) => request("GET", "/auth/web/callback", { hasBody: false }, args),
201
+ // GET /auth/web/callback/link — rank: public — GET /auth/web/callback/link
202
+ getAuthWebCallbackLink: (args) => request("GET", "/auth/web/callback/link", { hasBody: false }, args),
199
203
  // GET /auth/web/handoff — rank: public — GET /auth/web/handoff
200
204
  getAuthWebHandoff: (args) => request("GET", "/auth/web/handoff", { hasBody: false }, args),
201
205
  // GET /auth/web/start — rank: public — GET /auth/web/start
@@ -854,6 +858,8 @@ function createClient(opts = {}) {
854
858
  postMeSessionsRevokeAll: (args) => request("POST", "/me/sessions/revoke-all", { hasBody: true }, args),
855
859
  // GET /me/sign-in-methods — rank: any-builder — GET /me/sign-in-methods
856
860
  getMeSignInMethods: (args) => request("GET", "/me/sign-in-methods", { hasBody: false }, args),
861
+ // DELETE /me/sign-in-methods/{provider} — rank: any-builder — DELETE /me/sign-in-methods/:provider
862
+ deleteMeSignInMethodsProvider: (args) => request("DELETE", "/me/sign-in-methods/{provider}", { hasBody: false }, args),
857
863
  // GET /me/skill-prefs — rank: any-builder — GET /me/skill-prefs
858
864
  getMeSkillPrefs: (args) => request("GET", "/me/skill-prefs", { hasBody: false }, args),
859
865
  // PATCH /me/skill-prefs — rank: any-builder — PATCH /me/skill-prefs
@@ -19,6 +19,7 @@ export interface DeleteGuildsSlugMembershipResponse { outcome: unknown }
19
19
  export interface DeleteGuildsSlugResponse { outcome: unknown }
20
20
  export interface DeleteInboxIdSparkResponse { idea: unknown; sparked: boolean; unchanged: boolean }
21
21
  export interface DeleteMeFilterViewsIdResponse { page: unknown; views: unknown }
22
+ export interface DeleteMeSignInMethodsProviderResponse { ok: boolean }
22
23
  export interface DeleteMemoryFileResponse { deleted: boolean; builder_id: unknown; path: unknown }
23
24
  export interface DeleteNotesIdResponse { ok: boolean }
24
25
  export interface DeleteProvisioningInstancesIdEnvManifestVarIdResponse { ok: boolean; removed: boolean; message: unknown }
@@ -806,6 +807,8 @@ export interface BongosClient {
806
807
  getAuthGoogleCallback(args?: RequestArgs): Promise<ApiResponse>;
807
808
  /** GET /auth/google/start — rank: public */
808
809
  getAuthGoogleStart(args?: RequestArgs): Promise<ApiResponse>;
810
+ /** GET /auth/link/github/start — rank: public */
811
+ getAuthLinkGithubStart(args?: RequestArgs): Promise<ApiResponse>;
809
812
  /** POST /auth/logout — rank: any-builder */
810
813
  postAuthLogout(args?: RequestArgs): Promise<PostAuthLogoutResponse>;
811
814
  /** POST /auth/revoke — rank: archon */
@@ -816,6 +819,8 @@ export interface BongosClient {
816
819
  getAuthWebAdmissionStatus(args?: RequestArgs): Promise<GetAuthWebAdmissionStatusResponse>;
817
820
  /** GET /auth/web/callback — rank: public */
818
821
  getAuthWebCallback(args?: RequestArgs): Promise<ApiResponse>;
822
+ /** GET /auth/web/callback/link — rank: public */
823
+ getAuthWebCallbackLink(args?: RequestArgs): Promise<ApiResponse>;
819
824
  /** GET /auth/web/handoff — rank: public */
820
825
  getAuthWebHandoff(args?: RequestArgs): Promise<ApiResponse>;
821
826
  /** GET /auth/web/start — rank: public */
@@ -1474,6 +1479,8 @@ export interface BongosClient {
1474
1479
  postMeSessionsRevokeAll(args?: RequestArgs): Promise<PostMeSessionsRevokeAllResponse>;
1475
1480
  /** GET /me/sign-in-methods — rank: any-builder */
1476
1481
  getMeSignInMethods(args?: RequestArgs): Promise<GetMeSignInMethodsResponse>;
1482
+ /** DELETE /me/sign-in-methods/{provider} — rank: any-builder */
1483
+ deleteMeSignInMethodsProvider(args?: RequestArgs): Promise<DeleteMeSignInMethodsProviderResponse>;
1477
1484
  /** GET /me/skill-prefs — rank: any-builder */
1478
1485
  getMeSkillPrefs(args?: RequestArgs): Promise<GetMeSkillPrefsResponse>;
1479
1486
  /** PATCH /me/skill-prefs — rank: any-builder */
@@ -183,6 +183,8 @@ export function createClient(opts = {}) {
183
183
  getAuthGoogleCallback: (args) => request("GET", "/auth/google/callback", { hasBody: false }, args),
184
184
  // GET /auth/google/start — rank: public — GET /auth/google/start
185
185
  getAuthGoogleStart: (args) => request("GET", "/auth/google/start", { hasBody: false }, args),
186
+ // GET /auth/link/github/start — rank: public — GET /auth/link/github/start
187
+ getAuthLinkGithubStart: (args) => request("GET", "/auth/link/github/start", { hasBody: false }, args),
186
188
  // POST /auth/logout — rank: any-builder — POST /auth/logout
187
189
  postAuthLogout: (args) => request("POST", "/auth/logout", { hasBody: true }, args),
188
190
  // POST /auth/revoke — rank: archon — POST /auth/revoke
@@ -193,6 +195,8 @@ export function createClient(opts = {}) {
193
195
  getAuthWebAdmissionStatus: (args) => request("GET", "/auth/web/admission-status", { hasBody: false }, args),
194
196
  // GET /auth/web/callback — rank: public — GET /auth/web/callback
195
197
  getAuthWebCallback: (args) => request("GET", "/auth/web/callback", { hasBody: false }, args),
198
+ // GET /auth/web/callback/link — rank: public — GET /auth/web/callback/link
199
+ getAuthWebCallbackLink: (args) => request("GET", "/auth/web/callback/link", { hasBody: false }, args),
196
200
  // GET /auth/web/handoff — rank: public — GET /auth/web/handoff
197
201
  getAuthWebHandoff: (args) => request("GET", "/auth/web/handoff", { hasBody: false }, args),
198
202
  // GET /auth/web/start — rank: public — GET /auth/web/start
@@ -851,6 +855,8 @@ export function createClient(opts = {}) {
851
855
  postMeSessionsRevokeAll: (args) => request("POST", "/me/sessions/revoke-all", { hasBody: true }, args),
852
856
  // GET /me/sign-in-methods — rank: any-builder — GET /me/sign-in-methods
853
857
  getMeSignInMethods: (args) => request("GET", "/me/sign-in-methods", { hasBody: false }, args),
858
+ // DELETE /me/sign-in-methods/{provider} — rank: any-builder — DELETE /me/sign-in-methods/:provider
859
+ deleteMeSignInMethodsProvider: (args) => request("DELETE", "/me/sign-in-methods/{provider}", { hasBody: false }, args),
854
860
  // GET /me/skill-prefs — rank: any-builder — GET /me/skill-prefs
855
861
  getMeSkillPrefs: (args) => request("GET", "/me/skill-prefs", { hasBody: false }, args),
856
862
  // PATCH /me/skill-prefs — rank: any-builder — PATCH /me/skill-prefs
@@ -50,3 +50,11 @@ Decision 8's two refusals are lifted, without ever sending a minted key to a cor
50
50
  - **People read the handle.** The hall's admission queue shows `ana`, not `~ana`.
51
51
 
52
52
  Credits, ranks and community pages needed no change: the hub's check-in and rollup already take a negative key. Still open: a hall's command-line sign-in (`/sso/device/*`) is GitHub's device flow, so a Google-only person signs in to a hall in the browser; engineering work still needs GitHub (task 1004997).
53
+
54
+ ## Amendment — linking GitHub and Google, both ways (task 1004995)
55
+
56
+ - **A link is a sign-in with the other account, made while signed in.** Link Google rides the Google sign-in with a flag in the host-only state cookie (Google matches redirect URIs exactly). Link GitHub uses its own callback, `/auth/web/callback/link`, a subdirectory of the registered GitHub callback, which GitHub accepts, so the owner's GitHub app needs no change. Both answers land on `/account#aWaysIn`.
57
+ - **Never a merge.** A way in that already reaches another person, or a GitHub account with its own builder row here, is refused and the page says so: "That GitHub account already has its own account here, so it was not linked." Both accounts may hold credits and history, and joining them is not the server's decision.
58
+ - **Removing.** Never the last way in. And never GitHub from an account born with it: that account's key is its GitHub id, so a GitHub sign-in would still reach it and the removal would be a lie. A person who joined with Google may remove a linked GitHub, and then shows their stand-in again from their next sign-in.
59
+ - **Every GitHub sign-in on the hub finds the person first** (the ADR 0393 carry-over, closed): the web and device sign-ins ask the hub who the GitHub id reaches and use that key. A project's command-line sign-in (`/sso/device/poll`) cannot tell whether the project takes a minted key, so for a GitHub account linked to someone who joined with Google it says to sign in in the browser.
60
+ - **Matching emails suggest, never join.** This amends decision 3's "emails are never looked up" in one place only: on a first Google sign-in, if another account's GitHub way in shows the address Google verified, the person is offered "Sign in with GitHub" (then link Google from the account page) or "Make a new account with Google". Only the provider's name crosses; no account is named or joined. The hub keeps the GitHub address it sees at sign-in (GitHub's public address) for this alone.