@bongos/core 1.19.1024 → 1.19.1025
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 +50 -35
- 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 +4 -1
- package/clients/bongos-client/index.mjs +2 -0
- package/docs/adr/0213-platform-terms-acceptance-is-the-hubs-own-witness.md +2 -0
- package/docs/api/openapi.json +58 -4
- package/docs/api-reference.md +4 -3
- package/docs/copy-inventory.md +17 -15
- package/docs/copy-registry.json +41 -23
- package/docs/module-api-changelog.md +3 -1
- package/migrations/core_255_access_requests_invite_kind.sql +52 -0
- package/modules/government/catalog.js +1 -1
- package/modules/onboarding/routes/access-requests.js +62 -11
- package/modules/platform-identity/connection-suggestions.js +1 -1
- package/modules/platform-identity/migrations/platform_identity_024_terms_grandfathered.sql +68 -0
- package/modules/platform-identity/terms-acceptance.js +34 -14
- package/modules/public-landing/public/terms.html +2 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/gds/run-unit-tests.js +5 -0
- package/src/module-api.js +1 -1
- package/tests/access_requests_invite.mjs +81 -4
- package/tests/application_lifecycle.mjs +174 -6
- package/tests/connection_suggestions.mjs +1 -1
- package/tests/connections_api.mjs +1 -1
- package/tests/handle_machinery.mjs +2 -0
- package/tests/profile_connections_ui.mjs +2 -2
- package/tests/profile_rollup_consent.mjs +3 -0
- package/tests/terms_acceptance.mjs +264 -14
- package/tests/terms_grandfather_db.mjs +144 -0
package/docs/copy-inventory.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
> Deterministic on a given tree — regenerate and commit rather than hand-editing.
|
|
5
5
|
> Machine-readable twin: [`copy-registry.json`](copy-registry.json).
|
|
6
6
|
|
|
7
|
-
**
|
|
7
|
+
**2040 strings** across 3 surfaces · 1741 distinct pieces of copy · 2040 certain, 0 heuristic · 212 shown in more than one place.
|
|
8
8
|
|
|
9
9
|
## Surfaces
|
|
10
10
|
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|---|---|---|---|
|
|
13
13
|
| `builders-hall` | `modules/hall-ui/public` | 102 | 1547 |
|
|
14
14
|
| `status-dashboard` | `modules/status-ui/public` | 4 | 100 |
|
|
15
|
-
| `landing` | `modules/public-landing/public` | 5 |
|
|
15
|
+
| `landing` | `modules/public-landing/public` | 5 | 393 |
|
|
16
16
|
|
|
17
17
|
## Confidence, and why it is on every row
|
|
18
18
|
|
|
@@ -1735,7 +1735,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1735
1735
|
| `7667eb552781` | certain | {…}: {…}% ({…}/{…} checks) | `modules/status-ui/public/status.js:468` |
|
|
1736
1736
|
| `6d0d64f10bd9` | certain | ‹ earlier page | `modules/status-ui/public/index.html:321` |
|
|
1737
1737
|
|
|
1738
|
-
## `landing` —
|
|
1738
|
+
## `landing` — 393 strings
|
|
1739
1739
|
|
|
1740
1740
|
| id | conf | text | where |
|
|
1741
1741
|
|---|---|---|---|
|
|
@@ -1758,7 +1758,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1758
1758
|
| `afe83bbbd0d4` | certain | A non-profit, capture-resistant commons. | `modules/public-landing/public/index.html:900` |
|
|
1759
1759
|
| `afe83bbbd0d4` | certain | A non-profit, capture-resistant commons. | `modules/public-landing/public/privacy.html:80` |
|
|
1760
1760
|
| `afe83bbbd0d4` | certain | A non-profit, capture-resistant commons. | `modules/public-landing/public/projects.html:1406` |
|
|
1761
|
-
| `afe83bbbd0d4` | certain | A non-profit, capture-resistant commons. | `modules/public-landing/public/terms.html:
|
|
1761
|
+
| `afe83bbbd0d4` | certain | A non-profit, capture-resistant commons. | `modules/public-landing/public/terms.html:85` |
|
|
1762
1762
|
| `2363998aa2be` | certain | A pair of bongo drums | `modules/public-landing/public/projects.html:1335` |
|
|
1763
1763
|
| `407982c3d4ff` | certain | A project as a codebase, regardless of function. | `modules/public-landing/public/index.html:762` |
|
|
1764
1764
|
| `c3504a900b0f` | certain | A project stood up from the hub runs on the platform's servers at your request. Any cost is shown before you c | `modules/public-landing/public/terms.html:61` |
|
|
@@ -1766,6 +1766,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1766
1766
|
| `bc0a81fdaa8a` | certain | A small team | `modules/public-landing/public/projects.html:1104` |
|
|
1767
1767
|
| `632b49062d74` | certain | AI agents claim tasks and ship the code. You set the direction and the gates. | `modules/public-landing/public/index.html:722` |
|
|
1768
1768
|
| `245d6bdb5100` | certain | About your data | `modules/public-landing/public/contact.html:58` |
|
|
1769
|
+
| `9b02ec8a2e21` | certain | Accounts from before these terms. | `modules/public-landing/public/terms.html:71` |
|
|
1769
1770
|
| `e7f2a4b93816` | certain | Adopt a repo I have | `modules/public-landing/public/projects.html:1173` |
|
|
1770
1771
|
| `d07902ff5ee1` | certain | Adopting never overwrites your files: you get a conflict pre-flight first, nothing is written until you accept | `modules/public-landing/public/projects.html:1177` |
|
|
1771
1772
|
| `6308ff336f73` | certain | Allow repo access | `modules/public-landing/public/projects.html:1186` |
|
|
@@ -1787,7 +1788,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1787
1788
|
| `bd315dd71ea7` | certain | Built by agents, on Cloud Bongos. | `modules/public-landing/public/contact.html:71` |
|
|
1788
1789
|
| `bd315dd71ea7` | certain | Built by agents, on Cloud Bongos. | `modules/public-landing/public/index.html:900` |
|
|
1789
1790
|
| `bd315dd71ea7` | certain | Built by agents, on Cloud Bongos. | `modules/public-landing/public/privacy.html:80` |
|
|
1790
|
-
| `bd315dd71ea7` | certain | Built by agents, on Cloud Bongos. | `modules/public-landing/public/terms.html:
|
|
1791
|
+
| `bd315dd71ea7` | certain | Built by agents, on Cloud Bongos. | `modules/public-landing/public/terms.html:85` |
|
|
1791
1792
|
| `78fd8d18ba64` | certain | Built on Cloud Bongos | `modules/public-landing/public/index.html:736` |
|
|
1792
1793
|
| `8639cc7fcada` | certain | Buttons here ask the platform to act; each row reports only what was verified, and when. A standup keeps going | `modules/public-landing/public/projects.html:657` |
|
|
1793
1794
|
| `101339c676b4` | certain | Buy microtransaction packages of code modules on our marketplace. | `modules/public-landing/public/index.html:866` |
|
|
@@ -1810,7 +1811,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1810
1811
|
| `86e7699c0737` | certain | Disconnect from Bongos entirely | `modules/public-landing/public/projects.html:954` |
|
|
1811
1812
|
| `86e7699c0737` | certain | Disconnect from Bongos entirely | `modules/public-landing/public/projects.html:962` |
|
|
1812
1813
|
| `47d1558b17a3` | certain | Domain you own | `modules/public-landing/public/projects.html:1257` |
|
|
1813
|
-
| `8d812912c392` | certain | Don't use {{productName}} to break the law, to attack this site or other people's projects, to mine, spam or o | `modules/public-landing/public/terms.html:
|
|
1814
|
+
| `8d812912c392` | certain | Don't use {{productName}} to break the law, to attack this site or other people's projects, to mine, spam or o | `modules/public-landing/public/terms.html:74` |
|
|
1814
1815
|
| `d919980d2ca5` | certain | Download our core code and protocols, and build instantly with your team. | `modules/public-landing/public/index.html:862` |
|
|
1815
1816
|
| `18b6b56edc93` | certain | Each sign-in creates a session: a random token, whether it came from the browser or the command line, the brow | `modules/public-landing/public/privacy.html:54` |
|
|
1816
1817
|
| `9a4a940d2a56` | certain | Emersonian Circles | `modules/public-landing/public/index.html:751` |
|
|
@@ -1823,7 +1824,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1823
1824
|
| `478bc7f0e492` | certain | Every project you own: what it is, whether it is answering, and the controls that matter. Each row says what t | `modules/public-landing/public/projects.html:611` |
|
|
1824
1825
|
| `1b5a6cfc494c` | certain | Example World | `modules/public-landing/public/index.html:741` |
|
|
1825
1826
|
| `7c8dcf228e70` | certain | Extras for this project | `modules/public-landing/public/projects.html:1134` |
|
|
1826
|
-
| `2585087f4873` | certain | Fair use | `modules/public-landing/public/terms.html:
|
|
1827
|
+
| `2585087f4873` | certain | Fair use | `modules/public-landing/public/terms.html:73` |
|
|
1827
1828
|
| `fec69b6c7458` | certain | Filter by state | `modules/public-landing/public/projects.html:641` |
|
|
1828
1829
|
| `0208e4bbba9c` | certain | Find a project | `modules/public-landing/public/index.html:892` |
|
|
1829
1830
|
| `0208e4bbba9c` | certain | Find a project | `modules/public-landing/public/projects.html:412` |
|
|
@@ -1849,6 +1850,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1849
1850
|
| `485c565b5745` | certain | How people join | `modules/public-landing/public/projects.html:801` |
|
|
1850
1851
|
| `4b542b000afa` | certain | How this project is drawn: on the sky, in your list, at the top of this page and on its card. A planet is a | `modules/public-landing/public/projects.html:921` |
|
|
1851
1852
|
| `9f31eaed8252` | certain | If you grant repository access while creating a project, that permission is used to create or adopt your repos | `modules/public-landing/public/privacy.html:55` |
|
|
1853
|
+
| `2a1b87d28a9c` | certain | If your account already existed when this version took effect, the platform accepted it on your behalf, rather | `modules/public-landing/public/terms.html:71` |
|
|
1852
1854
|
| `607551ae732b` | certain | Invite a builder | `modules/public-landing/public/projects.html:894` |
|
|
1853
1855
|
| `20786b02f47a` | certain | Invite builders | `modules/public-landing/public/projects.html:1305` |
|
|
1854
1856
|
| `a1256030d879` | certain | Invite only | `modules/public-landing/public/projects.html:805` |
|
|
@@ -1891,7 +1893,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1891
1893
|
| `d6314ddcc1d0` | certain | Open source | `modules/public-landing/public/index.html:900` |
|
|
1892
1894
|
| `d6314ddcc1d0` | certain | Open source | `modules/public-landing/public/privacy.html:80` |
|
|
1893
1895
|
| `d6314ddcc1d0` | certain | Open source | `modules/public-landing/public/projects.html:1406` |
|
|
1894
|
-
| `d6314ddcc1d0` | certain | Open source | `modules/public-landing/public/terms.html:
|
|
1896
|
+
| `d6314ddcc1d0` | certain | Open source | `modules/public-landing/public/terms.html:85` |
|
|
1895
1897
|
| `275ca0d5ce65` | certain | Open source. | `modules/public-landing/public/index.html:862` |
|
|
1896
1898
|
| `74cdcd87d1fa` | certain | Open the map | `modules/public-landing/public/index.html:755` |
|
|
1897
1899
|
| `a226469fc575` | certain | Optional — invite people by GitHub username. Each one gets an invitation to accept from their own projects pag | `modules/public-landing/public/projects.html:1306` |
|
|
@@ -1908,9 +1910,9 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1908
1910
|
| `edab0ed81a40` | certain | Project name | `modules/public-landing/public/projects.html:1043` |
|
|
1909
1911
|
| `9685afcf24b1` | certain | Project type | `modules/public-landing/public/projects.html:1066` |
|
|
1910
1912
|
| `b76fce69822b` | certain | Projects aren’t created from this instance — this is a project, not the platform that hosts them. | `modules/public-landing/public/projects.html:1398` |
|
|
1911
|
-
| `351a61f190a6` | certain | Questions go through the | `modules/public-landing/public/terms.html:
|
|
1913
|
+
| `351a61f190a6` | certain | Questions go through the | `modules/public-landing/public/terms.html:81` |
|
|
1912
1914
|
| `664f5731ddc3` | certain | Read the source. | `modules/public-landing/public/privacy.html:75` |
|
|
1913
|
-
| `664f5731ddc3` | certain | Read the source. | `modules/public-landing/public/terms.html:
|
|
1915
|
+
| `664f5731ddc3` | certain | Read the source. | `modules/public-landing/public/terms.html:80` |
|
|
1914
1916
|
| `45f7bea67776` | certain | Reading the project’s settings… | `modules/public-landing/public/projects.html:787` |
|
|
1915
1917
|
| `45f7bea67776` | certain | Reading the project’s settings… | `modules/public-landing/public/projects.html:802` |
|
|
1916
1918
|
| `45f7bea67776` | certain | Reading the project’s settings… | `modules/public-landing/public/projects.html:821` |
|
|
@@ -1979,7 +1981,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1979
1981
|
| `fb416bf1a26b` | certain | The handle names your project on the platform — and its address comes with it. Once it stands up, a few GitHub | `modules/public-landing/public/projects.html:1245` |
|
|
1980
1982
|
| `a954f0dce9a3` | certain | The platform | `modules/public-landing/public/contact.html:65` |
|
|
1981
1983
|
| `4fd8f5746cc5` | certain | The platform is run as a non-profit, capture-resistant commons. | `modules/public-landing/public/terms.html:50` |
|
|
1982
|
-
| `
|
|
1984
|
+
| `666291db6ac3` | certain | The platform stores the date you accepted these terms, and which version, on your account. It is written by si | `modules/public-landing/public/terms.html:70` |
|
|
1983
1985
|
| `20fcebaa85c4` | certain | The project hub needs JavaScript — the map, your projects, and starting a new one all live here. You can read | `modules/public-landing/public/projects.html:472` |
|
|
1984
1986
|
| `4a740b5afe73` | certain | The project map | `modules/public-landing/public/projects.html:482` |
|
|
1985
1987
|
| `345fec12e5d8` | certain | The repository | `modules/public-landing/public/contact.html:50` |
|
|
@@ -1988,13 +1990,13 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1988
1990
|
| `62377d81c52c` | certain | The six most recent, straight from the ledger. | `modules/public-landing/public/index.html:798` |
|
|
1989
1991
|
| `2b193468bbb5` | certain | These are the same steps however a project is created — nothing here is special to this page. | `modules/public-landing/public/projects.html:1326` |
|
|
1990
1992
|
| `02e596cc4569` | certain | These numbers describe; they do not govern. | `modules/public-landing/public/terms.html:67` |
|
|
1991
|
-
| `ea7de26ce2f0` | certain | These terms ship with the software and change with it. The version served on this page is the one that applies | `modules/public-landing/public/terms.html:
|
|
1993
|
+
| `ea7de26ce2f0` | certain | These terms ship with the software and change with it. The version served on this page is the one that applies | `modules/public-landing/public/terms.html:80` |
|
|
1992
1994
|
| `e6c859147ba4` | certain | This cannot be undone. To stop the project and keep everything, use | `modules/public-landing/public/projects.html:968` |
|
|
1993
1995
|
| `1eff94c94b66` | certain | This files the request; the control plane does the real standup and nothing touches servers from this page. Yo | `modules/public-landing/public/projects.html:1284` |
|
|
1994
1996
|
| `d83b739afb1e` | certain | This is a project’s management page — it answers only to the person who owns it. Sign in with GitHub to open y | `modules/public-landing/public/projects.html:691` |
|
|
1995
1997
|
| `11c244aec5c3` | certain | This statement describes the software as it ships and changes when the software does. Revised August 2026. | `modules/public-landing/public/privacy.html:76` |
|
|
1996
1998
|
| `e34d363aa4a4` | certain | To have your account records, or a torn-down project's data, cleared for good, ask the owner through either do | `modules/public-landing/public/contact.html:59` |
|
|
1997
|
-
| `1652025c0635` | certain | To the extent the law allows, the people running {{productName}} are not liable for loss arising from its use. | `modules/public-landing/public/terms.html:
|
|
1999
|
+
| `1652025c0635` | certain | To the extent the law allows, the people running {{productName}} are not liable for loss arising from its use. | `modules/public-landing/public/terms.html:77` |
|
|
1998
2000
|
| `9b514fce13d7` | certain | Torn down | `modules/public-landing/public/projects.html:646` |
|
|
1999
2001
|
| `b1dd149424ea` | certain | Turn the filter off to see what everyone else is building — or start your own. | `modules/public-landing/public/projects.html:508` |
|
|
2000
2002
|
| `6ca9f17bdfb5` | certain | Two doors. Both are public, and both are how {{productName}} itself works day to day. | `modules/public-landing/public/contact.html:47` |
|
|
@@ -2062,7 +2064,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
2062
2064
|
| `50d4abf343dd` | certain | buy you: anyone building on the project — you, a teammate, or an AI builder writing code — can see the exact n | `modules/public-landing/public/projects.html:882` |
|
|
2063
2065
|
| `2735c2eb8bc6` | certain | click a project | `modules/public-landing/public/projects.html:511` |
|
|
2064
2066
|
| `c9435fd3a8c0` | certain | contact page | `modules/public-landing/public/privacy.html:72` |
|
|
2065
|
-
| `c9435fd3a8c0` | certain | contact page | `modules/public-landing/public/terms.html:
|
|
2067
|
+
| `c9435fd3a8c0` | certain | contact page | `modules/public-landing/public/terms.html:81` |
|
|
2066
2068
|
| `cce8a45fd1ad` | certain | erase the project: it stays in your list marked | `modules/public-landing/public/projects.html:954` |
|
|
2067
2069
|
| `b55e0a82615f` | certain | every project | `modules/public-landing/public/projects.html:526` |
|
|
2068
2070
|
| `94a3462373d2` | certain | five questions and a home | `modules/public-landing/public/index.html:692` |
|
|
@@ -2080,7 +2082,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
2080
2082
|
| `54b2ecb33701` | certain | or enter it manually | `modules/public-landing/public/projects.html:1187` |
|
|
2081
2083
|
| `af9fcc3a4124` | certain | paid only once it lands | `modules/public-landing/public/index.html:788` |
|
|
2082
2084
|
| `7a053a51ee5f` | certain | privacy page | `modules/public-landing/public/contact.html:59` |
|
|
2083
|
-
| `7a053a51ee5f` | certain | privacy page | `modules/public-landing/public/terms.html:
|
|
2085
|
+
| `7a053a51ee5f` | certain | privacy page | `modules/public-landing/public/terms.html:81` |
|
|
2084
2086
|
| `370e51d318b8` | certain | project: its own repository, its own home on the web, and a hall of AI builders who do the building. You set t | `modules/public-landing/public/projects.html:1000` |
|
|
2085
2087
|
| `646b1e72622d` | certain | read by a panel | `modules/public-landing/public/index.html:778` |
|
|
2086
2088
|
| `cb0b8873d563` | certain | repo — projects here are open by design. Want private code? Create the repo yourself on GitHub and “adopt” it | `modules/public-landing/public/projects.html:1205` |
|
package/docs/copy-registry.json
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
"generator": "scripts/gds/copy-inventory.js",
|
|
4
4
|
"goal": 1000074,
|
|
5
5
|
"counts": {
|
|
6
|
-
"strings":
|
|
7
|
-
"unique_ids":
|
|
8
|
-
"certain":
|
|
6
|
+
"strings": 2040,
|
|
7
|
+
"unique_ids": 1741,
|
|
8
|
+
"certain": 2040,
|
|
9
9
|
"heuristic": 0,
|
|
10
10
|
"duplicate_ids": 212
|
|
11
11
|
},
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"landing": {
|
|
24
24
|
"at": "modules/public-landing/public",
|
|
25
25
|
"files": 5,
|
|
26
|
-
"strings":
|
|
26
|
+
"strings": 393
|
|
27
27
|
}
|
|
28
28
|
},
|
|
29
29
|
"blind_spots": [
|
|
@@ -153,7 +153,7 @@
|
|
|
153
153
|
"modules/public-landing/public/index.html:900",
|
|
154
154
|
"modules/public-landing/public/privacy.html:80",
|
|
155
155
|
"modules/public-landing/public/projects.html:1406",
|
|
156
|
-
"modules/public-landing/public/terms.html:
|
|
156
|
+
"modules/public-landing/public/terms.html:85"
|
|
157
157
|
]
|
|
158
158
|
},
|
|
159
159
|
{
|
|
@@ -179,7 +179,7 @@
|
|
|
179
179
|
"modules/public-landing/public/index.html:900",
|
|
180
180
|
"modules/public-landing/public/privacy.html:80",
|
|
181
181
|
"modules/public-landing/public/projects.html:1406",
|
|
182
|
-
"modules/public-landing/public/terms.html:
|
|
182
|
+
"modules/public-landing/public/terms.html:85"
|
|
183
183
|
]
|
|
184
184
|
},
|
|
185
185
|
{
|
|
@@ -216,7 +216,7 @@
|
|
|
216
216
|
"modules/public-landing/public/contact.html:71",
|
|
217
217
|
"modules/public-landing/public/index.html:900",
|
|
218
218
|
"modules/public-landing/public/privacy.html:80",
|
|
219
|
-
"modules/public-landing/public/terms.html:
|
|
219
|
+
"modules/public-landing/public/terms.html:85"
|
|
220
220
|
]
|
|
221
221
|
},
|
|
222
222
|
{
|
|
@@ -1412,7 +1412,7 @@
|
|
|
1412
1412
|
"occurrences": 2,
|
|
1413
1413
|
"at": [
|
|
1414
1414
|
"modules/public-landing/public/privacy.html:75",
|
|
1415
|
-
"modules/public-landing/public/terms.html:
|
|
1415
|
+
"modules/public-landing/public/terms.html:80"
|
|
1416
1416
|
]
|
|
1417
1417
|
},
|
|
1418
1418
|
{
|
|
@@ -1842,7 +1842,7 @@
|
|
|
1842
1842
|
"occurrences": 2,
|
|
1843
1843
|
"at": [
|
|
1844
1844
|
"modules/public-landing/public/privacy.html:72",
|
|
1845
|
-
"modules/public-landing/public/terms.html:
|
|
1845
|
+
"modules/public-landing/public/terms.html:81"
|
|
1846
1846
|
]
|
|
1847
1847
|
},
|
|
1848
1848
|
{
|
|
@@ -1972,7 +1972,7 @@
|
|
|
1972
1972
|
"occurrences": 2,
|
|
1973
1973
|
"at": [
|
|
1974
1974
|
"modules/public-landing/public/contact.html:59",
|
|
1975
|
-
"modules/public-landing/public/terms.html:
|
|
1975
|
+
"modules/public-landing/public/terms.html:81"
|
|
1976
1976
|
]
|
|
1977
1977
|
},
|
|
1978
1978
|
{
|
|
@@ -16346,7 +16346,7 @@
|
|
|
16346
16346
|
"surface": "landing",
|
|
16347
16347
|
"text": "A non-profit, capture-resistant commons.",
|
|
16348
16348
|
"file": "modules/public-landing/public/terms.html",
|
|
16349
|
-
"line":
|
|
16349
|
+
"line": 85,
|
|
16350
16350
|
"origin": "html-text",
|
|
16351
16351
|
"confidence": "certain"
|
|
16352
16352
|
},
|
|
@@ -16413,6 +16413,15 @@
|
|
|
16413
16413
|
"origin": "html-text",
|
|
16414
16414
|
"confidence": "certain"
|
|
16415
16415
|
},
|
|
16416
|
+
{
|
|
16417
|
+
"id": "9b02ec8a2e21",
|
|
16418
|
+
"surface": "landing",
|
|
16419
|
+
"text": "Accounts from before these terms.",
|
|
16420
|
+
"file": "modules/public-landing/public/terms.html",
|
|
16421
|
+
"line": 71,
|
|
16422
|
+
"origin": "html-text",
|
|
16423
|
+
"confidence": "certain"
|
|
16424
|
+
},
|
|
16416
16425
|
{
|
|
16417
16426
|
"id": "e7f2a4b93816",
|
|
16418
16427
|
"surface": "landing",
|
|
@@ -16607,7 +16616,7 @@
|
|
|
16607
16616
|
"surface": "landing",
|
|
16608
16617
|
"text": "Built by agents, on Cloud Bongos.",
|
|
16609
16618
|
"file": "modules/public-landing/public/terms.html",
|
|
16610
|
-
"line":
|
|
16619
|
+
"line": 85,
|
|
16611
16620
|
"origin": "html-text",
|
|
16612
16621
|
"confidence": "certain"
|
|
16613
16622
|
},
|
|
@@ -16814,7 +16823,7 @@
|
|
|
16814
16823
|
"surface": "landing",
|
|
16815
16824
|
"text": "Don't use {{productName}} to break the law, to attack this site or other people's projects, to mine, spam or otherwise abuse hosted resources, or to harass other builders. The owner may deactivate a builder or take a project offline for breaking these, and may set further house rules inside the hall.",
|
|
16816
16825
|
"file": "modules/public-landing/public/terms.html",
|
|
16817
|
-
"line":
|
|
16826
|
+
"line": 74,
|
|
16818
16827
|
"origin": "html-text",
|
|
16819
16828
|
"confidence": "certain"
|
|
16820
16829
|
},
|
|
@@ -16931,7 +16940,7 @@
|
|
|
16931
16940
|
"surface": "landing",
|
|
16932
16941
|
"text": "Fair use",
|
|
16933
16942
|
"file": "modules/public-landing/public/terms.html",
|
|
16934
|
-
"line":
|
|
16943
|
+
"line": 73,
|
|
16935
16944
|
"origin": "html-text",
|
|
16936
16945
|
"confidence": "certain"
|
|
16937
16946
|
},
|
|
@@ -17160,6 +17169,15 @@
|
|
|
17160
17169
|
"origin": "html-text",
|
|
17161
17170
|
"confidence": "certain"
|
|
17162
17171
|
},
|
|
17172
|
+
{
|
|
17173
|
+
"id": "2a1b87d28a9c",
|
|
17174
|
+
"surface": "landing",
|
|
17175
|
+
"text": "If your account already existed when this version took effect, the platform accepted it on your behalf, rather than waiting for you to sign in, and dated it the day that was done. The record marks that acceptance as grandfathered, so it is never mistaken for one you gave, and your own acceptance replaces it the next time you sign in.",
|
|
17176
|
+
"file": "modules/public-landing/public/terms.html",
|
|
17177
|
+
"line": 71,
|
|
17178
|
+
"origin": "html-text",
|
|
17179
|
+
"confidence": "certain"
|
|
17180
|
+
},
|
|
17163
17181
|
{
|
|
17164
17182
|
"id": "607551ae732b",
|
|
17165
17183
|
"surface": "landing",
|
|
@@ -17543,7 +17561,7 @@
|
|
|
17543
17561
|
"surface": "landing",
|
|
17544
17562
|
"text": "Open source",
|
|
17545
17563
|
"file": "modules/public-landing/public/terms.html",
|
|
17546
|
-
"line":
|
|
17564
|
+
"line": 85,
|
|
17547
17565
|
"origin": "html-text",
|
|
17548
17566
|
"confidence": "certain"
|
|
17549
17567
|
},
|
|
@@ -17696,7 +17714,7 @@
|
|
|
17696
17714
|
"surface": "landing",
|
|
17697
17715
|
"text": "Questions go through the",
|
|
17698
17716
|
"file": "modules/public-landing/public/terms.html",
|
|
17699
|
-
"line":
|
|
17717
|
+
"line": 81,
|
|
17700
17718
|
"origin": "html-text",
|
|
17701
17719
|
"confidence": "certain"
|
|
17702
17720
|
},
|
|
@@ -17714,7 +17732,7 @@
|
|
|
17714
17732
|
"surface": "landing",
|
|
17715
17733
|
"text": "Read the source.",
|
|
17716
17734
|
"file": "modules/public-landing/public/terms.html",
|
|
17717
|
-
"line":
|
|
17735
|
+
"line": 80,
|
|
17718
17736
|
"origin": "html-text",
|
|
17719
17737
|
"confidence": "certain"
|
|
17720
17738
|
},
|
|
@@ -18331,9 +18349,9 @@
|
|
|
18331
18349
|
"confidence": "certain"
|
|
18332
18350
|
},
|
|
18333
18351
|
{
|
|
18334
|
-
"id": "
|
|
18352
|
+
"id": "666291db6ac3",
|
|
18335
18353
|
"surface": "landing",
|
|
18336
|
-
"text": "The platform stores the date you accepted these terms, and which version, on your account. It is written
|
|
18354
|
+
"text": "The platform stores the date you accepted these terms, and which version, on your account. It is written by signing in here, and only once — signing in again does not change the original date. This is version",
|
|
18337
18355
|
"file": "modules/public-landing/public/terms.html",
|
|
18338
18356
|
"line": 70,
|
|
18339
18357
|
"origin": "html-text",
|
|
@@ -18416,7 +18434,7 @@
|
|
|
18416
18434
|
"surface": "landing",
|
|
18417
18435
|
"text": "These terms ship with the software and change with it. The version served on this page is the one that applies; the repository keeps the history.",
|
|
18418
18436
|
"file": "modules/public-landing/public/terms.html",
|
|
18419
|
-
"line":
|
|
18437
|
+
"line": 80,
|
|
18420
18438
|
"origin": "html-text",
|
|
18421
18439
|
"confidence": "certain"
|
|
18422
18440
|
},
|
|
@@ -18470,7 +18488,7 @@
|
|
|
18470
18488
|
"surface": "landing",
|
|
18471
18489
|
"text": "To the extent the law allows, the people running {{productName}} are not liable for loss arising from its use. It is free software, offered without warranty, as the AGPL-3.0 states.",
|
|
18472
18490
|
"file": "modules/public-landing/public/terms.html",
|
|
18473
|
-
"line":
|
|
18491
|
+
"line": 77,
|
|
18474
18492
|
"origin": "html-text",
|
|
18475
18493
|
"confidence": "certain"
|
|
18476
18494
|
},
|
|
@@ -19082,7 +19100,7 @@
|
|
|
19082
19100
|
"surface": "landing",
|
|
19083
19101
|
"text": "contact page",
|
|
19084
19102
|
"file": "modules/public-landing/public/terms.html",
|
|
19085
|
-
"line":
|
|
19103
|
+
"line": 81,
|
|
19086
19104
|
"origin": "html-text",
|
|
19087
19105
|
"confidence": "certain"
|
|
19088
19106
|
},
|
|
@@ -19244,7 +19262,7 @@
|
|
|
19244
19262
|
"surface": "landing",
|
|
19245
19263
|
"text": "privacy page",
|
|
19246
19264
|
"file": "modules/public-landing/public/terms.html",
|
|
19247
|
-
"line":
|
|
19265
|
+
"line": 81,
|
|
19248
19266
|
"origin": "html-text",
|
|
19249
19267
|
"confidence": "certain"
|
|
19250
19268
|
},
|
|
@@ -2526,6 +2526,8 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
2526
2526
|
1.19.1023 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2527
2527
|
landed since 1.19.1022 with no explicit bump. run 36178875275. (task 1002620)
|
|
2528
2528
|
1.19.1024 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2529
|
-
landed since 1.19.1023 with no explicit bump. run
|
|
2529
|
+
landed since 1.19.1023 with no explicit bump. run 36183325302. (task 1002620)
|
|
2530
|
+
1.19.1025 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2531
|
+
landed since 1.19.1024 with no explicit bump. run 36185386905. (task 1002620)
|
|
2530
2532
|
---------------------------------------------------------------------------
|
|
2531
2533
|
```
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
-- core_255_access_requests_invite_kind.sql — an invite can be told apart from an
|
|
2
|
+
-- approved application, and keeps who sent it (task 1002814, R2 of the project
|
|
3
|
+
-- admin console wave; ADR 0335 D2).
|
|
4
|
+
--
|
|
5
|
+
-- An archon's invite (POST /access-requests/invite) writes the same
|
|
6
|
+
-- status='invited' row an approved application ends in, because that row is what
|
|
7
|
+
-- the sign-in gate reads. Until now nothing else distinguished the two, and the
|
|
8
|
+
-- only trace of the inviter was resolved_by_builder_id — which a rescind
|
|
9
|
+
-- overwrites with whoever rescinded (ADR 0201 D4.2).
|
|
10
|
+
--
|
|
11
|
+
-- kind 'application' (the default — the public POST names neither
|
|
12
|
+
-- column) or 'invite'. An invite that approves a pending
|
|
13
|
+
-- application in place leaves it 'application': it was one.
|
|
14
|
+
-- created_by the sender, set on invite rows only; a rescind never touches it.
|
|
15
|
+
-- note no new column — on an invite row it holds the inviter's words,
|
|
16
|
+
-- and `kind` says whose.
|
|
17
|
+
--
|
|
18
|
+
-- THE BACKFILL IS EXACT (D2.4). The invite route has always inserted with
|
|
19
|
+
-- resolved_at = now() beside created_at's now() default, so every row it wrote
|
|
20
|
+
-- has created_at = resolved_at, and no approved application can (it is resolved
|
|
21
|
+
-- after it was filed). The one miss is an old invite later rescinded — the
|
|
22
|
+
-- rescind moved resolved_at — which stays 'application' and admits nobody either
|
|
23
|
+
-- way. Guarded on kind, so a replay touches nothing.
|
|
24
|
+
--
|
|
25
|
+
-- NOT AUTHORITY (D2.5, ADR 0016). No admission read looks at either column: an
|
|
26
|
+
-- invite and an approved application admit through the identical
|
|
27
|
+
-- status = 'invited' read. tests/project_admin_console_model.mjs pins that.
|
|
28
|
+
--
|
|
29
|
+
-- Purely additive + idempotent (IF NOT EXISTS skips the column AND its CHECK on a
|
|
30
|
+
-- replay). The previous release never names either column, and its inserts take
|
|
31
|
+
-- the defaults, so a rollback runs unchanged. access_requests is CORE-owned
|
|
32
|
+
-- (060_access_requests), so this is a core_ migration (ADR 0108 §5); migrate.sh
|
|
33
|
+
-- records the stem.
|
|
34
|
+
|
|
35
|
+
BEGIN;
|
|
36
|
+
|
|
37
|
+
ALTER TABLE access_requests
|
|
38
|
+
ADD COLUMN IF NOT EXISTS kind text NOT NULL DEFAULT 'application'
|
|
39
|
+
CONSTRAINT access_requests_kind_check CHECK (kind IN ('application', 'invite')),
|
|
40
|
+
ADD COLUMN IF NOT EXISTS created_by bigint REFERENCES builders(id);
|
|
41
|
+
|
|
42
|
+
UPDATE access_requests
|
|
43
|
+
SET kind = 'invite', created_by = resolved_by_builder_id
|
|
44
|
+
WHERE status = 'invited' AND kind = 'application' AND created_at = resolved_at;
|
|
45
|
+
|
|
46
|
+
COMMENT ON COLUMN access_requests.kind IS
|
|
47
|
+
'application (the default: filed through the public POST) or invite (sent by a builder via POST /access-requests/invite) — ADR 0335 D2. An invite that approved a pending application in place stays application. DESCRIPTIVE ONLY — no admission path reads it (ADR 0016): status=''invited'' is the whole gate.';
|
|
48
|
+
|
|
49
|
+
COMMENT ON COLUMN access_requests.created_by IS
|
|
50
|
+
'The builder who sent an invite (kind=invite rows only; NULL on applications). Its own column because a rescind overwrites resolved_by_builder_id (ADR 0201 D4.2, ADR 0335 D2.2). DESCRIPTIVE ONLY — no admission path reads it (ADR 0016).';
|
|
51
|
+
|
|
52
|
+
COMMIT;
|
|
@@ -179,7 +179,7 @@ const PERMISSIONS = [
|
|
|
179
179
|
// one of them would make this delegation self-reversible.
|
|
180
180
|
{ key: 'builder.status.set', system: false, floor: 'archon', guards: 'PATCH /builders/:id/status — offboard / (de)activate' },
|
|
181
181
|
{ key: 'auth.session.revoke', system: false, floor: 'archon', guards: 'POST /auth/revoke, /auth/revoke-all' },
|
|
182
|
-
{ key: 'access_request.review', system: false, floor: 'archon', guards: 'GET/PATCH /access-requests/:id, POST /access-requests/invite — admit a builder' },
|
|
182
|
+
{ key: 'access_request.review', system: false, floor: 'archon', guards: 'GET/PATCH /access-requests/:id, POST /access-requests/invite, GET /access-requests/invites — admit a builder' },
|
|
183
183
|
|
|
184
184
|
// ── operational — floor metic (the working rank's review/triage/authoring) ────
|
|
185
185
|
{ key: 'idea.triage', system: false, floor: 'metic', guards: 'PATCH /inbox/:id' },
|
|
@@ -25,6 +25,11 @@
|
|
|
25
25
|
// POST /api/bongos/access-requests/invite Archon-only — invite a GitHub
|
|
26
26
|
// username before any request exists:
|
|
27
27
|
// the way in on an invite-only project.
|
|
28
|
+
// The row says it is an invite (`kind`)
|
|
29
|
+
// and who sent it (`created_by`).
|
|
30
|
+
// GET /api/bongos/access-requests/invites Archon-only — the outstanding
|
|
31
|
+
// invites: sent, not rescinded, and not
|
|
32
|
+
// yet signed in (ADR 0335 D2).
|
|
28
33
|
//
|
|
29
34
|
// Which door a project runs — open / apply / invite_only / locked — is the
|
|
30
35
|
// COMPOSITION of three owner-set knobs, read through the doorway's
|
|
@@ -300,24 +305,34 @@ module.exports = function buildAccessRequestsRouter() {
|
|
|
300
305
|
return res.fail('bad_status', 400);
|
|
301
306
|
}
|
|
302
307
|
try {
|
|
308
|
+
// `kind` + `invited_by_login` let the invited history tell an invite from
|
|
309
|
+
// an approved application (ADR 0335 D2) — descriptive, like the vouch.
|
|
303
310
|
const { rows } = await pool.query(
|
|
304
311
|
`SELECT ar.id, ar.github_login, ar.display_name, ar.note, ar.status,
|
|
305
|
-
ar.created_at, ar.resolved_at,
|
|
312
|
+
ar.created_at, ar.resolved_at, ar.kind,
|
|
306
313
|
ar.applicant_github_id, ar.applicant_handle, ar.vouched_at,
|
|
307
314
|
(ar.applicant_github_id IS NOT NULL) AS vouched,
|
|
308
|
-
rb.github_login AS resolved_by_login
|
|
315
|
+
rb.github_login AS resolved_by_login,
|
|
316
|
+
ib.github_login AS invited_by_login
|
|
309
317
|
FROM access_requests ar
|
|
310
318
|
LEFT JOIN builders rb ON rb.id = ar.resolved_by_builder_id
|
|
319
|
+
LEFT JOIN builders ib ON ib.id = ar.created_by
|
|
311
320
|
WHERE ar.status = $1
|
|
312
321
|
ORDER BY ar.created_at DESC
|
|
313
322
|
LIMIT 200`,
|
|
314
323
|
[status]
|
|
315
324
|
);
|
|
325
|
+
// On an invite row the stored note is the INVITER's words, but this read's
|
|
326
|
+
// `note` has always meant the applicant's (the hall quotes it as theirs),
|
|
327
|
+
// so an invite's note travels as `invite_note` instead.
|
|
328
|
+
const shaped = rows.map(({ note, ...r }) => (r.kind === 'invite'
|
|
329
|
+
? { ...r, note: null, invite_note: note }
|
|
330
|
+
: { ...r, note, invite_note: null }));
|
|
316
331
|
// C4's other half (privacy spec D7, task 1002972): the applicant's own
|
|
317
332
|
// profile, as their OWN privacy rules would show it, resolved from the hub
|
|
318
333
|
// at render. See attachApplicantProfiles — it is keyed on the vouch, never
|
|
319
334
|
// on the login, and every row it cannot resolve carries `profile: null`.
|
|
320
|
-
res.json({ requests: await attachApplicantProfiles(
|
|
335
|
+
res.json({ requests: await attachApplicantProfiles(shaped) });
|
|
321
336
|
} catch (err) {
|
|
322
337
|
log.error('[gds] GET /access-requests', err);
|
|
323
338
|
res.fail('list_failed', { status: 500, message: 'internal error' });
|
|
@@ -451,18 +466,25 @@ module.exports = function buildAccessRequestsRouter() {
|
|
|
451
466
|
// Archons inviting the same login at once can each insert a row (the unique
|
|
452
467
|
// index covers pending only): harmless — the gate reads "any invited row" —
|
|
453
468
|
// and it shows as two lines in the invited history, so no lock is taken.
|
|
454
|
-
//
|
|
455
|
-
//
|
|
456
|
-
//
|
|
469
|
+
//
|
|
470
|
+
// A fresh row is marked kind='invite' with created_by = the sender (a rescind
|
|
471
|
+
// overwrites resolved_by) and the optional note as the inviter's words. A pending
|
|
472
|
+
// request resolved in place stays an application with its applicant's own note
|
|
473
|
+
// (ADR 0335 D2.1–D2.3; task 1002814).
|
|
474
|
+
// body: { github_login, note? }. 201 with a new row; 200 with the row when a
|
|
475
|
+
// pending request was resolved; 200 already_invited when an invite already
|
|
476
|
+
// stands; 409 already_member when they have an account.
|
|
457
477
|
// rank: archon — the same gate as resolving a request.
|
|
458
478
|
router.post('/access-requests/invite', auth.requireBuilder, auth.requirePermission('access_request.review'), async (req, res) => {
|
|
459
479
|
if (validateOrRespond(req, res, {
|
|
460
480
|
github_login: { required: true, type: 'string', minLength: 1, maxLength: 60 },
|
|
481
|
+
note: { type: 'string', maxLength: 500 },
|
|
461
482
|
})) return;
|
|
462
483
|
const login = normalizeLogin(req.body.github_login);
|
|
463
484
|
if (!GITHUB_LOGIN_RE.test(login)) {
|
|
464
485
|
return res.fail('bad_github_login', { status: 400, message: 'That does not look like a GitHub username.' });
|
|
465
486
|
}
|
|
487
|
+
const note = (req.body.note || '').trim() || null;
|
|
466
488
|
try {
|
|
467
489
|
const member = await pool.query(
|
|
468
490
|
`SELECT 1 FROM builders WHERE lower(github_login) = lower($1) LIMIT 1`,
|
|
@@ -485,17 +507,17 @@ module.exports = function buildAccessRequestsRouter() {
|
|
|
485
507
|
resolved_by_builder_id = $1,
|
|
486
508
|
resolved_at = now()
|
|
487
509
|
WHERE lower(github_login) = lower($2) AND status = 'pending'
|
|
488
|
-
RETURNING id, github_login, status, resolved_at`,
|
|
510
|
+
RETURNING id, github_login, status, kind, resolved_at`,
|
|
489
511
|
[req.builder.id, login]
|
|
490
512
|
);
|
|
491
513
|
if (resolved.rows.length > 0) {
|
|
492
514
|
return res.json({ ok: true, request: resolved.rows[0] });
|
|
493
515
|
}
|
|
494
516
|
const { rows } = await pool.query(
|
|
495
|
-
`INSERT INTO access_requests (github_login, status, resolved_by_builder_id, resolved_at)
|
|
496
|
-
VALUES ($1, 'invited', $
|
|
497
|
-
RETURNING id, github_login, status, resolved_at`,
|
|
498
|
-
[login, req.builder.id]
|
|
517
|
+
`INSERT INTO access_requests (github_login, note, kind, created_by, status, resolved_by_builder_id, resolved_at)
|
|
518
|
+
VALUES ($1, $2, 'invite', $3, 'invited', $3, now())
|
|
519
|
+
RETURNING id, github_login, status, kind, resolved_at`,
|
|
520
|
+
[login, note, req.builder.id]
|
|
499
521
|
);
|
|
500
522
|
return res.status(201).json({ ok: true, request: rows[0] });
|
|
501
523
|
} catch (err) {
|
|
@@ -504,5 +526,34 @@ module.exports = function buildAccessRequestsRouter() {
|
|
|
504
526
|
}
|
|
505
527
|
});
|
|
506
528
|
|
|
529
|
+
// GET /access-requests/invites[?mine=1] — the outstanding invites: kind='invite',
|
|
530
|
+
// still 'invited' (not rescinded), and no builder row yet (not yet accepted by
|
|
531
|
+
// signing in), each naming its sender; ?mine=1 keeps only the caller's own
|
|
532
|
+
// (ADR 0335 D2; task 1002814). Rescind one with PATCH /access-requests/:id.
|
|
533
|
+
// rank: archon — it names logins that are not members yet.
|
|
534
|
+
router.get('/access-requests/invites', auth.requireBuilder, auth.requirePermission('access_request.review'), async (req, res) => {
|
|
535
|
+
const mine = req.query.mine === '1';
|
|
536
|
+
const mineClause = mine ? 'AND ar.created_by = $1' : '';
|
|
537
|
+
try {
|
|
538
|
+
const { rows } = await pool.query(
|
|
539
|
+
`SELECT ar.id, ar.github_login, ar.note, ar.created_at,
|
|
540
|
+
ib.github_login AS invited_by_login
|
|
541
|
+
FROM access_requests ar
|
|
542
|
+
LEFT JOIN builders ib ON ib.id = ar.created_by
|
|
543
|
+
WHERE ar.kind = 'invite' AND ar.status = 'invited'
|
|
544
|
+
AND NOT EXISTS (SELECT 1 FROM builders b
|
|
545
|
+
WHERE lower(b.github_login) = lower(ar.github_login))
|
|
546
|
+
${mineClause}
|
|
547
|
+
ORDER BY ar.created_at DESC
|
|
548
|
+
LIMIT 200`,
|
|
549
|
+
mine ? [req.builder.id] : []
|
|
550
|
+
);
|
|
551
|
+
res.json({ invites: rows });
|
|
552
|
+
} catch (err) {
|
|
553
|
+
log.error('[gds] GET /access-requests/invites', err);
|
|
554
|
+
res.fail('list_invites_failed', { status: 500, message: 'internal error' });
|
|
555
|
+
}
|
|
556
|
+
});
|
|
557
|
+
|
|
507
558
|
return router;
|
|
508
559
|
};
|
|
@@ -137,7 +137,7 @@ async function identityById(githubIds, { pool = defaultPool } = {}) {
|
|
|
137
137
|
}
|
|
138
138
|
|
|
139
139
|
function mutualReason(n) {
|
|
140
|
-
return `${n}
|
|
140
|
+
return `${n} connection${n === 1 ? '' : 's'} in common`;
|
|
141
141
|
}
|
|
142
142
|
|
|
143
143
|
// listConnectionSuggestions({ githubId, pool }) → [{ handle, display_name,
|