@bongos/core 1.20.59 → 1.20.61
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 +151 -91
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +10 -0
- package/clients/bongos-client/index.cjs +10 -0
- package/clients/bongos-client/index.d.ts +14 -1
- package/clients/bongos-client/index.mjs +10 -0
- package/docs/adr/0358-a-hall-wears-a-look-and-its-night-takes-a-tint.md +52 -0
- package/docs/adr/README.md +1 -0
- package/docs/api/openapi.json +324 -3
- package/docs/api-reference.md +8 -3
- package/docs/copy-inventory.md +343 -333
- package/docs/copy-registry.json +527 -433
- package/docs/module-api-changelog.md +4 -0
- package/docs/page-inventory.json +4 -1
- package/docs/page-readings.json +758 -707
- package/modules/autonomy/db.js +13 -6
- package/modules/autonomy/migrations/autonomy_004_runner_identity.sql +30 -0
- package/modules/autonomy/routes/autonomy.js +16 -0
- package/modules/autonomy/runner-health.js +66 -5
- 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/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/gate.js +24 -8
- 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/modules.html +1 -1
- 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.html +1 -1
- package/modules/hall-ui/public/shell.js +5 -1
- package/modules/hall-ui/public/studio.html +1 -1
- package/modules/hall-ui/public/style.css +8 -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/provisioning/look.js +169 -0
- package/modules/provisioning/migrations/provisioning_034_project_logo.sql +35 -0
- package/modules/provisioning/module.json +2 -1
- package/modules/provisioning/provisioning.js +4 -3
- package/modules/provisioning/routes/look.js +204 -0
- package/modules/provisioning/routes/provisioning.js +5 -59
- package/modules/provisioning/settings-push.js +76 -0
- package/modules/public-landing/public/assets/cosmos.css +1 -1
- package/modules/public-landing/public/projects.html +499 -28
- package/modules/public-landing/public/projects.probes.json +2 -2
- package/modules/public-landing/public/projects.states.json +6 -3
- package/modules/ui-design/kit/serve.js +50 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +12 -0
- package/scripts/gds/autobongos-run.js +43 -2
- package/scripts/gds/fitness.js +4 -0
- package/src/bongos/routes.js +4 -1
- package/src/bongos/serve-internal.js +6 -0
- package/src/branding.js +26 -1
- package/src/hall-look.js +99 -0
- package/src/module-api.js +1 -1
- package/src/night-tint.js +26 -0
- package/tests/autonomy_runner_identity.mjs +215 -0
- package/tests/currency_label.mjs +7 -4
- package/tests/hall_tokens.mjs +10 -1
- package/tests/hall_tweak_editor.mjs +1 -1
- package/tests/look_night_tint.mjs +169 -0
- package/tests/nav_permission_atoms.mjs +1 -1
- package/tests/projects_hub.mjs +5 -4
- package/tests/projects_hub_app_status.mjs +1 -1
- package/tests/projects_hub_app_step.mjs +8 -7
- package/tests/projects_hub_look.mjs +255 -0
- package/tests/projects_hub_module_picker.mjs +2 -2
- package/tests/provision_settings_apply.mjs +12 -4
- package/tests/provisioning_look.mjs +376 -0
- package/tests/provisioning_settings.mjs +10 -7
- package/tests/provisioning_settings_apply.mjs +4 -4
- package/tests/provisioning_settings_env.mjs +4 -0
- package/tests/wizard_draft_resume.mjs +2 -2
- package/tests/wizard_front_door.mjs +2 -2
- package/tests/wizard_intent_resume.mjs +16 -15
|
@@ -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
|
-
-
|
|
8
|
+
- 483 operations across 73 resource groups
|
|
9
9
|
|
|
10
10
|
## Use it from your project
|
|
11
11
|
|
|
@@ -855,6 +855,14 @@ function createClient(opts = {}) {
|
|
|
855
855
|
postProvisioningInstancesIdGithubApp: (args) => request("POST", "/provisioning/instances/{id}/github-app", { hasBody: true }, args),
|
|
856
856
|
// GET /provisioning/instances/{id}/invite-suggestions — rank: any-builder — GET /provisioning/instances/:id/invite-suggestions
|
|
857
857
|
getProvisioningInstancesIdInviteSuggestions: (args) => request("GET", "/provisioning/instances/{id}/invite-suggestions", { hasBody: false }, args),
|
|
858
|
+
// DELETE /provisioning/instances/{id}/logo — rank: any-builder — DELETE /provisioning/instances/:id/logo
|
|
859
|
+
deleteProvisioningInstancesIdLogo: (args) => request("DELETE", "/provisioning/instances/{id}/logo", { hasBody: true }, args),
|
|
860
|
+
// PUT /provisioning/instances/{id}/logo — rank: any-builder — PUT /provisioning/instances/:id/logo
|
|
861
|
+
putProvisioningInstancesIdLogo: (args) => request("PUT", "/provisioning/instances/{id}/logo", { hasBody: true }, args),
|
|
862
|
+
// GET /provisioning/instances/{id}/look — rank: any-builder — GET /provisioning/instances/:id/look
|
|
863
|
+
getProvisioningInstancesIdLook: (args) => request("GET", "/provisioning/instances/{id}/look", { hasBody: false }, args),
|
|
864
|
+
// PATCH /provisioning/instances/{id}/look — rank: any-builder — PATCH /provisioning/instances/:id/look
|
|
865
|
+
patchProvisioningInstancesIdLook: (args) => request("PATCH", "/provisioning/instances/{id}/look", { hasBody: true }, args),
|
|
858
866
|
// GET /provisioning/instances/{id}/render — rank: any-builder — GET /provisioning/instances/:id/render
|
|
859
867
|
getProvisioningInstancesIdRender: (args) => request("GET", "/provisioning/instances/{id}/render", { hasBody: false }, args),
|
|
860
868
|
// POST /provisioning/instances/{id}/render — rank: any-builder — POST /provisioning/instances/:id/render
|
|
@@ -871,6 +879,8 @@ function createClient(opts = {}) {
|
|
|
871
879
|
postProvisioningInstancesIdTeardown: (args) => request("POST", "/provisioning/instances/{id}/teardown", { hasBody: true }, args),
|
|
872
880
|
// POST /provisioning/instances/{id}/update-channel — rank: archon — POST /provisioning/instances/:id/update-channel
|
|
873
881
|
postProvisioningInstancesIdUpdateChannel: (args) => request("POST", "/provisioning/instances/{id}/update-channel", { hasBody: true }, args),
|
|
882
|
+
// GET /provisioning/logos/{file} — rank: public — GET /provisioning/logos/:file
|
|
883
|
+
getProvisioningLogosFile: (args) => request("GET", "/provisioning/logos/{file}", { hasBody: false }, args),
|
|
874
884
|
// GET /provisioning/onboard-plan — rank: public — GET /provisioning/onboard-plan
|
|
875
885
|
getProvisioningOnboardPlan: (args) => request("GET", "/provisioning/onboard-plan", { hasBody: false }, args),
|
|
876
886
|
// GET /provisioning/recommendations — rank: public — GET /provisioning/recommendations
|
|
@@ -854,6 +854,14 @@ function createClient(opts = {}) {
|
|
|
854
854
|
postProvisioningInstancesIdGithubApp: (args) => request("POST", "/provisioning/instances/{id}/github-app", { hasBody: true }, args),
|
|
855
855
|
// GET /provisioning/instances/{id}/invite-suggestions — rank: any-builder — GET /provisioning/instances/:id/invite-suggestions
|
|
856
856
|
getProvisioningInstancesIdInviteSuggestions: (args) => request("GET", "/provisioning/instances/{id}/invite-suggestions", { hasBody: false }, args),
|
|
857
|
+
// DELETE /provisioning/instances/{id}/logo — rank: any-builder — DELETE /provisioning/instances/:id/logo
|
|
858
|
+
deleteProvisioningInstancesIdLogo: (args) => request("DELETE", "/provisioning/instances/{id}/logo", { hasBody: true }, args),
|
|
859
|
+
// PUT /provisioning/instances/{id}/logo — rank: any-builder — PUT /provisioning/instances/:id/logo
|
|
860
|
+
putProvisioningInstancesIdLogo: (args) => request("PUT", "/provisioning/instances/{id}/logo", { hasBody: true }, args),
|
|
861
|
+
// GET /provisioning/instances/{id}/look — rank: any-builder — GET /provisioning/instances/:id/look
|
|
862
|
+
getProvisioningInstancesIdLook: (args) => request("GET", "/provisioning/instances/{id}/look", { hasBody: false }, args),
|
|
863
|
+
// PATCH /provisioning/instances/{id}/look — rank: any-builder — PATCH /provisioning/instances/:id/look
|
|
864
|
+
patchProvisioningInstancesIdLook: (args) => request("PATCH", "/provisioning/instances/{id}/look", { hasBody: true }, args),
|
|
857
865
|
// GET /provisioning/instances/{id}/render — rank: any-builder — GET /provisioning/instances/:id/render
|
|
858
866
|
getProvisioningInstancesIdRender: (args) => request("GET", "/provisioning/instances/{id}/render", { hasBody: false }, args),
|
|
859
867
|
// POST /provisioning/instances/{id}/render — rank: any-builder — POST /provisioning/instances/:id/render
|
|
@@ -870,6 +878,8 @@ function createClient(opts = {}) {
|
|
|
870
878
|
postProvisioningInstancesIdTeardown: (args) => request("POST", "/provisioning/instances/{id}/teardown", { hasBody: true }, args),
|
|
871
879
|
// POST /provisioning/instances/{id}/update-channel — rank: archon — POST /provisioning/instances/:id/update-channel
|
|
872
880
|
postProvisioningInstancesIdUpdateChannel: (args) => request("POST", "/provisioning/instances/{id}/update-channel", { hasBody: true }, args),
|
|
881
|
+
// GET /provisioning/logos/{file} — rank: public — GET /provisioning/logos/:file
|
|
882
|
+
getProvisioningLogosFile: (args) => request("GET", "/provisioning/logos/{file}", { hasBody: false }, args),
|
|
873
883
|
// GET /provisioning/onboard-plan — rank: public — GET /provisioning/onboard-plan
|
|
874
884
|
getProvisioningOnboardPlan: (args) => request("GET", "/provisioning/onboard-plan", { hasBody: false }, args),
|
|
875
885
|
// GET /provisioning/recommendations — rank: public — GET /provisioning/recommendations
|
|
@@ -124,6 +124,7 @@ export interface GetProvisioningGithubAppStatusResponse { ok: boolean; status: u
|
|
|
124
124
|
export interface GetProvisioningHealthResponse { module: unknown; ok: boolean; coreVersion: unknown }
|
|
125
125
|
export interface GetProvisioningInstancesIdEnvManifestResponse { instance: unknown; env_vars: unknown; environments: unknown; values_held: boolean; note: unknown }
|
|
126
126
|
export interface GetProvisioningInstancesIdInviteSuggestionsResponse { suggested: unknown; seeking: unknown; reason: unknown; unavailable?: unknown }
|
|
127
|
+
export interface GetProvisioningInstancesIdLookResponse { ok: boolean; look: unknown; options: unknown; logo_max_bytes: unknown }
|
|
127
128
|
export interface GetProvisioningInstancesIdRenderResponse { ok: boolean; app: unknown; env_vars: unknown; values_held: boolean }
|
|
128
129
|
export interface GetProvisioningInstancesIdResponse { instance: unknown; open_intent: unknown; github_app: unknown }
|
|
129
130
|
export interface GetProvisioningInstancesIdSettingsResponse { ok: boolean; settings: unknown; planet: unknown; options: unknown }
|
|
@@ -224,6 +225,7 @@ export interface PatchProvisioningInstancesIdDetailRequest { description?: strin
|
|
|
224
225
|
export interface PatchProvisioningInstancesIdDetailResponse { ok: boolean; description: unknown; detail: unknown; options: unknown; soft_limits: unknown; publish: unknown; modules: unknown; type: unknown }
|
|
225
226
|
export interface PatchProvisioningInstancesIdEnvManifestVarIdRequest { name?: string; description?: string; environments?: unknown[]; required?: boolean }
|
|
226
227
|
export interface PatchProvisioningInstancesIdEnvManifestVarIdResponse { ok: boolean; env_var: unknown; values_held: boolean }
|
|
228
|
+
export interface PatchProvisioningInstancesIdLookRequest { look?: string; night_tint?: string; accent?: string }
|
|
227
229
|
export interface PatchProvisioningInstancesIdSettingsResponse { ok: boolean; saved: unknown; planet: unknown; push: unknown }
|
|
228
230
|
export interface PatchSpecialitiesIdRequest { name?: string; summary?: string; contract_md?: string; visibility?: string; sellable?: boolean; skills?: string[] }
|
|
229
231
|
export interface PatchSpecialitiesIdResponse { speciality: unknown }
|
|
@@ -255,7 +257,7 @@ export interface PostAutonomyFenceGoalsRequest { goal_id: StringifiableId; note?
|
|
|
255
257
|
export interface PostAutonomyFenceGoalsResponse { goal: unknown }
|
|
256
258
|
export interface PostAutonomyFencePriorityRequest { goal_id?: StringifiableId }
|
|
257
259
|
export interface PostAutonomyFenceRequest { enabled: boolean; reason?: string }
|
|
258
|
-
export interface PostAutonomyHeartbeatRequest { host: string; pid?: number; started_at?: string; mode?: string; consecutive_failures?: number; last_event?: string; working_task_id?: number; working_goal_id?: number }
|
|
260
|
+
export interface PostAutonomyHeartbeatRequest { host: string; pid?: number; started_at?: string; mode?: string; consecutive_failures?: number; last_event?: string; working_task_id?: number; working_goal_id?: number; head?: string; disk_head?: string; main_head?: string; claude_account?: string }
|
|
259
261
|
export interface PostAutonomyHeartbeatResponse { ok: boolean; heartbeat: unknown }
|
|
260
262
|
export interface PostBackupTriggerResponse { ok: boolean; message: unknown; started_at: unknown }
|
|
261
263
|
export interface PostBlockersIdLinkRequest { task_id: StringifiableId }
|
|
@@ -503,6 +505,7 @@ export interface PutGovernmentRanksRankKeyPermissionsPermissionKeyResponse { ok:
|
|
|
503
505
|
export interface PutMingleOptInRequest { opted_in: boolean }
|
|
504
506
|
export interface PutMingleOptInResponse { opted_in: unknown; updated_at: unknown }
|
|
505
507
|
export interface PutMingleProjectRequest { enabled: boolean }
|
|
508
|
+
export interface PutProvisioningInstancesIdLogoRequest { image_b64: string; content_type: string }
|
|
506
509
|
export interface PutRenderDeployAppRequest { ownerId?: string; serviceId?: string }
|
|
507
510
|
export interface PutRenderDeployAppResponse { app: unknown }
|
|
508
511
|
export interface PutSpecialitiesIdSkillsRequest { enabled_skills: string[] }
|
|
@@ -1294,6 +1297,14 @@ export interface BongosClient {
|
|
|
1294
1297
|
postProvisioningInstancesIdGithubApp(args?: RequestArgs & { body?: PostProvisioningInstancesIdGithubAppRequest }): Promise<PostProvisioningInstancesIdGithubAppResponse>;
|
|
1295
1298
|
/** GET /provisioning/instances/{id}/invite-suggestions — rank: any-builder */
|
|
1296
1299
|
getProvisioningInstancesIdInviteSuggestions(args?: RequestArgs): Promise<GetProvisioningInstancesIdInviteSuggestionsResponse>;
|
|
1300
|
+
/** DELETE /provisioning/instances/{id}/logo — rank: any-builder */
|
|
1301
|
+
deleteProvisioningInstancesIdLogo(args?: RequestArgs): Promise<ApiResponse>;
|
|
1302
|
+
/** PUT /provisioning/instances/{id}/logo — rank: any-builder */
|
|
1303
|
+
putProvisioningInstancesIdLogo(args: RequestArgs & { body: PutProvisioningInstancesIdLogoRequest }): Promise<ApiResponse>;
|
|
1304
|
+
/** GET /provisioning/instances/{id}/look — rank: any-builder */
|
|
1305
|
+
getProvisioningInstancesIdLook(args?: RequestArgs): Promise<GetProvisioningInstancesIdLookResponse>;
|
|
1306
|
+
/** PATCH /provisioning/instances/{id}/look — rank: any-builder */
|
|
1307
|
+
patchProvisioningInstancesIdLook(args?: RequestArgs & { body?: PatchProvisioningInstancesIdLookRequest }): Promise<ApiResponse>;
|
|
1297
1308
|
/** GET /provisioning/instances/{id}/render — rank: any-builder */
|
|
1298
1309
|
getProvisioningInstancesIdRender(args?: RequestArgs): Promise<GetProvisioningInstancesIdRenderResponse>;
|
|
1299
1310
|
/** POST /provisioning/instances/{id}/render — rank: any-builder */
|
|
@@ -1310,6 +1321,8 @@ export interface BongosClient {
|
|
|
1310
1321
|
postProvisioningInstancesIdTeardown(args?: RequestArgs): Promise<PostProvisioningInstancesIdTeardownResponse>;
|
|
1311
1322
|
/** POST /provisioning/instances/{id}/update-channel — rank: archon */
|
|
1312
1323
|
postProvisioningInstancesIdUpdateChannel(args?: RequestArgs): Promise<ApiResponse>;
|
|
1324
|
+
/** GET /provisioning/logos/{file} — rank: public */
|
|
1325
|
+
getProvisioningLogosFile(args?: RequestArgs): Promise<ApiResponse>;
|
|
1313
1326
|
/** GET /provisioning/onboard-plan — rank: public */
|
|
1314
1327
|
getProvisioningOnboardPlan(args?: RequestArgs): Promise<GetProvisioningOnboardPlanResponse>;
|
|
1315
1328
|
/** GET /provisioning/recommendations — rank: public */
|
|
@@ -851,6 +851,14 @@ export function createClient(opts = {}) {
|
|
|
851
851
|
postProvisioningInstancesIdGithubApp: (args) => request("POST", "/provisioning/instances/{id}/github-app", { hasBody: true }, args),
|
|
852
852
|
// GET /provisioning/instances/{id}/invite-suggestions — rank: any-builder — GET /provisioning/instances/:id/invite-suggestions
|
|
853
853
|
getProvisioningInstancesIdInviteSuggestions: (args) => request("GET", "/provisioning/instances/{id}/invite-suggestions", { hasBody: false }, args),
|
|
854
|
+
// DELETE /provisioning/instances/{id}/logo — rank: any-builder — DELETE /provisioning/instances/:id/logo
|
|
855
|
+
deleteProvisioningInstancesIdLogo: (args) => request("DELETE", "/provisioning/instances/{id}/logo", { hasBody: true }, args),
|
|
856
|
+
// PUT /provisioning/instances/{id}/logo — rank: any-builder — PUT /provisioning/instances/:id/logo
|
|
857
|
+
putProvisioningInstancesIdLogo: (args) => request("PUT", "/provisioning/instances/{id}/logo", { hasBody: true }, args),
|
|
858
|
+
// GET /provisioning/instances/{id}/look — rank: any-builder — GET /provisioning/instances/:id/look
|
|
859
|
+
getProvisioningInstancesIdLook: (args) => request("GET", "/provisioning/instances/{id}/look", { hasBody: false }, args),
|
|
860
|
+
// PATCH /provisioning/instances/{id}/look — rank: any-builder — PATCH /provisioning/instances/:id/look
|
|
861
|
+
patchProvisioningInstancesIdLook: (args) => request("PATCH", "/provisioning/instances/{id}/look", { hasBody: true }, args),
|
|
854
862
|
// GET /provisioning/instances/{id}/render — rank: any-builder — GET /provisioning/instances/:id/render
|
|
855
863
|
getProvisioningInstancesIdRender: (args) => request("GET", "/provisioning/instances/{id}/render", { hasBody: false }, args),
|
|
856
864
|
// POST /provisioning/instances/{id}/render — rank: any-builder — POST /provisioning/instances/:id/render
|
|
@@ -867,6 +875,8 @@ export function createClient(opts = {}) {
|
|
|
867
875
|
postProvisioningInstancesIdTeardown: (args) => request("POST", "/provisioning/instances/{id}/teardown", { hasBody: true }, args),
|
|
868
876
|
// POST /provisioning/instances/{id}/update-channel — rank: archon — POST /provisioning/instances/:id/update-channel
|
|
869
877
|
postProvisioningInstancesIdUpdateChannel: (args) => request("POST", "/provisioning/instances/{id}/update-channel", { hasBody: true }, args),
|
|
878
|
+
// GET /provisioning/logos/{file} — rank: public — GET /provisioning/logos/:file
|
|
879
|
+
getProvisioningLogosFile: (args) => request("GET", "/provisioning/logos/{file}", { hasBody: false }, args),
|
|
870
880
|
// GET /provisioning/onboard-plan — rank: public — GET /provisioning/onboard-plan
|
|
871
881
|
getProvisioningOnboardPlan: (args) => request("GET", "/provisioning/onboard-plan", { hasBody: false }, args),
|
|
872
882
|
// GET /provisioning/recommendations — rank: public — GET /provisioning/recommendations
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# ADR 0358 — A hall wears a look, and its night takes a tint of it
|
|
2
|
+
|
|
3
|
+
- **Status:** accepted
|
|
4
|
+
- **Date:** 2026-09-30
|
|
5
|
+
- **Task:** [task 1004421](https://cloudbongos.com/builders#/task/1004421) (BV2.PS06, goal 1000121 — project startup; spec `docs/specs/<redacted>.md` D2 and D8)
|
|
6
|
+
- **Amends:** [ADR 0219](0219-a-look-is-a-branding-pack-the-style-library.md) Context §2 and the rejected "dark tier" alternative (a look could not carry a dark ground), and `DESIGN.md`'s "Pure black in dark" rule, for halls only
|
|
7
|
+
- **Keeps:** [ADR 0204](0204-the-apex-is-dark-only.md) (the platform's own apex is dark-only, pure black), [ADR 0062 §3](0062-medusa-instance-model-decoupling.md) (the branding contract; still thirteen colours and two faces)
|
|
8
|
+
- **Decided with:** the owner, 2026-09-30 — D2 in the planning session (the tint is allowed and on by default), and "a custom look is one accent used in both modes" the same day.
|
|
9
|
+
|
|
10
|
+
## Context
|
|
11
|
+
|
|
12
|
+
The project-startup flow lets a founder give a new project a look, so that a builder who works in several projects always knows which hall they are in. ADR 0219 already made a look a branding pack: thirteen colours and two font stacks, laid over the instance's pack. But it left two things out:
|
|
13
|
+
|
|
14
|
+
1. **Nothing let the platform set a hall's look.** A look was a file an instance owner copied into `config/branding.json` by hand.
|
|
15
|
+
2. **Every look's night was the same pure black.** The pack is one-mode, so in dark mode only the accent told one hall from another.
|
|
16
|
+
|
|
17
|
+
The second is a world rule (`DESIGN.md`: "Pure black in dark"). It exists because the chrome sculpture's rendered plates composite into `#000000` with `lighten` and leave no seam. The owner decided (D2) that a hall may give that up: each look gets a subtle tinted night, on by default, and the founder can switch it off.
|
|
18
|
+
|
|
19
|
+
## Decision
|
|
20
|
+
|
|
21
|
+
**D1. The night tint is derived, never authored.** When a hall wears a look with the tint on, its four dark grounds take a small share of the look's own accent:
|
|
22
|
+
|
|
23
|
+
| token | tinted night |
|
|
24
|
+
|---|---|
|
|
25
|
+
| `--bg`, `--bg-deep` | `color-mix(in srgb, var(--accent) 6%, #000000)` |
|
|
26
|
+
| `--bg-frame` | `color-mix(in srgb, var(--accent) 6%, #08080a)` |
|
|
27
|
+
| `--bg-card` | `color-mix(in srgb, var(--accent) 5%, #101012)` |
|
|
28
|
+
|
|
29
|
+
The card's share is the smaller because the hall's info chip (`--info` on `--info-weak`, both mixed from the card) was the thinnest pair under a tint, and at 8% it fell to 4.37:1; 5% clears every look. No look carries a dark palette and no token is added: the tint is a formula over the thirteen, so the contract stays at fifteen and a custom accent gets its own night for free. The table lives once, in `src/night-tint.js`; `themeMarkup()` emits it after the hall's sheet as the two dark twins the sheet already writes (`html[data-theme="dark"]` and the `prefers-color-scheme` block), at equal specificity, so it wins on order. The inks, the status vocabulary and every derived recipe stay the sheet's.
|
|
30
|
+
|
|
31
|
+
**D2. The tint is on by default, and only a look turns it on.** A hall that has never chosen a look renders exactly as it does today, pure black included, whatever the tint setting says. The founder's switch puts a looked hall back on pure black.
|
|
32
|
+
|
|
33
|
+
**D3. The apex and the hub stay pure black.** This decision is about a project's hall. The platform's own surfaces (ADR 0204) keep the world rule, and `DESIGN.md` says so where it states the rule.
|
|
34
|
+
|
|
35
|
+
**D4. A custom look is one accent, used in both modes, nudged until it reads.** The founder picks one colour. It is laid over the chrome world's palette as `accent`. If it fails any of the pairs the hall paints with it (dark ink on an accent fill; the accent as text on the black and tinted grounds; the light mode's derived accent ink on paper), its lightness moves, the hue staying put, to the nearest value that passes. The preview shows the adjusted colour. There is no separate dark accent and no sixteenth token. The nudge is one algorithm, `lookAdjustAccent`, in `modules/provisioning/look.js`; the create wizard carries a copy that a test pins to it.
|
|
36
|
+
|
|
37
|
+
**D5. The look travels the settings road.** `look` (the four library looks, `custom`, or `own` = the instance's own pack) and `night_tint` (`on` | `off`) join the provisioning settings vocabulary, so they reach a running hall the way every other policy does: written to `web.env`, applied by a restart (the pack is memoised). The adjusted accent and the logo's address ride as companion variables. `src/branding.js` resolves the look from the style library on the instance itself, so the platform never sends a palette, only a name.
|
|
38
|
+
|
|
39
|
+
**D6. A logo is an image the platform keeps.** PNG, JPEG or WebP only, at most 256 KB, checked by its magic bytes, never SVG (an SVG is a document that can carry script). The platform stores it and serves it at a content-addressed public address; the hall shows it in its mark and the browser tab uses it as the favicon. Without a logo, a looked hall's favicon is drawn in the look's own colours.
|
|
40
|
+
|
|
41
|
+
## Consequences
|
|
42
|
+
|
|
43
|
+
- A founder picks a look, a night and a logo at creation, and an existing project's owner picks the same three on its manage page (D8). Both save through the platform; the hall restarts once to wear it.
|
|
44
|
+
- Contrast is measured, not hoped for: `tests/look_night_tint.mjs` runs the hall's own token suite under every look with the tint on, and under custom accents across the hue wheel.
|
|
45
|
+
- A hall with a tinted night loses the seamless `lighten` composite for any rendered plate. The hall ships no plate today (`--plate: none`), so nothing shows a seam; a hall that adds one later must switch the tint off or re-shoot it.
|
|
46
|
+
|
|
47
|
+
## Alternatives considered
|
|
48
|
+
|
|
49
|
+
- **Each look authors its own dark palette** (the mocks' approach). Rejected: a dark tier in the pack is the contract change ADR 0219 refused, for every sheet and drift test, and a custom accent would have no night.
|
|
50
|
+
- **Two custom accents, light and dark** (the canvas). Superseded by the owner: one accent the platform makes readable is less to get wrong.
|
|
51
|
+
- **Refuse an unreadable custom accent.** Rejected by the task: adjust, do not refuse.
|
|
52
|
+
- **Send the full palette from the platform.** Rejected: thirteen colours and two quoted font stacks in an env file is fragile to quote, and the instance already ships the library.
|
package/docs/adr/README.md
CHANGED
|
@@ -476,3 +476,4 @@ These 20 numbers are each shared by exactly two files. They are **accepted histo
|
|
|
476
476
|
| 0355 | [**A soft limit is a rule with a reason, and nobody enforces it** ([task 1004416](https://cloudbongos.com/builders#/task/1004416), goal 1000121 — BV2.PS02). The startup flow's seven planet-physics answers and what they rule out. **D1:** the answers are more provisioning `detail` keys under `team_shape`'s contract (no defaults, refused loudly, `null` un-answers), with two new kinds — a list (`many`) and a whole number (`count`); the country is a closed ISO list. **D2:** answers must agree only within one request, so a merge patch's edit order never matters. **D3:** one declarative soft-limit table (`soft-limits.js`) — data conditions, `hide`/`grey`/`note`, a reason on every rule — and every resolution says `enforced: false`. **D4:** screening is a seam (`screening.js`) with a deliberately small rule set; a stop is 422 `screened_out` before anything exists. **D5:** the edit route screens a new description too.](0355-a-soft-limit-is-a-rule-with-a-reason-and-nobody-enforces-it.md) | provisioning / project startup |
|
|
477
477
|
| 0356 | [**A recruit invite expires 30 days after it is sent, decided at read time** ([task 1002969](https://cloudbongos.com/builders#/task/1002969), goal 1000110 — privacy spec D4, owner-signed). **D1:** one definition, `src/bongos/invite-expiry.js` (`INVITE_EXPIRY_DAYS` + the SQL), read by the sign-in gate, the waiting-page probe, the onboarding routes and, through the doorway's `inviteExpiry`, the hub. Nothing is stored and nothing sweeps. **D2:** only `kind='invite'` rows expire; approved applications and goal invites do not. **D3:** amends ADR 0335 D2.5: the gate reads `kind` only inside the expiry unit, which can close a door and never open one. **D4:** an expired invite is refused, marked `expired` + `expires_at` in the queues, reported `expired` by the status probe (the CLI stops), and replaced by a re-invite's fresh row. **D5:** the hub hides a `pending` notice past 30 days and a re-invite restamps it. Split out: `seen_at` (task 1004443), the decline relay (task 1004444).](0356-a-recruit-invite-expires-30-days-after-it-is-sent-read-time.md) | platform identity / admission / invites |
|
|
478
478
|
| 0357 | [**The update rule set on /deploy is the one the sweep follows** ([task 1004468](https://cloudbongos.com/builders#/task/1004468), goal 1000090 — BONGOS-V2, owner's ruling 2026-09-30). Amends [ADR 0136](0136-update-channel-subscription-policy.md)'s rejected DB-column alternative. **D1:** for a roster entry whose slug matches a `provisioning_instances` row, the unattended sweep uses that row's `update_channel` (set on /deploy, task 1004445). **D2:** the roster's `channel` is only the fallback — no matching row, or the database unreadable; enrollment and topology stay in the roster. **D3:** the sweep logs each entry's channel and its source, naming an overridden roster value. **D4:** read over psql from the sweep's own `DATABASE_URL`/`PGDATABASE`, never an entry's `env`. **D5:** nothing is copied; a row never changed is `patch`. Delivery to cloudbongos.com waits on the frozen sweep checkout (task 1004307). Rejected: roster stays in charge; stricter-of-the-two; copying roster values into rows.](0357-the-update-rule-set-on-deploy-is-the-one-the-sweep-follows.md) | distribution / updates |
|
|
479
|
+
| 0358 | [**A hall wears a look, and its night takes a tint of it** ([task 1004421](https://cloudbongos.com/builders#/task/1004421), goal 1000121 — BV2.PS06; owner D2 + D8, 2026-09-30). Amends [ADR 0219](0219-a-look-is-a-branding-pack-the-style-library.md) (a look could not carry a dark ground) and DESIGN.md's pure-black rule, for halls only. **D1:** the night tint is a formula over the thirteen — the four dark grounds take 5–6% of the look's accent (src/night-tint.js), emitted after the sheet as both dark twins; no token added. **D2:** on by default, and only a chosen look turns it on — a hall with no look is unchanged. **D3:** the apex and hub stay pure black (ADR 0204). **D4:** a custom look is ONE accent for both modes, its lightness nudged until every pair the hall paints with it reads (lookAdjustAccent, client copy test-pinned). **D5:** look + night_tint join the provisioning settings vocabulary; the accent and logo address ride as companion env; the instance resolves the look from the style library. **D6:** a logo is PNG/JPEG/WebP ≤256 KB, magic-sniffed, never SVG, served content-addressed; it is the hall mark and the favicon. Rejected: per-look dark palettes, two custom accents, refusing an unreadable accent, sending the palette over env.](0358-a-hall-wears-a-look-and-its-night-takes-a-tint.md) | hall / branding / design world |
|
package/docs/api/openapi.json
CHANGED
|
@@ -15681,6 +15681,223 @@
|
|
|
15681
15681
|
]
|
|
15682
15682
|
}
|
|
15683
15683
|
},
|
|
15684
|
+
"/provisioning/instances/{id}/logo": {
|
|
15685
|
+
"put": {
|
|
15686
|
+
"operationId": "put_provisioning_instances_id_logo",
|
|
15687
|
+
"tags": [
|
|
15688
|
+
"provisioning"
|
|
15689
|
+
],
|
|
15690
|
+
"summary": "PUT /provisioning/instances/:id/logo",
|
|
15691
|
+
"description": "PUT …/logo — rank: any authenticated builder (own resource; archon may change any). The image is screened by its bytes, stored, and the hall told its new address.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
15692
|
+
"x-rank": "any-builder",
|
|
15693
|
+
"x-source": "modules/provisioning/routes/look.js",
|
|
15694
|
+
"parameters": [
|
|
15695
|
+
{
|
|
15696
|
+
"name": "id",
|
|
15697
|
+
"in": "path",
|
|
15698
|
+
"required": true,
|
|
15699
|
+
"schema": {
|
|
15700
|
+
"type": "string"
|
|
15701
|
+
},
|
|
15702
|
+
"description": "Path parameter `id`."
|
|
15703
|
+
}
|
|
15704
|
+
],
|
|
15705
|
+
"requestBody": {
|
|
15706
|
+
"required": true,
|
|
15707
|
+
"content": {
|
|
15708
|
+
"application/json": {
|
|
15709
|
+
"schema": {
|
|
15710
|
+
"$ref": "#/components/schemas/PutProvisioningInstancesIdLogoRequest"
|
|
15711
|
+
}
|
|
15712
|
+
}
|
|
15713
|
+
},
|
|
15714
|
+
"x-validated": true
|
|
15715
|
+
},
|
|
15716
|
+
"responses": {
|
|
15717
|
+
"200": {
|
|
15718
|
+
"description": "Success."
|
|
15719
|
+
},
|
|
15720
|
+
"400": {
|
|
15721
|
+
"$ref": "#/components/responses/ValidationFailed"
|
|
15722
|
+
},
|
|
15723
|
+
"401": {
|
|
15724
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
15725
|
+
},
|
|
15726
|
+
"403": {
|
|
15727
|
+
"$ref": "#/components/responses/Forbidden"
|
|
15728
|
+
},
|
|
15729
|
+
"404": {
|
|
15730
|
+
"$ref": "#/components/responses/NotFound"
|
|
15731
|
+
}
|
|
15732
|
+
},
|
|
15733
|
+
"security": [
|
|
15734
|
+
{
|
|
15735
|
+
"builderSession": []
|
|
15736
|
+
}
|
|
15737
|
+
]
|
|
15738
|
+
},
|
|
15739
|
+
"delete": {
|
|
15740
|
+
"operationId": "delete_provisioning_instances_id_logo",
|
|
15741
|
+
"tags": [
|
|
15742
|
+
"provisioning"
|
|
15743
|
+
],
|
|
15744
|
+
"summary": "DELETE /provisioning/instances/:id/logo",
|
|
15745
|
+
"description": "DELETE …/logo — rank: any authenticated builder (own resource; archon may change any).\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
15746
|
+
"x-rank": "any-builder",
|
|
15747
|
+
"x-source": "modules/provisioning/routes/look.js",
|
|
15748
|
+
"parameters": [
|
|
15749
|
+
{
|
|
15750
|
+
"name": "id",
|
|
15751
|
+
"in": "path",
|
|
15752
|
+
"required": true,
|
|
15753
|
+
"schema": {
|
|
15754
|
+
"type": "string"
|
|
15755
|
+
},
|
|
15756
|
+
"description": "Path parameter `id`."
|
|
15757
|
+
}
|
|
15758
|
+
],
|
|
15759
|
+
"requestBody": {
|
|
15760
|
+
"required": false,
|
|
15761
|
+
"content": {
|
|
15762
|
+
"application/json": {
|
|
15763
|
+
"schema": {
|
|
15764
|
+
"type": "object",
|
|
15765
|
+
"additionalProperties": true
|
|
15766
|
+
}
|
|
15767
|
+
}
|
|
15768
|
+
},
|
|
15769
|
+
"x-validated": true
|
|
15770
|
+
},
|
|
15771
|
+
"responses": {
|
|
15772
|
+
"200": {
|
|
15773
|
+
"description": "Success."
|
|
15774
|
+
},
|
|
15775
|
+
"400": {
|
|
15776
|
+
"$ref": "#/components/responses/ValidationFailed"
|
|
15777
|
+
},
|
|
15778
|
+
"401": {
|
|
15779
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
15780
|
+
},
|
|
15781
|
+
"403": {
|
|
15782
|
+
"$ref": "#/components/responses/Forbidden"
|
|
15783
|
+
},
|
|
15784
|
+
"404": {
|
|
15785
|
+
"$ref": "#/components/responses/NotFound"
|
|
15786
|
+
}
|
|
15787
|
+
},
|
|
15788
|
+
"security": [
|
|
15789
|
+
{
|
|
15790
|
+
"builderSession": []
|
|
15791
|
+
}
|
|
15792
|
+
]
|
|
15793
|
+
}
|
|
15794
|
+
},
|
|
15795
|
+
"/provisioning/instances/{id}/look": {
|
|
15796
|
+
"get": {
|
|
15797
|
+
"operationId": "get_provisioning_instances_id_look",
|
|
15798
|
+
"tags": [
|
|
15799
|
+
"provisioning"
|
|
15800
|
+
],
|
|
15801
|
+
"summary": "GET /provisioning/instances/:id/look",
|
|
15802
|
+
"description": "GET — rank: any authenticated builder (own resource; archon may read any).\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
15803
|
+
"x-rank": "any-builder",
|
|
15804
|
+
"x-source": "modules/provisioning/routes/look.js",
|
|
15805
|
+
"parameters": [
|
|
15806
|
+
{
|
|
15807
|
+
"name": "id",
|
|
15808
|
+
"in": "path",
|
|
15809
|
+
"required": true,
|
|
15810
|
+
"schema": {
|
|
15811
|
+
"type": "string"
|
|
15812
|
+
},
|
|
15813
|
+
"description": "Path parameter `id`."
|
|
15814
|
+
}
|
|
15815
|
+
],
|
|
15816
|
+
"responses": {
|
|
15817
|
+
"200": {
|
|
15818
|
+
"description": "Success.",
|
|
15819
|
+
"content": {
|
|
15820
|
+
"application/json": {
|
|
15821
|
+
"schema": {
|
|
15822
|
+
"$ref": "#/components/schemas/GetProvisioningInstancesIdLookResponse"
|
|
15823
|
+
}
|
|
15824
|
+
}
|
|
15825
|
+
}
|
|
15826
|
+
},
|
|
15827
|
+
"400": {
|
|
15828
|
+
"$ref": "#/components/responses/BadRequest"
|
|
15829
|
+
},
|
|
15830
|
+
"401": {
|
|
15831
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
15832
|
+
},
|
|
15833
|
+
"403": {
|
|
15834
|
+
"$ref": "#/components/responses/Forbidden"
|
|
15835
|
+
},
|
|
15836
|
+
"404": {
|
|
15837
|
+
"$ref": "#/components/responses/NotFound"
|
|
15838
|
+
}
|
|
15839
|
+
},
|
|
15840
|
+
"security": [
|
|
15841
|
+
{
|
|
15842
|
+
"builderSession": []
|
|
15843
|
+
}
|
|
15844
|
+
]
|
|
15845
|
+
},
|
|
15846
|
+
"patch": {
|
|
15847
|
+
"operationId": "patch_provisioning_instances_id_look",
|
|
15848
|
+
"tags": [
|
|
15849
|
+
"provisioning"
|
|
15850
|
+
],
|
|
15851
|
+
"summary": "PATCH /provisioning/instances/:id/look",
|
|
15852
|
+
"description": "PATCH — rank: any authenticated builder (own resource; archon may change any). A custom look needs an accent, sent now or already stored; the stored one is the ADJUSTED colour, and `adjusted` in the reply says when it differs from what came in.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
15853
|
+
"x-rank": "any-builder",
|
|
15854
|
+
"x-source": "modules/provisioning/routes/look.js",
|
|
15855
|
+
"parameters": [
|
|
15856
|
+
{
|
|
15857
|
+
"name": "id",
|
|
15858
|
+
"in": "path",
|
|
15859
|
+
"required": true,
|
|
15860
|
+
"schema": {
|
|
15861
|
+
"type": "string"
|
|
15862
|
+
},
|
|
15863
|
+
"description": "Path parameter `id`."
|
|
15864
|
+
}
|
|
15865
|
+
],
|
|
15866
|
+
"requestBody": {
|
|
15867
|
+
"required": false,
|
|
15868
|
+
"content": {
|
|
15869
|
+
"application/json": {
|
|
15870
|
+
"schema": {
|
|
15871
|
+
"$ref": "#/components/schemas/PatchProvisioningInstancesIdLookRequest"
|
|
15872
|
+
}
|
|
15873
|
+
}
|
|
15874
|
+
},
|
|
15875
|
+
"x-validated": true
|
|
15876
|
+
},
|
|
15877
|
+
"responses": {
|
|
15878
|
+
"200": {
|
|
15879
|
+
"description": "Success."
|
|
15880
|
+
},
|
|
15881
|
+
"400": {
|
|
15882
|
+
"$ref": "#/components/responses/ValidationFailed"
|
|
15883
|
+
},
|
|
15884
|
+
"401": {
|
|
15885
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
15886
|
+
},
|
|
15887
|
+
"403": {
|
|
15888
|
+
"$ref": "#/components/responses/Forbidden"
|
|
15889
|
+
},
|
|
15890
|
+
"404": {
|
|
15891
|
+
"$ref": "#/components/responses/NotFound"
|
|
15892
|
+
}
|
|
15893
|
+
},
|
|
15894
|
+
"security": [
|
|
15895
|
+
{
|
|
15896
|
+
"builderSession": []
|
|
15897
|
+
}
|
|
15898
|
+
]
|
|
15899
|
+
}
|
|
15900
|
+
},
|
|
15684
15901
|
"/provisioning/instances/{id}/render": {
|
|
15685
15902
|
"get": {
|
|
15686
15903
|
"operationId": "get_provisioning_instances_id_render",
|
|
@@ -16124,6 +16341,41 @@
|
|
|
16124
16341
|
]
|
|
16125
16342
|
}
|
|
16126
16343
|
},
|
|
16344
|
+
"/provisioning/logos/{file}": {
|
|
16345
|
+
"get": {
|
|
16346
|
+
"operationId": "get_provisioning_logos_file",
|
|
16347
|
+
"tags": [
|
|
16348
|
+
"provisioning"
|
|
16349
|
+
],
|
|
16350
|
+
"summary": "GET /provisioning/logos/:file",
|
|
16351
|
+
"description": "a logo is shown on a public hall, and its address is its own sha256, so it names no project and cannot be guessed. Served as an image only: nosniff, a sandboxing CSP, and a cache that never goes stale because a new image is a new name.\n\n**Rank:** `public` — No authentication — any caller.",
|
|
16352
|
+
"x-rank": "public",
|
|
16353
|
+
"x-source": "modules/provisioning/routes/look.js",
|
|
16354
|
+
"parameters": [
|
|
16355
|
+
{
|
|
16356
|
+
"name": "file",
|
|
16357
|
+
"in": "path",
|
|
16358
|
+
"required": true,
|
|
16359
|
+
"schema": {
|
|
16360
|
+
"type": "string"
|
|
16361
|
+
},
|
|
16362
|
+
"description": "Path parameter `file`."
|
|
16363
|
+
}
|
|
16364
|
+
],
|
|
16365
|
+
"responses": {
|
|
16366
|
+
"200": {
|
|
16367
|
+
"description": "Success."
|
|
16368
|
+
},
|
|
16369
|
+
"400": {
|
|
16370
|
+
"$ref": "#/components/responses/BadRequest"
|
|
16371
|
+
},
|
|
16372
|
+
"404": {
|
|
16373
|
+
"$ref": "#/components/responses/NotFound"
|
|
16374
|
+
}
|
|
16375
|
+
},
|
|
16376
|
+
"security": []
|
|
16377
|
+
}
|
|
16378
|
+
},
|
|
16127
16379
|
"/provisioning/onboard-plan": {
|
|
16128
16380
|
"get": {
|
|
16129
16381
|
"operationId": "get_provisioning_onboard_plan",
|
|
@@ -23951,6 +24203,23 @@
|
|
|
23951
24203
|
"reason"
|
|
23952
24204
|
]
|
|
23953
24205
|
},
|
|
24206
|
+
"GetProvisioningInstancesIdLookResponse": {
|
|
24207
|
+
"type": "object",
|
|
24208
|
+
"properties": {
|
|
24209
|
+
"ok": {
|
|
24210
|
+
"type": "boolean"
|
|
24211
|
+
},
|
|
24212
|
+
"look": {},
|
|
24213
|
+
"options": {},
|
|
24214
|
+
"logo_max_bytes": {}
|
|
24215
|
+
},
|
|
24216
|
+
"required": [
|
|
24217
|
+
"ok",
|
|
24218
|
+
"look",
|
|
24219
|
+
"options",
|
|
24220
|
+
"logo_max_bytes"
|
|
24221
|
+
]
|
|
24222
|
+
},
|
|
23954
24223
|
"GetProvisioningInstancesIdRenderResponse": {
|
|
23955
24224
|
"type": "object",
|
|
23956
24225
|
"properties": {
|
|
@@ -25260,6 +25529,22 @@
|
|
|
25260
25529
|
"values_held"
|
|
25261
25530
|
]
|
|
25262
25531
|
},
|
|
25532
|
+
"PatchProvisioningInstancesIdLookRequest": {
|
|
25533
|
+
"type": "object",
|
|
25534
|
+
"properties": {
|
|
25535
|
+
"look": {
|
|
25536
|
+
"type": "string"
|
|
25537
|
+
},
|
|
25538
|
+
"night_tint": {
|
|
25539
|
+
"type": "string"
|
|
25540
|
+
},
|
|
25541
|
+
"accent": {
|
|
25542
|
+
"type": "string",
|
|
25543
|
+
"maxLength": 16
|
|
25544
|
+
}
|
|
25545
|
+
},
|
|
25546
|
+
"additionalProperties": false
|
|
25547
|
+
},
|
|
25263
25548
|
"PatchProvisioningInstancesIdSettingsResponse": {
|
|
25264
25549
|
"type": "object",
|
|
25265
25550
|
"properties": {
|
|
@@ -25775,6 +26060,22 @@
|
|
|
25775
26060
|
},
|
|
25776
26061
|
"working_goal_id": {
|
|
25777
26062
|
"type": "number"
|
|
26063
|
+
},
|
|
26064
|
+
"head": {
|
|
26065
|
+
"type": "string",
|
|
26066
|
+
"maxLength": 40
|
|
26067
|
+
},
|
|
26068
|
+
"disk_head": {
|
|
26069
|
+
"type": "string",
|
|
26070
|
+
"maxLength": 40
|
|
26071
|
+
},
|
|
26072
|
+
"main_head": {
|
|
26073
|
+
"type": "string",
|
|
26074
|
+
"maxLength": 40
|
|
26075
|
+
},
|
|
26076
|
+
"claude_account": {
|
|
26077
|
+
"type": "string",
|
|
26078
|
+
"maxLength": 200
|
|
25778
26079
|
}
|
|
25779
26080
|
},
|
|
25780
26081
|
"required": [
|
|
@@ -30278,6 +30579,26 @@
|
|
|
30278
30579
|
],
|
|
30279
30580
|
"additionalProperties": false
|
|
30280
30581
|
},
|
|
30582
|
+
"PutProvisioningInstancesIdLogoRequest": {
|
|
30583
|
+
"type": "object",
|
|
30584
|
+
"properties": {
|
|
30585
|
+
"image_b64": {
|
|
30586
|
+
"type": "string",
|
|
30587
|
+
"minLength": 1,
|
|
30588
|
+
"maxLength": 368640
|
|
30589
|
+
},
|
|
30590
|
+
"content_type": {
|
|
30591
|
+
"type": "string",
|
|
30592
|
+
"minLength": 1,
|
|
30593
|
+
"maxLength": 100
|
|
30594
|
+
}
|
|
30595
|
+
},
|
|
30596
|
+
"required": [
|
|
30597
|
+
"image_b64",
|
|
30598
|
+
"content_type"
|
|
30599
|
+
],
|
|
30600
|
+
"additionalProperties": false
|
|
30601
|
+
},
|
|
30281
30602
|
"PutRenderDeployAppRequest": {
|
|
30282
30603
|
"type": "object",
|
|
30283
30604
|
"properties": {
|
|
@@ -30476,9 +30797,9 @@
|
|
|
30476
30797
|
"description": "A required dependency/feature is not configured or is temporarily down."
|
|
30477
30798
|
}
|
|
30478
30799
|
},
|
|
30479
|
-
"x-endpoint-count":
|
|
30480
|
-
"x-schema-count":
|
|
30800
|
+
"x-endpoint-count": 483,
|
|
30801
|
+
"x-schema-count": 509,
|
|
30481
30802
|
"x-undocumented-bodies": 12,
|
|
30482
|
-
"x-response-schemas":
|
|
30803
|
+
"x-response-schemas": 341,
|
|
30483
30804
|
"x-generated-by": "scripts/gds/gen-api-docs.js"
|
|
30484
30805
|
}
|
package/docs/api-reference.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# Bongos API reference
|
|
4
4
|
|
|
5
|
-
> **Generated from the live route files** — the route file is authoritative.
|
|
5
|
+
> **Generated from the live route files** — the route file is authoritative. 483 endpoints across 87 route files.
|
|
6
6
|
> Machine-readable spec: [`docs/api/openapi.json`](api/openapi.json) (OpenAPI 3.1). Rendered docs site: **`/docs`** (e.g. `cloudbongos.com/docs`).
|
|
7
7
|
|
|
8
8
|
Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust-boundary-server-enforced-permissions.md)): `public` < `any-builder` < `metic+archon` < `archon`.
|
|
@@ -90,7 +90,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
90
90
|
| POST | `/api/bongos/autonomy/fence/goals` | `archon` | `goal_id`, `note` | Add a goal to the allowlist. |
|
|
91
91
|
| DELETE | `/api/bongos/autonomy/fence/goals/:goalId` | `archon` | — | Revoke one. |
|
|
92
92
|
| POST | `/api/bongos/autonomy/fence/priority` | `archon` | `goal_id` | The priority goal (task 1004453): which allowlisted goal the runner works first. |
|
|
93
|
-
| POST | `/api/bongos/autonomy/heartbeat` | `any-builder` | `host`, `pid`, `started_at`, `mode`, `consecutive_failures`, `last_event`, `working_task_id`, `working_goal_id` | The runner's check-in, once per loop. |
|
|
93
|
+
| POST | `/api/bongos/autonomy/heartbeat` | `any-builder` | `host`, `pid`, `started_at`, `mode`, `consecutive_failures`, `last_event`, `working_task_id`, `working_goal_id`, `head`, `disk_head`, `main_head`, `claude_account` | The runner's check-in, once per loop. |
|
|
94
94
|
| GET | `/api/bongos/autonomy/precheck` | `metic+archon` | — | |
|
|
95
95
|
| GET | `/api/bongos/autonomy/runners` | `any-builder` | — | What the hall renders: the CALLER'S OWN runners, with the pure verdict attached so the page and any future alert cannot disagree about wh… |
|
|
96
96
|
| GET | `/api/bongos/autonomy/runs` | `metic+archon` | — | The gate's past decisions — did a routine fire, and what did it decide, and why (task 1002669). |
|
|
@@ -587,7 +587,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
587
587
|
| GET | `/api/bongos/projects/featured` | `public` | — | the public map of projects; no auth by design. |
|
|
588
588
|
| POST | `/api/bongos/projects/invite` | `metic+archon` | `client_id`, `github_login` | own-or-metic in effect: where to invite a builder into a project, asked by a `project.curate` holder OR the project's OWN OWNER (task 100… |
|
|
589
589
|
|
|
590
|
-
## `provisioning` (
|
|
590
|
+
## `provisioning` (40)
|
|
591
591
|
|
|
592
592
|
| Method | Path | Rank | Body | Description |
|
|
593
593
|
|---|---|---|---|---|
|
|
@@ -612,6 +612,10 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
612
612
|
| POST | `/api/bongos/provisioning/instances/:id/force-teardown` | `metic+archon` | — | POST /provisioning/instances/:id/force-teardown — Archon tears down ANY instance. |
|
|
613
613
|
| POST | `/api/bongos/provisioning/instances/:id/github-app` | `any-builder` | `account` | POST /provisioning/instances/:id/github-app — mint a GitHub-App-Manifest onboarding link for the caller's OWN instance (task 2080, ADR 01… |
|
|
614
614
|
| GET | `/api/bongos/provisioning/instances/:id/invite-suggestions` | `any-builder` | — | ── Who is worth inviting (BV1.R28, task 1002347, goal 1000046 C6) ──────── GET /provisioning/instances/:id/invite-suggestions — turn the … |
|
|
615
|
+
| PUT | `/api/bongos/provisioning/instances/:id/logo` | `any-builder` | `image_b64`, `content_type` | PUT …/logo — rank: any authenticated builder (own resource; archon may change any). |
|
|
616
|
+
| DELETE | `/api/bongos/provisioning/instances/:id/logo` | `any-builder` | validated | DELETE …/logo — rank: any authenticated builder (own resource; archon may change any). |
|
|
617
|
+
| GET | `/api/bongos/provisioning/instances/:id/look` | `any-builder` | — | GET — rank: any authenticated builder (own resource; archon may read any). |
|
|
618
|
+
| PATCH | `/api/bongos/provisioning/instances/:id/look` | `any-builder` | `look`, `night_tint`, `accent` | PATCH — rank: any authenticated builder (own resource; archon may change any). |
|
|
615
619
|
| GET | `/api/bongos/provisioning/instances/:id/render` | `any-builder` | — | GET /provisioning/instances/:id/render — rank: any authenticated builder, and OWNER ONLY, like the POST (task 1004353). |
|
|
616
620
|
| POST | `/api/bongos/provisioning/instances/:id/render` | `any-builder` | `key`, `owner_id`, `mode`, `service_id`, `web_plan`, `db_plan`, `region`, `runtime`, `build_command`, `start_command`, `database` | POST /provisioning/instances/:id/render — rank: any authenticated builder, and OWNER ONLY: the key is the owner's and so is the account i… |
|
|
617
621
|
| POST | `/api/bongos/provisioning/instances/:id/repo-private` | `any-builder` | validated | POST /provisioning/instances/:id/repo-private — rank: any authenticated builder, and OWNER ONLY: no archon override, because the runner f… |
|
|
@@ -620,6 +624,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
620
624
|
| PATCH | `/api/bongos/provisioning/instances/:id/settings` | `any-builder` | validated | PATCH /provisioning/instances/:id/settings — change a project's settings. |
|
|
621
625
|
| POST | `/api/bongos/provisioning/instances/:id/teardown` | `any-builder` | — | POST /provisioning/instances/:id/teardown — request teardown of the caller's OWN instance. |
|
|
622
626
|
| POST | `/api/bongos/provisioning/instances/:id/update-channel` | `archon` | — | POST /provisioning/instances/:id/update-channel — set the project's update rule (task 1004445). |
|
|
627
|
+
| GET | `/api/bongos/provisioning/logos/:file` | `public` | — | a logo is shown on a public hall, and its address is its own sha256, so it names no project and cannot be guessed. |
|
|
623
628
|
| GET | `/api/bongos/provisioning/onboard-plan` | `public` | — | GET /provisioning/onboard-plan?mode=greenfield\|adopt&domain=<host> — the CANONICAL onboarding step sequence (task 2085; goal 35 / criteri… |
|
|
624
629
|
| GET | `/api/bongos/provisioning/recommendations` | `public` | — | GET /provisioning/recommendations?type=<project type>&team_shape=<interview answer> — the RULE-BASED recommendation for one set of creati… |
|
|
625
630
|
| POST | `/api/bongos/provisioning/render/lookup` | `any-builder` | `key`, `owner_id` | POST /provisioning/render/lookup — rank: any authenticated builder. |
|