@bongos/core 1.24.14 → 1.24.16
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 +308 -138
- package/.claude/skills/blocker-review/SKILL.md +2 -0
- package/.claude/skills/session-board/SKILL.md +29 -0
- package/.claude/skills/strand-fix/SKILL.md +1 -1
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +14 -0
- package/clients/bongos-client/index.cjs +14 -0
- package/clients/bongos-client/index.d.ts +23 -2
- package/clients/bongos-client/index.mjs +14 -0
- package/docs/adr/0385-money-lives-with-a-processor-credits-stay-a-project-meter.md +4 -0
- package/docs/api/openapi.json +369 -6
- package/docs/api-reference.md +19 -4
- package/docs/architecture.md +6 -0
- package/docs/copy-inventory.md +231 -204
- package/docs/copy-registry.json +488 -255
- package/docs/file-map.md +1 -0
- package/docs/module-api-changelog.md +4 -2
- package/docs/page-inventory.json +7 -1
- package/docs/page-readings.json +1132 -1103
- package/migrations/core_289_task_short_name.sql +34 -0
- package/modules/ai-studio/db.js +10 -0
- package/modules/ai-studio/gemini.js +73 -5
- package/modules/ai-studio/openrouter.js +17 -2
- package/modules/ai-studio/routes/ai-studio.js +7 -1
- package/modules/ai-studio/studio.js +8 -0
- package/modules/builder-settings/checkout-freshness.js +71 -0
- package/modules/builder-settings/routes/settings.js +26 -0
- package/modules/builder-settings/settings.js +2 -0
- package/modules/economy/migrations/economy_002_project_account.sql +83 -0
- package/modules/economy/module.json +1 -1
- package/modules/economy/project-account.js +166 -0
- package/modules/economy/routes/project-account.js +40 -0
- package/modules/hall-ui/public/ai-studio.css +3 -0
- package/modules/hall-ui/public/ai-studio.html +2 -1
- package/modules/hall-ui/public/ai-studio.js +72 -1
- package/modules/hall-ui/public/atlas.html +1 -1
- package/modules/hall-ui/public/blockers.html +1 -1
- package/modules/hall-ui/public/board-room.html +1 -1
- package/modules/hall-ui/public/city.html +1 -1
- package/modules/hall-ui/public/collab.html +1 -1
- package/modules/hall-ui/public/commands.html +1 -1
- package/modules/hall-ui/public/copy-desk.html +1 -1
- package/modules/hall-ui/public/deploy.html +1 -1
- package/modules/hall-ui/public/diagrams.html +1 -1
- package/modules/hall-ui/public/drachmae.html +1 -1
- package/modules/hall-ui/public/fleet.html +1 -1
- package/modules/hall-ui/public/gate.html +1 -1
- package/modules/hall-ui/public/github-chip.js +85 -0
- package/modules/hall-ui/public/goal-map.html +1 -1
- package/modules/hall-ui/public/goals.html +1 -1
- package/modules/hall-ui/public/government.html +1 -1
- package/modules/hall-ui/public/idea.html +1 -1
- package/modules/hall-ui/public/ideas.html +1 -1
- package/modules/hall-ui/public/index.html +1 -1
- package/modules/hall-ui/public/market-watch-item.html +2 -2
- package/modules/hall-ui/public/market-watch-item.js +10 -3
- package/modules/hall-ui/public/market-watch-item.states.json +41 -0
- package/modules/hall-ui/public/market-watch-lib.js +36 -5
- package/modules/hall-ui/public/market-watch-rules.html +1 -1
- package/modules/hall-ui/public/market-watch-settings.html +1 -1
- package/modules/hall-ui/public/market-watch.css +5 -0
- package/modules/hall-ui/public/market-watch.html +2 -2
- package/modules/hall-ui/public/modules.html +1 -1
- package/modules/hall-ui/public/my-agents.html +1 -1
- package/modules/hall-ui/public/my-agents.js +3 -0
- package/modules/hall-ui/public/panel.css +5 -0
- package/modules/hall-ui/public/primer.html +1 -1
- package/modules/hall-ui/public/profile.html +1 -1
- package/modules/hall-ui/public/project-settings.html +1 -1
- package/modules/hall-ui/public/ranks.html +1 -1
- package/modules/hall-ui/public/roadmap.html +1 -1
- package/modules/hall-ui/public/roster.html +1 -1
- package/modules/hall-ui/public/sessions.html +1 -1
- package/modules/hall-ui/public/settings-age.js +65 -0
- package/modules/hall-ui/public/settings.html +27 -1
- package/modules/hall-ui/public/settings.js +1 -0
- package/modules/hall-ui/public/shell.js +22 -22
- package/modules/hall-ui/public/street.html +1 -1
- package/modules/hall-ui/public/studio.html +1 -1
- package/modules/hall-ui/public/style.css +28 -0
- package/modules/hall-ui/public/task.html +1 -1
- package/modules/hall-ui/public/thinking.html +1 -1
- package/modules/hall-ui/public/tweak-editor.html +1 -1
- package/modules/hall-ui/public/watch.html +1 -1
- package/modules/hall-ui/public/work.html +1 -1
- package/modules/ideas/blockers.js +13 -7
- package/modules/lifecycle/db-claim-reads.js +1 -1
- package/modules/lifecycle/db-ship.js +2 -2
- package/modules/lifecycle/db-tasks.js +4 -4
- package/modules/lifecycle/migrations/lifecycle_019_pay_type_gates.sql +50 -0
- package/modules/lifecycle/module.json +1 -0
- package/modules/lifecycle/pay-type-gates.js +180 -0
- package/modules/lifecycle/publish-reconciler.js +31 -1
- package/modules/lifecycle/rebase-gate.js +3 -2
- package/modules/lifecycle/routes/claims.js +3 -2
- package/modules/lifecycle/routes/pay-type-gates.js +59 -0
- package/modules/lifecycle/routes/project-settings.js +4 -0
- package/modules/lifecycle/routes/task-write-routes.js +43 -0
- package/modules/lifecycle/ship-card.js +4 -1
- package/modules/lifecycle/task-name-db.js +55 -0
- package/modules/lifecycle/task-name.js +140 -0
- package/modules/market-watch/db.js +10 -1
- package/modules/market-watch/migrations/market_watch_004_entry_corrections.sql +20 -0
- package/modules/market-watch/pages.js +20 -1
- package/modules/market-watch/proposals.js +57 -7
- package/modules/market-watch/routes/pages.js +2 -0
- package/modules/market-watch/routes/rules.js +4 -0
- package/modules/platform-identity/terms-acceptance.js +9 -9
- package/modules/public-landing/public/account-google.states.json +14 -0
- package/modules/public-landing/public/assets/cosmos.css +12 -0
- package/modules/public-landing/public/assets/hub-bar.js +44 -1
- package/modules/public-landing/public/privacy.html +5 -1
- package/modules/public-landing/public/projects-google.states.json +14 -0
- package/modules/public-landing/public/projects.html +39 -0
- package/modules/public-landing/public/terms.html +12 -2
- package/modules/ui-design/kit/fixtures/me-google.json +10 -0
- package/modules/ui-design/kit/fixtures/me-sign-in-methods-google.json +4 -0
- package/modules/ui-design/kit/serve.js +7 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +55 -1
- package/scripts/bongos/claim.js +4 -2
- package/scripts/bongos/land-watch.js +1 -0
- package/scripts/bongos/report-checkout.js +30 -0
- package/scripts/bongos/run-unit-tests.js +11 -0
- package/scripts/bongos/sessions-board.js +264 -0
- package/scripts/bongos/ship-finish.js +1 -0
- package/scripts/bongos/ship-flow.js +5 -2
- package/scripts/bongos/strand-lease.js +5 -3
- package/scripts/bongos/strand-watch.js +38 -7
- package/scripts/gds/report-checkout.js +7 -0
- package/scripts/gds/sessions-board.js +7 -0
- package/src/bongos/agent-standing-rules.js +13 -3
- package/src/bongos/routes/me.js +7 -1
- package/src/module-api.js +1 -1
- package/tests/agent_standing_rules.mjs +18 -1
- package/tests/ai_studio_billing.mjs +13 -0
- package/tests/ai_studio_gemini_models.mjs +81 -0
- package/tests/ai_studio_requests.mjs +24 -0
- package/tests/blocker_detail_hydration.mjs +5 -3
- package/tests/blocker_tasks_named_db.mjs +74 -0
- package/tests/claim_gate_ci_unblock.mjs +1 -1
- package/tests/github_chip.mjs +217 -0
- package/tests/hall_ai_studio.mjs +129 -5
- package/tests/host_topology_skips.mjs +1 -0
- package/tests/hub_account_page.mjs +3 -2
- package/tests/landing_legal_pages.mjs +3 -2
- package/tests/market_watch_data_db.mjs +6 -0
- package/tests/market_watch_pages.mjs +87 -2
- package/tests/market_watch_rules.mjs +101 -5
- package/tests/market_watch_rules_db.mjs +42 -0
- package/tests/nav_permission_atoms.mjs +1 -1
- package/tests/pay_terms.mjs +8 -0
- package/tests/pay_type_gates.mjs +234 -0
- package/tests/pay_type_gates_db.mjs +84 -0
- package/tests/project_account.mjs +125 -0
- package/tests/project_account_db.mjs +97 -0
- package/tests/self_healing_start.mjs +162 -0
- package/tests/sessions_board.mjs +153 -0
- package/tests/settings_age.mjs +110 -0
- package/tests/stop_refcheck.mjs +40 -0
- package/tests/task_name.mjs +237 -0
- package/tests/task_name_db.mjs +79 -0
- package/tests/terms_acceptance.mjs +25 -3
- package/tests/terms_grandfather_db.mjs +11 -4
|
@@ -116,14 +116,57 @@
|
|
|
116
116
|
fetch(API + '/auth/logout', { method: 'POST', credentials: 'same-origin' }).then(finish, finish);
|
|
117
117
|
});
|
|
118
118
|
|
|
119
|
+
// ---- the Link GitHub chip (task 1004996): signed in with no GitHub linked ----
|
|
120
|
+
// Very small and quiet: one link at the head of the bar's right side, carrying
|
|
121
|
+
// the engineer's icon (the hall's craft-mode.js ICONS.building), never a pop-up
|
|
122
|
+
// or banner. It starts the link (ADR 0396), whose answer lands on /account. A
|
|
123
|
+
// read that fails, or a child with no sign-in-methods route, draws nothing.
|
|
124
|
+
// Only a stand-in login (~<handle>, the Google-only row) is asked about:
|
|
125
|
+
// linking GitHub writes the real login over it, so anyone else has GitHub
|
|
126
|
+
// and costs no read. projects.html keeps its own copy, as it does of the bands.
|
|
127
|
+
var GH_TITLE = 'Link GitHub — needed for coding work';
|
|
128
|
+
function githubChip(me) {
|
|
129
|
+
var old = $('ghChip');
|
|
130
|
+
if (!me || String(me.github_login || '').charAt(0) !== '~') { if (old) old.remove(); return null; }
|
|
131
|
+
return fetch(API + '/me/sign-in-methods', { method: 'GET', credentials: 'same-origin', headers: { Accept: 'application/json' } })
|
|
132
|
+
.then(function (res) { return res.ok ? res.json() : null; })
|
|
133
|
+
.then(function (d) {
|
|
134
|
+
var methods = d && Array.isArray(d.methods) ? d.methods : null;
|
|
135
|
+
var show = !!methods && !methods.some(function (m) { return m && m.provider === 'github'; });
|
|
136
|
+
var bar = show && document.querySelector('.barRight');
|
|
137
|
+
if (!bar) { if ($('ghChip')) $('ghChip').remove(); return false; }
|
|
138
|
+
if ($('ghChip')) return true;
|
|
139
|
+
var a = document.createElement('a');
|
|
140
|
+
a.className = 'ghChip';
|
|
141
|
+
a.id = 'ghChip';
|
|
142
|
+
a.href = API + '/auth/link/github/start';
|
|
143
|
+
a.title = GH_TITLE;
|
|
144
|
+
a.setAttribute('aria-label', GH_TITLE);
|
|
145
|
+
var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
|
|
146
|
+
svg.setAttribute('viewBox', '0 0 16 16');
|
|
147
|
+
svg.setAttribute('aria-hidden', 'true');
|
|
148
|
+
var path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
|
|
149
|
+
path.setAttribute('d', 'M2 13.5h12M3.5 13.5V8.5h4v5M7.5 13.5V4.5h5v9');
|
|
150
|
+
svg.appendChild(path);
|
|
151
|
+
var label = document.createElement('span');
|
|
152
|
+
label.className = 'ghChip__label';
|
|
153
|
+
label.textContent = 'Link GitHub';
|
|
154
|
+
a.appendChild(svg);
|
|
155
|
+
a.appendChild(label);
|
|
156
|
+
bar.insertBefore(a, bar.firstChild);
|
|
157
|
+
return true;
|
|
158
|
+
}, function () { return false; });
|
|
159
|
+
}
|
|
160
|
+
|
|
119
161
|
// ---- the identity read: the hub's own GET /me ----
|
|
120
162
|
var ready = fetch(API + '/me', { method: 'GET', credentials: 'same-origin', headers: { Accept: 'application/json' } })
|
|
121
163
|
.then(function (res) { return res.ok ? res.json().catch(function () { return null; }) : null; })
|
|
122
164
|
.then(function (d) {
|
|
123
165
|
var me = d ? (d.builder || d.me || d) : null;
|
|
124
166
|
paint(me);
|
|
167
|
+
githubChip(me);
|
|
125
168
|
return me;
|
|
126
169
|
}, function () { paint(null); return null; });
|
|
127
170
|
|
|
128
|
-
window.HubBar = { paint: paint, ready: ready };
|
|
171
|
+
window.HubBar = { paint: paint, ready: ready, githubChip: githubChip };
|
|
129
172
|
})();
|
|
@@ -124,10 +124,14 @@
|
|
|
124
124
|
<ul>
|
|
125
125
|
<li><b>GitHub</b> — for signing in, and for the repositories your projects ship to.</li>
|
|
126
126
|
<li><b>The AI model provider</b> — when a shipped task is graded, the change it made is sent to the model the grader runs on, Anthropic's Claude, under the key of the builder or the instance.</li>
|
|
127
|
+
<li><b>AI features, through OpenRouter</b> — when you use AI Studio, your prompt, the files you attach, and short notes about the project are sent through OpenRouter to the AI company whose model answers (for example Google's Gemini). We set OpenRouter to use only companies that do not keep your prompts or train on them. Your requests, files and results are stored here so you can see them again, with what each one cost.</li>
|
|
127
128
|
<!--apex-only:start--><li><b>Hosting</b> — projects hosted by the platform run on servers rented from DigitalOcean, with their web address and traffic passing through Cloudflare.</li><!--apex-only:end-->
|
|
128
129
|
</ul>
|
|
129
130
|
<p>Nothing is sold, and nothing is shared for advertising.</p>
|
|
130
131
|
|
|
132
|
+
<h2>Your age</h2>
|
|
133
|
+
<p>If you record your age, only its band is kept (for example "adult" or "16 to 17"), not your birthday. It decides whether you can be paid and whether you can use the AI features, which are for adults only.</p>
|
|
134
|
+
|
|
131
135
|
<h2>Session length, and Leaving</h2>
|
|
132
136
|
<p>Sign out to end a session. Browser sessions expire on their own; command-line tokens last until you revoke them from your settings.</p>
|
|
133
137
|
<p>Your builder record and your shipped work stay attributed to you after you leave — the ledger of who built what is the point of the platform. The owner can deactivate a builder: that ends their sessions and releases their claims, and keeps the record.</p>
|
|
@@ -135,7 +139,7 @@
|
|
|
135
139
|
|
|
136
140
|
<h2>The code is open</h2>
|
|
137
141
|
<p>Every part of this — what is stored, where, and for how long — is public. This site runs Cloud Bongos, free software under the AGPL-3.0. <a href="{{sourceRepoUrl}}">Read the source.</a></p>
|
|
138
|
-
<p>This statement describes the software as it ships and changes when the software does. Revised
|
|
142
|
+
<p>This statement describes the software as it ships and changes when the software does. Revised October 2026.</p>
|
|
139
143
|
</section>
|
|
140
144
|
</main>
|
|
141
145
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_": "The Link GitHub chip on the hub (task 1004996): a Google-only person signed in on the sky, so projects.html's own bar copy draws the very small chip with the engineer's icon at the head of its right side. stub.fixtures points the identity at fixtures/me-google.json (the stand-in login ~builder) and the ways-in read at fixtures/me-sign-in-methods-google.json; the default projects.states.json (GitHub linked) draws none.",
|
|
3
|
+
"page": "/projects",
|
|
4
|
+
"surface": "public-landing",
|
|
5
|
+
"stub": { "fixtures": { "me": "me-google", "me__sign-in-methods": "me-sign-in-methods-google" } },
|
|
6
|
+
"modes": ["dark"],
|
|
7
|
+
"modeQuery": false,
|
|
8
|
+
"ignoreRequests": ["/api/(gds|bongos)/me$", "/my-projects", "/api/bongos/instance$"],
|
|
9
|
+
"ignoreConsole": ["/api/(gds|bongos)/me", "\\b401\\b", "\\b404\\b", "Unauthorized"],
|
|
10
|
+
"ignoreControls": [".skip", ".vh"],
|
|
11
|
+
"states": {
|
|
12
|
+
"in-google": { "auth": true, "actions": [["wait", 800]], "expect": { "visible": ["#ghChip", "#who"], "attr": [["#ghChip", "href", "/api/bongos/auth/link/github/start"]] } }
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -11818,6 +11818,44 @@ summary{min-height:24px;padding:3px 0;}
|
|
|
11818
11818
|
if (!signedIn && $('onlyMine').checked) { $('onlyMine').checked = false; applyMapFilter(); }
|
|
11819
11819
|
}
|
|
11820
11820
|
|
|
11821
|
+
/* The Link GitHub chip (task 1004996): signed in with no GitHub linked, one very
|
|
11822
|
+
small link at the head of the bar's right side with the engineer's icon. It
|
|
11823
|
+
starts the link (ADR 0396); the answer lands on /account. A failed read, or a
|
|
11824
|
+
child with no sign-in-methods route, draws nothing. Only a stand-in login
|
|
11825
|
+
(~<handle>) is asked about: linking GitHub writes the real login over it.
|
|
11826
|
+
assets/hub-bar.js keeps the same lines for the pages without views; change both. */
|
|
11827
|
+
var GH_TITLE = 'Link GitHub — needed for coding work';
|
|
11828
|
+
function githubChip() {
|
|
11829
|
+
if (!me || String(me.github_login || '').charAt(0) !== '~') return;
|
|
11830
|
+
fetch(API + '/me/sign-in-methods', { method: 'GET', credentials: 'same-origin', headers: { Accept: 'application/json' } })
|
|
11831
|
+
.then(function (res) { return res.ok ? res.json() : null; })
|
|
11832
|
+
.then(function (d) {
|
|
11833
|
+
var methods = d && Array.isArray(d.methods) ? d.methods : null;
|
|
11834
|
+
var show = !!methods && !methods.some(function (m) { return m && m.provider === 'github'; });
|
|
11835
|
+
var bar = show && document.querySelector('.barRight');
|
|
11836
|
+
if (!bar) { if ($('ghChip')) $('ghChip').remove(); return; }
|
|
11837
|
+
if ($('ghChip')) return;
|
|
11838
|
+
var a = document.createElement('a');
|
|
11839
|
+
a.className = 'ghChip';
|
|
11840
|
+
a.id = 'ghChip';
|
|
11841
|
+
a.href = API + '/auth/link/github/start';
|
|
11842
|
+
a.title = GH_TITLE;
|
|
11843
|
+
a.setAttribute('aria-label', GH_TITLE);
|
|
11844
|
+
var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
|
|
11845
|
+
svg.setAttribute('viewBox', '0 0 16 16');
|
|
11846
|
+
svg.setAttribute('aria-hidden', 'true');
|
|
11847
|
+
var path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
|
|
11848
|
+
path.setAttribute('d', 'M2 13.5h12M3.5 13.5V8.5h4v5M7.5 13.5V4.5h5v9');
|
|
11849
|
+
svg.appendChild(path);
|
|
11850
|
+
var label = document.createElement('span');
|
|
11851
|
+
label.className = 'ghChip__label';
|
|
11852
|
+
label.textContent = 'Link GitHub';
|
|
11853
|
+
a.appendChild(svg);
|
|
11854
|
+
a.appendChild(label);
|
|
11855
|
+
bar.insertBefore(a, bar.firstChild);
|
|
11856
|
+
}, function () { /* no answer: no chip */ });
|
|
11857
|
+
}
|
|
11858
|
+
|
|
11821
11859
|
/* Boot. The view is set FIRST, from the URL, so the page is navigable before
|
|
11822
11860
|
any request resolves — /projects?view=new must land on the create view even
|
|
11823
11861
|
if the identity call is slow or fails. */
|
|
@@ -11838,6 +11876,7 @@ summary{min-height:24px;padding:3px 0;}
|
|
|
11838
11876
|
/* renderWho rebuilds the chip, so the waiting count is painted again on it (task 1004646) */
|
|
11839
11877
|
if (window.InviteBadge) window.InviteBadge.refresh();
|
|
11840
11878
|
paintShellIdentity();
|
|
11879
|
+
githubChip();
|
|
11841
11880
|
wizard.onAuth();
|
|
11842
11881
|
$('gate').hidden = true;
|
|
11843
11882
|
$('mine').hidden = false;
|
|
@@ -129,9 +129,19 @@
|
|
|
129
129
|
<p><b>These numbers describe; they do not govern.</b> Your cross-project record is descriptive analytics and never authority. What you may do inside any project is decided by that project alone, from its own records, at the moment you ask. A large record grants nothing and a hidden one takes nothing away; no project is required to read it, and none may treat it as permission. A rank shown here is that project’s own standing for you, as that project reported it — the platform holds no rank of its own.</p>
|
|
130
130
|
<p><b>What is public.</b> Once you have signed in with your platform account in your browser, here or to a project, and accepted these terms, your profile and that record are public by default: at your handle’s page, in the people directory, to project owners looking for people to work with, and to search engines. An account that has never signed in that way stays provisional and is published nowhere.</p>
|
|
131
131
|
<p><b>What you control.</b> From your settings you can hide your statistics, drop out of the recruiting directory, or make your account private. Each takes effect immediately, everywhere, including on a page someone already has open. Hiding removes the platform’s combined view; it does not retract the per-project numbers each project publishes itself, so a determined reader could still add them up the hard way.</p>
|
|
132
|
-
<p><b>Your acceptance is recorded.</b> The platform stores the date you accepted these terms, and which version, on your account. It is written when you sign in with your platform account in your browser, here or to a project, and only once — signing in again does not change the date you accepted. Signing in from the command line does not record it: you approve that sign-in on GitHub’s page, where these terms are not shown, so an account that has only signed in that way stays unpublished until you sign in once in your browser. This is version <b>2026-
|
|
132
|
+
<p><b>Your acceptance is recorded.</b> The platform stores the date you accepted these terms, and which version, on your account. It is written when you sign in with your platform account in your browser, here or to a project, and only once — signing in again does not change the date you accepted. When these terms change, your next sign-in that way records that you accepted the new version. Signing in from the command line does not record it: you approve that sign-in on GitHub’s page, where these terms are not shown, so an account that has only signed in that way stays unpublished until you sign in once in your browser. This is version <b>2026-10-30</b>.</p>
|
|
133
133
|
<p><b>Accounts from before these terms.</b> 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 that way.</p>
|
|
134
134
|
<!--apex-only:end-->
|
|
135
|
+
<h2>AI features</h2>
|
|
136
|
+
<p>Some features, such as AI Studio, send what you submit to an AI model run by another company, reached through OpenRouter. To use them:</p>
|
|
137
|
+
<ul>
|
|
138
|
+
<li>You must be 18 or over. The AI companies only serve adults, so these features stay off until your account records that you are.</li>
|
|
139
|
+
<li>You agree to follow the terms and usage policies of the AI company whose model answers your request, and OpenRouter's own terms. Which company that is shows on <a href="https://openrouter.ai/models">openrouter.ai</a>.</li>
|
|
140
|
+
<li>You may not use what these features produce to train or build a competing AI model, or try to trick a model into breaking its own rules.</li>
|
|
141
|
+
<li>You are responsible for what you submit and for what you do with the results, including that you have the right to use any image or file you upload.</li>
|
|
142
|
+
</ul>
|
|
143
|
+
<p>When you pay with your balance, the price is what the AI company charged plus a small markup, shown before you confirm. When you use your own key, you pay that company directly and its terms apply to you as its customer. AI output can be wrong; check it before you rely on it.</p>
|
|
144
|
+
|
|
135
145
|
<h2>Fair use</h2>
|
|
136
146
|
<p>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.</p>
|
|
137
147
|
|
|
@@ -140,7 +150,7 @@
|
|
|
140
150
|
|
|
141
151
|
<h2>Changes</h2>
|
|
142
152
|
<p>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. <a href="{{sourceRepoUrl}}">Read the source.</a></p>
|
|
143
|
-
<p>Questions go through the <a href="/contact">contact page</a>. What is kept about you is on the <a href="/privacy">privacy page</a>. Revised
|
|
153
|
+
<p>Questions go through the <a href="/contact">contact page</a>. What is kept about you is on the <a href="/privacy">privacy page</a>. Revised October 2026.</p>
|
|
144
154
|
</section>
|
|
145
155
|
</main>
|
|
146
156
|
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_": "A Google-only builder (task 1004996): the stand-in login ~<handle> a Google-born row carries until GitHub is linked. Aliased as me by the *-google states files, beside me-sign-in-methods-google.",
|
|
3
|
+
"builder": {
|
|
4
|
+
"id": "1",
|
|
5
|
+
"github_login": "~builder",
|
|
6
|
+
"display_name": "A Builder",
|
|
7
|
+
"avatar_url": "/__kit/avatar.svg",
|
|
8
|
+
"rank": "archon"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -585,8 +585,14 @@ function myGuilds(res) {
|
|
|
585
585
|
// The fixture builder is GitHub-born with Google linked, held for the run so a
|
|
586
586
|
// Remove reads back. Each way in carries the route's own unlink_refused, by
|
|
587
587
|
// account-logins.js unlinkRefusal's rule, and DELETE refuses as the route does.
|
|
588
|
+
// A states file may alias `me__sign-in-methods` to a fixture's `methods` (task 1004996: the
|
|
589
|
+
// Link GitHub chip pictures a Google-only person through `me-sign-in-methods-google`).
|
|
588
590
|
let _ways = null;
|
|
589
|
-
function waysHeld() {
|
|
591
|
+
function waysHeld() {
|
|
592
|
+
if (_ways) return _ways;
|
|
593
|
+
if (ALIAS['me__sign-in-methods']) return (_ways = heldFixture('me__sign-in-methods').methods.map((m) => ({ provider: m.provider, email: m.email || null })));
|
|
594
|
+
return (_ways = [{ provider: 'github', email: null }, { provider: 'google', email: 'octo@example.com' }]);
|
|
595
|
+
}
|
|
590
596
|
function wayRefusal(provider, count) { return provider === 'github' ? 'born_with' : count <= 1 ? 'last_way_in' : null; }
|
|
591
597
|
function signInMethods(res) {
|
|
592
598
|
const held = waysHeld();
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.24.
|
|
3
|
+
"version": "1.24.16",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.24.
|
|
9
|
+
"version": "1.24.16",
|
|
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.24.
|
|
3
|
+
"version": "1.24.16",
|
|
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/release-notes.json
CHANGED
|
@@ -10922,10 +10922,64 @@
|
|
|
10922
10922
|
"text": "The weekly Market Watch run now also reads the links members added to a tracked item, treating them safely as outside text and staying within its page-reading limit."
|
|
10923
10923
|
}
|
|
10924
10924
|
],
|
|
10925
|
-
"1.24.
|
|
10925
|
+
"1.24.15": [
|
|
10926
|
+
{
|
|
10927
|
+
"id": "1005027",
|
|
10928
|
+
"text": "The automatic checks that gate releases now agree with the new terms rule, so finished work can reach the live site again."
|
|
10929
|
+
},
|
|
10930
|
+
{
|
|
10931
|
+
"id": "1005026",
|
|
10932
|
+
"text": "Approving a correction to a Market Watch log entry works again, and the release lane that puts finished work on the live site is unblocked."
|
|
10933
|
+
},
|
|
10934
|
+
{
|
|
10935
|
+
"id": "1005025",
|
|
10936
|
+
"text": "AI Studio is now adults only and only uses AI providers that do not keep or train on your prompts; the terms and privacy pages explain the AI features, and everyone re-accepts the updated terms at their next sign-in."
|
|
10937
|
+
},
|
|
10938
|
+
{
|
|
10939
|
+
"id": "1004958",
|
|
10940
|
+
"text": "Every task now has a short two or three word name, and the AI writes \"task 1004745 - payout approvals\" instead of a bare number: in the startup notes, the sessions board, claim and ship messages, stuck-ship notes and blockers."
|
|
10941
|
+
},
|
|
10942
|
+
{
|
|
10943
|
+
"id": "1003182",
|
|
10944
|
+
"text": "The project now has an account record that shows every movement of money and why it happened: who was paid, for which task, and under which payment-processor transfer. Entries can never be edited or deleted, a retried payout c"
|
|
10945
|
+
},
|
|
10946
|
+
{
|
|
10947
|
+
"id": "1005024",
|
|
10948
|
+
"text": "The AI Studio works again with your own Google key even when Google retires a model, and you can now paste a picture or take a photo with your camera."
|
|
10949
|
+
},
|
|
10950
|
+
{
|
|
10951
|
+
"id": "1004996",
|
|
10952
|
+
"text": "People who signed in with Google and have not linked GitHub now see a tiny \"Link GitHub\" chip in the top bar, with the engineer icon so it reads as needed for coding. One click starts linking. It disappears once GitHub is link"
|
|
10953
|
+
},
|
|
10954
|
+
{
|
|
10955
|
+
"id": "1005023",
|
|
10956
|
+
"text": "The slop reminder no longer pops up on the app's own status messages, only when someone actually corrects the AI."
|
|
10957
|
+
},
|
|
10958
|
+
{
|
|
10959
|
+
"id": "1005018",
|
|
10960
|
+
"text": "People using a screen reader on Market Watch now hear the right name for the pop-up they opened (\"stop tracking\" or \"send a new scout\") instead of always \"Propose a change\"."
|
|
10961
|
+
},
|
|
10962
|
+
{
|
|
10963
|
+
"id": "1005021",
|
|
10964
|
+
"text": "Each builder's computer now updates its own project folder at the start of a session, saving any old leftovers first, and tells them plainly when it can't."
|
|
10965
|
+
},
|
|
10966
|
+
{
|
|
10967
|
+
"id": "1004957",
|
|
10968
|
+
"text": "Ask the AI \"what are my sessions doing\" (or type /session-board) and it shows a table of everything you have going at once: each session, its task, whether it is building, waiting to land, back from review or stuck, and what i"
|
|
10969
|
+
},
|
|
10970
|
+
{
|
|
10971
|
+
"id": "1005016",
|
|
10972
|
+
"text": "When the owner approves a member's correction to a Market Watch finding, the finding now actually changes (or is marked wrong), the item page shows a small \"corrected\" note, and who, when and why are kept."
|
|
10973
|
+
},
|
|
10926
10974
|
{
|
|
10927
10975
|
"id": "1004906",
|
|
10928
10976
|
"text": "The payment processor is chosen: Stripe Connect. Each project's money will sit in its own Stripe account, so we never hold anyone's money. J.P. Morgan Payments is recorded as the backup. Nothing is bought or opened yet, and th"
|
|
10929
10977
|
}
|
|
10978
|
+
],
|
|
10979
|
+
"1.24.16": [
|
|
10980
|
+
{
|
|
10981
|
+
"id": "1005028",
|
|
10982
|
+
"text": "Settings now has a Your age section where you record your age group, which switches on AI Studio for adults."
|
|
10983
|
+
}
|
|
10930
10984
|
]
|
|
10931
10985
|
}
|
package/scripts/bongos/claim.js
CHANGED
|
@@ -12,6 +12,7 @@ const path = require('node:path');
|
|
|
12
12
|
const { cliClient, requireSession, fmtTouches, printOnboardingNudge, rewardPolicy, costPlusOnlyNote, detectWorktreeName, cliExit } = require('./cli-lib');
|
|
13
13
|
const { nextNumbers, padAdr, padMig } = require('./next-number');
|
|
14
14
|
const { CORE_NS } = require('./migration-namespace');
|
|
15
|
+
const { taskRef } = require('../../modules/lifecycle/task-name.js'); // task 1004958
|
|
15
16
|
const { contextPack, formatContextPack, resolveWorktreeRoot } = require('./context-pack');
|
|
16
17
|
const { printClaimRecall } = require('./claim-recall');
|
|
17
18
|
const { decideWorktreeClaim, ESCAPE_FLAG } = require('./worktree-claim-guard');
|
|
@@ -238,6 +239,7 @@ function printClaimCard(task, widgetsEnabled = true) {
|
|
|
238
239
|
const model = shipCard.buildCardModel({
|
|
239
240
|
stage: 'claimed',
|
|
240
241
|
taskId: task.id,
|
|
242
|
+
shortName: task.short_name,
|
|
241
243
|
title: task.title,
|
|
242
244
|
description: task.description || '',
|
|
243
245
|
estMinutes: task.est_minutes != null ? Number(task.est_minutes) : null,
|
|
@@ -391,13 +393,13 @@ function claimFailureGuidance({ code, message, d }, r, taskId, ctx) {
|
|
|
391
393
|
// so this one leaves it alone instead of piling onto the same /strand-fix.
|
|
392
394
|
const leases = (ctx && ctx.strandLeases) || [];
|
|
393
395
|
for (const t of owed) {
|
|
394
|
-
lines.push(` -
|
|
396
|
+
lines.push(` - ${taskRef(t.id, t.short_name)}${t.title ? ` ${clip(t.title)}` : ''}`);
|
|
395
397
|
if (t.reason) lines.push(` flagged: ${clip(t.reason)}`);
|
|
396
398
|
const held = leases.find((l) => String(l.task_id) === String(t.id) && !l.mine);
|
|
397
399
|
if (held) lines.push(` already being fixed by ${held.by} — leave it to that session`);
|
|
398
400
|
}
|
|
399
401
|
if (waiting.length) lines.push(' Waiting, not on you (set aside; they land on their own):');
|
|
400
|
-
for (const t of waiting) lines.push(` -
|
|
402
|
+
for (const t of waiting) lines.push(` - ${taskRef(t.id, t.short_name)}${t.title ? ` ${clip(t.title)}` : ''} — ${clip(t.waits_on || t.reason || 'outside you')}`);
|
|
401
403
|
lines.push(` ${clip(d.hint, 600) || 'Clear it with /strand-fix N, or rebase the branch and re-ship — or /builder-release it to give up on one.'}`);
|
|
402
404
|
return { lines, exit: QUEUE_GATED_EXIT };
|
|
403
405
|
}
|
|
@@ -118,6 +118,7 @@ function buildShippedEnvelope(crumb, task) {
|
|
|
118
118
|
...inputs,
|
|
119
119
|
postGradeStatus: 'shipped',
|
|
120
120
|
taskId: crumb.taskId,
|
|
121
|
+
shortName: inputs.shortName || (task && task.short_name),
|
|
121
122
|
// Prefer a fact from the fresh task row when the breadcrumb didn't carry it.
|
|
122
123
|
title: inputs.title || (task && task.title) || `Task #${crumb.taskId}`,
|
|
123
124
|
valueSummary: inputs.valueSummary || (task && task.value_summary) || '',
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// scripts/bongos/report-checkout.js — tell the server how far behind this computer's
|
|
3
|
+
// project folder is (task 1005021).
|
|
4
|
+
//
|
|
5
|
+
// WHY. Session start heals a stale main folder when it safely can; when it cannot, nobody
|
|
6
|
+
// would know — the owner's sat 1,000 changes behind for a week. This sends the facts to
|
|
7
|
+
// PATCH /me/checkout-freshness, and GET /me then tells the person and their agent.
|
|
8
|
+
// Spawned detached by .claude/hooks/session-start.js, so it never delays a session.
|
|
9
|
+
// Silent and fail-open: no session, offline, an older server — nothing happens.
|
|
10
|
+
//
|
|
11
|
+
// Usage: node scripts/bongos/report-checkout.js <behind> <branch> <reason>
|
|
12
|
+
|
|
13
|
+
'use strict';
|
|
14
|
+
|
|
15
|
+
const { apiCall, readSessionToken, cliExit } = require('./cli-lib');
|
|
16
|
+
|
|
17
|
+
async function main() {
|
|
18
|
+
const [behindRaw, branch, reason] = process.argv.slice(2);
|
|
19
|
+
const behind = Number.parseInt(behindRaw, 10);
|
|
20
|
+
if (!Number.isInteger(behind) || behind < 0 || !reason) return cliExit(0);
|
|
21
|
+
if (!readSessionToken()) return cliExit(0);
|
|
22
|
+
try {
|
|
23
|
+
await apiCall('PATCH', '/api/bongos/me/checkout-freshness',
|
|
24
|
+
{ behind, branch: branch && branch !== 'HEAD' ? branch : '', reason },
|
|
25
|
+
{ allowUnauthenticated: true });
|
|
26
|
+
} catch (_) { /* fail-open */ }
|
|
27
|
+
return cliExit(0);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (require.main === module) main();
|
|
@@ -266,6 +266,13 @@ const INTEGRATION = new Set([
|
|
|
266
266
|
// cannot be edited, deleted or truncated; unknown types and blank amounts are
|
|
267
267
|
// refused; the reads' SQL resolves a task's own set over the project's.
|
|
268
268
|
'pay_terms_db',
|
|
269
|
+
// task 1004991 (ADR 0385 pay-type gates): the gate table from the real migration —
|
|
270
|
+
// append-only, no eu_labour row, evidence required — and the verdict SQL.
|
|
271
|
+
'pay_type_gates_db',
|
|
272
|
+
// task 1004958: core_289's CHECK and the task-name backfill against real Postgres.
|
|
273
|
+
'task_name_db',
|
|
274
|
+
// task 1004958: the blocker read's lateral join that names held tasks, against real Postgres.
|
|
275
|
+
'blocker_tasks_named_db',
|
|
269
276
|
// task 1004988 (ADR 0385 D2): credit_log from the real migration — Postgres
|
|
270
277
|
// refuses a spend, redemption or transfer row; only a reversal of an existing
|
|
271
278
|
// row may be negative, and core_194's clawback still books.
|
|
@@ -274,6 +281,10 @@ const INTEGRATION = new Set([
|
|
|
274
281
|
// Postgres, the writer's ON CONFLICT turns it into a no-op, and a ledger already
|
|
275
282
|
// holding a duplicate still migrates (a warning, no index, nothing deleted).
|
|
276
283
|
'credit_log_idea_unique_db',
|
|
284
|
+
// task 1003182: the project-account record from the real migration — Postgres refuses a
|
|
285
|
+
// causeless or wrongly-directed movement, any UPDATE/DELETE/TRUNCATE, and a second row
|
|
286
|
+
// for one processor reference.
|
|
287
|
+
'project_account_db',
|
|
277
288
|
// task 1004408: migration platform_identity_028 deletes the old hub invite's
|
|
278
289
|
// pending rows before a cutoff it reads from the core_upgrades ledger. Only a real
|
|
279
290
|
// engine runs the DO block, the numeric version compare and the one-shot guard.
|