@bongos/core 1.24.45 → 1.24.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/.bongos-core.json +140 -105
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +4 -0
  4. package/clients/bongos-client/index.cjs +4 -0
  5. package/clients/bongos-client/index.d.ts +8 -0
  6. package/clients/bongos-client/index.mjs +4 -0
  7. package/docs/adr/0307-autobongos-a-deterministic-supervisor-and-agentic-workers.md +15 -0
  8. package/docs/api/openapi.json +152 -3
  9. package/docs/api-reference.md +4 -2
  10. package/docs/copy-inventory.md +1102 -1102
  11. package/docs/copy-registry.json +1538 -1538
  12. package/docs/module-api-changelog.md +2 -0
  13. package/docs/onboarding/diagrams/assertions.json +2 -2
  14. package/docs/page-inventory.json +11 -0
  15. package/docs/page-readings.json +724 -724
  16. package/migrations/core_295_runner_logins.sql +50 -0
  17. package/modules/government/session-scopes.json +5 -0
  18. package/modules/hall-ui/public/ai-studio.states.json +2 -0
  19. package/modules/hall-ui/public/atlas.states.json +2 -0
  20. package/modules/hall-ui/public/board-room.states.json +2 -0
  21. package/modules/hall-ui/public/city.states.json +2 -0
  22. package/modules/hall-ui/public/collab.states.json +2 -0
  23. package/modules/hall-ui/public/commands.states.json +2 -0
  24. package/modules/hall-ui/public/copy-desk.states.json +2 -0
  25. package/modules/hall-ui/public/deploy.states.json +2 -0
  26. package/modules/hall-ui/public/goal-map.states.json +2 -0
  27. package/modules/hall-ui/public/goals.css +1 -0
  28. package/modules/hall-ui/public/goals.states.json +2 -0
  29. package/modules/hall-ui/public/government.states.json +2 -0
  30. package/modules/hall-ui/public/idea.states.json +2 -0
  31. package/modules/hall-ui/public/ideas.states.json +2 -0
  32. package/modules/hall-ui/public/index-founding.states.json +2 -0
  33. package/modules/hall-ui/public/index-genesis-decide.states.json +2 -0
  34. package/modules/hall-ui/public/index-genesis-demo.states.json +2 -0
  35. package/modules/hall-ui/public/index-genesis.states.json +2 -0
  36. package/modules/hall-ui/public/index.states.json +5 -0
  37. package/modules/hall-ui/public/market-watch-item.states.json +2 -0
  38. package/modules/hall-ui/public/market-watch-rules.states.json +2 -0
  39. package/modules/hall-ui/public/market-watch.states.json +2 -0
  40. package/modules/hall-ui/public/modules.states.json +2 -0
  41. package/modules/hall-ui/public/money.states.json +2 -0
  42. package/modules/hall-ui/public/my-agents.states.json +2 -0
  43. package/modules/hall-ui/public/notes-panel.css +1 -1
  44. package/modules/hall-ui/public/primer.states.json +2 -0
  45. package/modules/hall-ui/public/profile.states.json +2 -0
  46. package/modules/hall-ui/public/roster.states.json +2 -0
  47. package/modules/hall-ui/public/settings.states.json +2 -0
  48. package/modules/hall-ui/public/street-card.states.json +2 -0
  49. package/modules/hall-ui/public/street.states.json +2 -0
  50. package/modules/hall-ui/public/studio.states.json +2 -0
  51. package/modules/hall-ui/public/style.css +27 -24
  52. package/modules/hall-ui/public/task.states.json +2 -0
  53. package/modules/hall-ui/public/thinking.states.json +2 -0
  54. package/modules/hall-ui/public/tweak-editor.states.json +2 -0
  55. package/modules/hall-ui/public/watch.states.json +2 -0
  56. package/modules/hall-ui/public/welcome-boot.js +6 -2
  57. package/modules/hall-ui/public/work-founding.states.json +2 -0
  58. package/modules/hall-ui/public/work.states.json +3 -1
  59. package/modules/lifecycle/db-claims.js +6 -3
  60. package/modules/lifecycle/routes/claims.js +10 -0
  61. package/modules/lifecycle/routes/tasks.js +1 -1
  62. package/modules/lifecycle/runner-self-guard.js +19 -10
  63. package/modules/platform-identity/platform-identity.js +1 -1
  64. package/modules/platform-identity/tests/platform-identity.mjs +13 -2
  65. package/modules/provisioning/core-upgrade-authz.js +8 -0
  66. package/modules/public-landing/public/account.html +1 -0
  67. package/modules/public-landing/public/community.html +1 -0
  68. package/modules/public-landing/public/connections.html +1 -0
  69. package/modules/public-landing/public/contact.html +1 -0
  70. package/modules/public-landing/public/guild.html +1 -0
  71. package/modules/public-landing/public/index.html +1 -0
  72. package/modules/public-landing/public/invitations.html +1 -0
  73. package/modules/public-landing/public/privacy.html +1 -0
  74. package/modules/public-landing/public/projects.html +1 -0
  75. package/modules/public-landing/public/terms.html +1 -0
  76. package/modules/raise/views/gate.html +1 -0
  77. package/modules/raise/views/nda.html +1 -0
  78. package/modules/raise/views/page.html +1 -0
  79. package/modules/status-ui/public/index.html +1 -0
  80. package/modules/ui-design/kit/README.md +1 -1
  81. package/modules/ui-design/kit/fixtures/versions.json +1 -0
  82. package/modules/ui-design/kit/lib.js +48 -3
  83. package/modules/ui-design/kit/probe.js +1 -0
  84. package/modules/ui-design/kit/render.js +2 -0
  85. package/modules/ui-design/kit/serve.js +1 -0
  86. package/modules/ui-design/module.json +1 -1
  87. package/modules/ui-design/public/tokens.css +125 -0
  88. package/package-lock.json +2 -2
  89. package/package.json +1 -1
  90. package/release-notes.json +14 -0
  91. package/scripts/bongos/fitness.js +1 -1
  92. package/scripts/bongos/run-unit-tests.js +3 -0
  93. package/src/bongos/auth.js +25 -4
  94. package/src/bongos/route-rank-check.js +5 -0
  95. package/src/bongos/routes/auth.js +48 -0
  96. package/src/bongos/runner-login.js +151 -0
  97. package/src/bongos/serve-internal.js +6 -1
  98. package/src/module-api.js +1 -1
  99. package/tests/autobongos_runner_login.mjs +296 -0
  100. package/tests/autobongos_runner_login_db.mjs +105 -0
  101. package/tests/design_tokens_shared.mjs +183 -0
  102. package/tests/government_session_scope.mjs +2 -1
  103. package/tests/hall_reading_world.mjs +5 -1
  104. package/tests/hall_tokens.mjs +22 -3
  105. package/tests/ui_design_kit.mjs +30 -0
  106. package/tests/welcome_boot_browser.mjs +4 -0
@@ -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
- - 684 operations across 85 resource groups
8
+ - 686 operations across 85 resource groups
9
9
 
10
10
  ## Use it from your project
11
11
 
@@ -195,6 +195,10 @@ function createClient(opts = {}) {
195
195
  postAuthRevoke: (args) => request("POST", "/auth/revoke", { hasBody: true }, args),
196
196
  // POST /auth/revoke-all — rank: archon — POST /auth/revoke-all
197
197
  postAuthRevokeAll: (args) => request("POST", "/auth/revoke-all", { hasBody: true }, args),
198
+ // POST /auth/runner-code/exchange — rank: public — POST /auth/runner-code/exchange
199
+ postAuthRunnerCodeExchange: (args) => request("POST", "/auth/runner-code/exchange", { hasBody: true }, args),
200
+ // POST /auth/runner-code/issue — rank: metic+archon — POST /auth/runner-code/issue
201
+ postAuthRunnerCodeIssue: (args) => request("POST", "/auth/runner-code/issue", { hasBody: true }, args),
198
202
  // GET /auth/web/admission-status — rank: public — GET /auth/web/admission-status
199
203
  getAuthWebAdmissionStatus: (args) => request("GET", "/auth/web/admission-status", { hasBody: false }, args),
200
204
  // GET /auth/web/callback — rank: public — GET /auth/web/callback
@@ -194,6 +194,10 @@ function createClient(opts = {}) {
194
194
  postAuthRevoke: (args) => request("POST", "/auth/revoke", { hasBody: true }, args),
195
195
  // POST /auth/revoke-all — rank: archon — POST /auth/revoke-all
196
196
  postAuthRevokeAll: (args) => request("POST", "/auth/revoke-all", { hasBody: true }, args),
197
+ // POST /auth/runner-code/exchange — rank: public — POST /auth/runner-code/exchange
198
+ postAuthRunnerCodeExchange: (args) => request("POST", "/auth/runner-code/exchange", { hasBody: true }, args),
199
+ // POST /auth/runner-code/issue — rank: metic+archon — POST /auth/runner-code/issue
200
+ postAuthRunnerCodeIssue: (args) => request("POST", "/auth/runner-code/issue", { hasBody: true }, args),
197
201
  // GET /auth/web/admission-status — rank: public — GET /auth/web/admission-status
198
202
  getAuthWebAdmissionStatus: (args) => request("GET", "/auth/web/admission-status", { hasBody: false }, args),
199
203
  // GET /auth/web/callback — rank: public — GET /auth/web/callback
@@ -326,6 +326,10 @@ export interface PostAuthRevokeAllRequest { builder_id?: StringifiableId }
326
326
  export interface PostAuthRevokeAllResponse { ok: boolean; revoked: unknown }
327
327
  export interface PostAuthRevokeRequest { session_id?: StringifiableId }
328
328
  export interface PostAuthRevokeResponse { ok: boolean; revoked: unknown }
329
+ export interface PostAuthRunnerCodeExchangeRequest { code: string }
330
+ export interface PostAuthRunnerCodeExchangeResponse { ok: boolean; token: unknown; session_id: unknown; builder_login: unknown; label: unknown; api_base: unknown }
331
+ export interface PostAuthRunnerCodeIssueRequest { label?: string }
332
+ export interface PostAuthRunnerCodeIssueResponse { ok: boolean; code: unknown; expires_at: unknown; api_base: unknown }
329
333
  export interface PostAutonomyBuildersBuilderIdPauseRequest { paused: boolean; reason?: string }
330
334
  export interface PostAutonomyFenceGoalsRequest { goal_id: StringifiableId; note?: string }
331
335
  export interface PostAutonomyFenceGoalsResponse { goal: unknown }
@@ -847,6 +851,10 @@ export interface BongosClient {
847
851
  postAuthRevoke(args?: RequestArgs & { body?: PostAuthRevokeRequest }): Promise<PostAuthRevokeResponse>;
848
852
  /** POST /auth/revoke-all — rank: archon */
849
853
  postAuthRevokeAll(args?: RequestArgs & { body?: PostAuthRevokeAllRequest }): Promise<PostAuthRevokeAllResponse>;
854
+ /** POST /auth/runner-code/exchange — rank: public */
855
+ postAuthRunnerCodeExchange(args: RequestArgs & { body: PostAuthRunnerCodeExchangeRequest }): Promise<PostAuthRunnerCodeExchangeResponse>;
856
+ /** POST /auth/runner-code/issue — rank: metic+archon */
857
+ postAuthRunnerCodeIssue(args?: RequestArgs & { body?: PostAuthRunnerCodeIssueRequest }): Promise<PostAuthRunnerCodeIssueResponse>;
850
858
  /** GET /auth/web/admission-status — rank: public */
851
859
  getAuthWebAdmissionStatus(args?: RequestArgs): Promise<GetAuthWebAdmissionStatusResponse>;
852
860
  /** GET /auth/web/callback — rank: public */
@@ -191,6 +191,10 @@ export function createClient(opts = {}) {
191
191
  postAuthRevoke: (args) => request("POST", "/auth/revoke", { hasBody: true }, args),
192
192
  // POST /auth/revoke-all — rank: archon — POST /auth/revoke-all
193
193
  postAuthRevokeAll: (args) => request("POST", "/auth/revoke-all", { hasBody: true }, args),
194
+ // POST /auth/runner-code/exchange — rank: public — POST /auth/runner-code/exchange
195
+ postAuthRunnerCodeExchange: (args) => request("POST", "/auth/runner-code/exchange", { hasBody: true }, args),
196
+ // POST /auth/runner-code/issue — rank: metic+archon — POST /auth/runner-code/issue
197
+ postAuthRunnerCodeIssue: (args) => request("POST", "/auth/runner-code/issue", { hasBody: true }, args),
194
198
  // GET /auth/web/admission-status — rank: public — GET /auth/web/admission-status
195
199
  getAuthWebAdmissionStatus: (args) => request("GET", "/auth/web/admission-status", { hasBody: false }, args),
196
200
  // GET /auth/web/callback — rank: public — GET /auth/web/callback
@@ -156,6 +156,21 @@ the declared-touches gate above leaves. The list covers the files that implement
156
156
  those checks; the one route line that calls the server check sits in a protected
157
157
  file, and a test on the list drives that route.
158
158
 
159
+ **The runner signs in with its own login** (task 1004547, goal 1000139; owner
160
+ decisions 2026-11-06). Until then a worker ran under its builder's CLI session, so
161
+ the server knew a runner's claim only by the worktree name the runner chose, and a
162
+ worker carried its installer's full authority, enough to move a live core pin (found
163
+ by task 1004974). Now a Metic+ builder issues a one-time code from the hall (a
164
+ browser cookie only, so no token can mint a login; single use; 15 minutes), and the
165
+ PC trades it for a session of source `runner` (`src/bongos/runner-login.js`). Three
166
+ things follow, all server-side. Every claim that login makes carries
167
+ `claims.autonomous`, set from the session and never the body, and the publish guard
168
+ reads it, so a renamed worktree no longer hides a runner. The login **acts at Metic
169
+ at most** and **holds no system permission**, so the kill switch, rank changes and
170
+ core moves are out of its reach, and the project-owner door to a core move is shut to
171
+ it. Removing the PC is the ordinary own-session revoke. The worktree-name check is
172
+ kept for runners not yet moved to their own login.
173
+
159
174
  ### 7. Workers run with blanket `bypassPermissions`
160
175
 
161
176
  `--permission-prompt-tool` exists and is print-mode only, so routing every
@@ -2356,6 +2356,94 @@
2356
2356
  ]
2357
2357
  }
2358
2358
  },
2359
+ "/auth/runner-code/exchange": {
2360
+ "post": {
2361
+ "operationId": "post_auth_runner_code_exchange",
2362
+ "tags": [
2363
+ "auth"
2364
+ ],
2365
+ "summary": "POST /auth/runner-code/exchange",
2366
+ "description": "POST /auth/runner-code/exchange — task 1004547. The PC sends the one-time code and gets back its own login (a 'runner' session). Body: { code }. rank: public — auth establishment; the one-time code is the bearer. A wrong, used or expired code all answer the same 401, so nothing is learned from which. The router's per-IP write limit (rateLimitMiddleware) is its abuse ceiling; the code is 256 bits, so guessing one is not a race worth a limiter of its own.\n\n**Rank:** `public` — No authentication — any caller.",
2367
+ "x-rank": "public",
2368
+ "x-source": "src/bongos/routes/auth.js",
2369
+ "requestBody": {
2370
+ "required": true,
2371
+ "content": {
2372
+ "application/json": {
2373
+ "schema": {
2374
+ "$ref": "#/components/schemas/PostAuthRunnerCodeExchangeRequest"
2375
+ }
2376
+ }
2377
+ },
2378
+ "x-validated": true
2379
+ },
2380
+ "responses": {
2381
+ "200": {
2382
+ "description": "Success.",
2383
+ "content": {
2384
+ "application/json": {
2385
+ "schema": {
2386
+ "$ref": "#/components/schemas/PostAuthRunnerCodeExchangeResponse"
2387
+ }
2388
+ }
2389
+ }
2390
+ },
2391
+ "400": {
2392
+ "$ref": "#/components/responses/ValidationFailed"
2393
+ }
2394
+ },
2395
+ "security": []
2396
+ }
2397
+ },
2398
+ "/auth/runner-code/issue": {
2399
+ "post": {
2400
+ "operationId": "post_auth_runner_code_issue",
2401
+ "tags": [
2402
+ "auth"
2403
+ ],
2404
+ "summary": "POST /auth/runner-code/issue",
2405
+ "description": "POST /auth/runner-code/issue — task 1004547 (goal 1000139). A ONE-TIME CODE an Autobongos PC trades for its own login (src/bongos/runner-login.js). Body: { label? } — the PC's name, shown later in the builder's sessions list. rank: metic+archon — running a runner is Metic+ today (owner, 2026-11-06). Cookie ONLY, like /auth/cli-token/issue: a bearer — a CLI token or a runner's own login — must never be able to mint another login. The code is returned once; only its hash is stored. It works once and expires in 15 minutes.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).",
2406
+ "x-rank": "metic+archon",
2407
+ "x-source": "src/bongos/routes/auth.js",
2408
+ "requestBody": {
2409
+ "required": false,
2410
+ "content": {
2411
+ "application/json": {
2412
+ "schema": {
2413
+ "$ref": "#/components/schemas/PostAuthRunnerCodeIssueRequest"
2414
+ }
2415
+ }
2416
+ },
2417
+ "x-validated": true
2418
+ },
2419
+ "responses": {
2420
+ "200": {
2421
+ "description": "Success.",
2422
+ "content": {
2423
+ "application/json": {
2424
+ "schema": {
2425
+ "$ref": "#/components/schemas/PostAuthRunnerCodeIssueResponse"
2426
+ }
2427
+ }
2428
+ }
2429
+ },
2430
+ "400": {
2431
+ "$ref": "#/components/responses/ValidationFailed"
2432
+ },
2433
+ "401": {
2434
+ "$ref": "#/components/responses/Unauthorized"
2435
+ },
2436
+ "403": {
2437
+ "$ref": "#/components/responses/Forbidden"
2438
+ }
2439
+ },
2440
+ "security": [
2441
+ {
2442
+ "builderSession": []
2443
+ }
2444
+ ]
2445
+ }
2446
+ },
2359
2447
  "/auth/web/admission-status": {
2360
2448
  "get": {
2361
2449
  "operationId": "get_auth_web_admission_status",
@@ -36146,6 +36234,67 @@
36146
36234
  "revoked"
36147
36235
  ]
36148
36236
  },
36237
+ "PostAuthRunnerCodeExchangeRequest": {
36238
+ "type": "object",
36239
+ "properties": {
36240
+ "code": {
36241
+ "type": "string",
36242
+ "maxLength": 200
36243
+ }
36244
+ },
36245
+ "required": [
36246
+ "code"
36247
+ ],
36248
+ "additionalProperties": false
36249
+ },
36250
+ "PostAuthRunnerCodeExchangeResponse": {
36251
+ "type": "object",
36252
+ "properties": {
36253
+ "ok": {
36254
+ "type": "boolean"
36255
+ },
36256
+ "token": {},
36257
+ "session_id": {},
36258
+ "builder_login": {},
36259
+ "label": {},
36260
+ "api_base": {}
36261
+ },
36262
+ "required": [
36263
+ "ok",
36264
+ "token",
36265
+ "session_id",
36266
+ "builder_login",
36267
+ "label",
36268
+ "api_base"
36269
+ ]
36270
+ },
36271
+ "PostAuthRunnerCodeIssueRequest": {
36272
+ "type": "object",
36273
+ "properties": {
36274
+ "label": {
36275
+ "type": "string",
36276
+ "maxLength": 200
36277
+ }
36278
+ },
36279
+ "additionalProperties": false
36280
+ },
36281
+ "PostAuthRunnerCodeIssueResponse": {
36282
+ "type": "object",
36283
+ "properties": {
36284
+ "ok": {
36285
+ "type": "boolean"
36286
+ },
36287
+ "code": {},
36288
+ "expires_at": {},
36289
+ "api_base": {}
36290
+ },
36291
+ "required": [
36292
+ "ok",
36293
+ "code",
36294
+ "expires_at",
36295
+ "api_base"
36296
+ ]
36297
+ },
36149
36298
  "PostAutonomyBuildersBuilderIdPauseRequest": {
36150
36299
  "type": "object",
36151
36300
  "properties": {
@@ -42907,9 +43056,9 @@
42907
43056
  "description": "A required dependency/feature is not configured or is temporarily down."
42908
43057
  }
42909
43058
  },
42910
- "x-endpoint-count": 684,
42911
- "x-schema-count": 719,
43059
+ "x-endpoint-count": 686,
43060
+ "x-schema-count": 723,
42912
43061
  "x-undocumented-bodies": 12,
42913
- "x-response-schemas": 457,
43062
+ "x-response-schemas": 459,
42914
43063
  "x-generated-by": "scripts/bongos/gen-api-docs.js"
42915
43064
  }
@@ -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. 684 endpoints across 117 route files.
5
+ > **Generated from the live route files** — the route file is authoritative. 686 endpoints across 117 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`.
@@ -78,7 +78,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
78
78
  |---|---|---|---|---|
79
79
  | GET | `/api/bongos/audit-log` | `metic+archon` | — | GET /api/bongos/audit-log?limit=&offset=&builder_id=&method= Paginated, newest-first. |
80
80
 
81
- ## `auth` (21)
81
+ ## `auth` (23)
82
82
 
83
83
  | Method | Path | Rank | Body | Description |
84
84
  |---|---|---|---|---|
@@ -98,6 +98,8 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
98
98
  | POST | `/api/bongos/auth/logout` | `any-builder` | — | own session, no rank gate (a Xenos can log themselves out). |
99
99
  | POST | `/api/bongos/auth/revoke` | `archon` | `session_id` | POST /auth/revoke — V3.R38 / task 259. |
100
100
  | POST | `/api/bongos/auth/revoke-all` | `archon` | `builder_id` | POST /auth/revoke-all — V3.R38 / task 259. |
101
+ | POST | `/api/bongos/auth/runner-code/exchange` | `public` | `code` | POST /auth/runner-code/exchange — task 1004547. |
102
+ | POST | `/api/bongos/auth/runner-code/issue` | `metic+archon` | `label` | POST /auth/runner-code/issue — task 1004547 (goal 1000139). |
101
103
  | GET | `/api/bongos/auth/web/admission-status` | `public` | — | GET /auth/web/admission-status?login=X — the probe renderAccessPendingPage polls (task 1002097). |
102
104
  | GET | `/api/bongos/auth/web/callback` | `public` | — | OAuth callback; the state cookie + code are the bearer. |
103
105
  | GET | `/api/bongos/auth/web/callback/link` | `public` | — | the OAuth callback for linking; the state cookie + code are the bearer, and the live session cookie names the person (no session: <redacted> |