@bongos/core 1.24.11 → 1.24.13

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 (93) hide show
  1. package/.bongos-core.json +160 -85
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +6 -0
  4. package/clients/bongos-client/index.cjs +6 -0
  5. package/clients/bongos-client/index.d.ts +8 -0
  6. package/clients/bongos-client/index.mjs +6 -0
  7. package/docs/adr/0371-auto-pickup-applies-a-submitted-tweak-on-the-runner.md +1 -0
  8. package/docs/api/openapi.json +175 -3
  9. package/docs/api-reference.md +5 -2
  10. package/docs/copy-inventory.md +92 -20
  11. package/docs/copy-registry.json +777 -33
  12. package/docs/module-api-changelog.md +4 -0
  13. package/docs/page-inventory.json +68 -4
  14. package/docs/page-readings.json +856 -802
  15. package/migrations/core_288_credit_log_idea_unique.sql +51 -0
  16. package/modules/economy/credits.js +6 -5
  17. package/modules/hall-ui/public/ai-studio.html +1 -1
  18. package/modules/hall-ui/public/atlas.html +1 -1
  19. package/modules/hall-ui/public/blockers.html +1 -1
  20. package/modules/hall-ui/public/board-room.html +1 -1
  21. package/modules/hall-ui/public/city.html +1 -1
  22. package/modules/hall-ui/public/collab.html +1 -1
  23. package/modules/hall-ui/public/commands.html +1 -1
  24. package/modules/hall-ui/public/copy-desk.html +1 -1
  25. package/modules/hall-ui/public/craft-mode.js +2 -2
  26. package/modules/hall-ui/public/deploy.html +1 -1
  27. package/modules/hall-ui/public/diagrams.html +1 -1
  28. package/modules/hall-ui/public/drachmae.html +1 -1
  29. package/modules/hall-ui/public/fleet.html +1 -1
  30. package/modules/hall-ui/public/gate.html +1 -1
  31. package/modules/hall-ui/public/goal-map.html +1 -1
  32. package/modules/hall-ui/public/goals.html +1 -1
  33. package/modules/hall-ui/public/government.html +1 -1
  34. package/modules/hall-ui/public/idea.html +1 -1
  35. package/modules/hall-ui/public/ideas.html +1 -1
  36. package/modules/hall-ui/public/index.html +1 -1
  37. package/modules/hall-ui/public/market-watch-item.html +83 -0
  38. package/modules/hall-ui/public/market-watch-item.js +150 -0
  39. package/modules/hall-ui/public/market-watch-item.states.json +143 -0
  40. package/modules/hall-ui/public/market-watch-lib.js +243 -0
  41. package/modules/hall-ui/public/market-watch-rules.html +1 -1
  42. package/modules/hall-ui/public/market-watch-settings.html +1 -1
  43. package/modules/hall-ui/public/market-watch.css +169 -0
  44. package/modules/hall-ui/public/market-watch.html +111 -0
  45. package/modules/hall-ui/public/market-watch.js +129 -0
  46. package/modules/hall-ui/public/market-watch.states.json +14 -0
  47. package/modules/hall-ui/public/modules.html +1 -1
  48. package/modules/hall-ui/public/my-agents.html +1 -1
  49. package/modules/hall-ui/public/primer.html +1 -1
  50. package/modules/hall-ui/public/profile.html +1 -1
  51. package/modules/hall-ui/public/project-settings.html +1 -1
  52. package/modules/hall-ui/public/project-settings.js +2 -2
  53. package/modules/hall-ui/public/ranks.html +1 -1
  54. package/modules/hall-ui/public/roadmap.html +1 -1
  55. package/modules/hall-ui/public/roster.html +1 -1
  56. package/modules/hall-ui/public/sessions.html +1 -1
  57. package/modules/hall-ui/public/settings.html +1 -1
  58. package/modules/hall-ui/public/shell.js +3 -2
  59. package/modules/hall-ui/public/street.html +1 -1
  60. package/modules/hall-ui/public/studio.html +1 -1
  61. package/modules/hall-ui/public/task.html +1 -1
  62. package/modules/hall-ui/public/thinking.html +1 -1
  63. package/modules/hall-ui/public/tweak-editor.html +1 -1
  64. package/modules/hall-ui/public/watch.html +1 -1
  65. package/modules/hall-ui/public/work.html +1 -1
  66. package/modules/hall-ui/records/market-watch.md +40 -0
  67. package/modules/lifecycle/autopickup.js +46 -24
  68. package/modules/lifecycle/db-claims.js +1 -1
  69. package/modules/lifecycle/routes/project-settings.js +24 -16
  70. package/modules/market-watch/db.js +15 -10
  71. package/modules/market-watch/module.json +2 -1
  72. package/modules/market-watch/pages.js +323 -0
  73. package/modules/market-watch/proposals.js +66 -4
  74. package/modules/market-watch/research.js +27 -0
  75. package/modules/market-watch/routes/pages.js +116 -0
  76. package/package-lock.json +2 -2
  77. package/package.json +1 -1
  78. package/release-notes.json +20 -0
  79. package/scripts/bongos/run-unit-tests.js +4 -0
  80. package/src/bongos/module-scope-map.js +1 -0
  81. package/src/bongos/project-settings.js +2 -2
  82. package/src/module-api.js +1 -1
  83. package/tests/autopickup_cap.mjs +122 -60
  84. package/tests/credit_log_idea_unique_db.mjs +98 -0
  85. package/tests/fixtures/market-watch-seed-rows.cjs +60 -0
  86. package/tests/hall_nav.mjs +4 -1
  87. package/tests/hall_page_gate_map.mjs +4 -0
  88. package/tests/market_watch_data_db.mjs +1 -0
  89. package/tests/market_watch_module.mjs +2 -1
  90. package/tests/market_watch_pages.mjs +356 -0
  91. package/tests/market_watch_rules.mjs +63 -3
  92. package/tests/market_watch_run.mjs +44 -0
  93. package/tests/nav_permission_atoms.mjs +1 -1
@@ -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
- - 649 operations across 81 resource groups
8
+ - 652 operations across 81 resource groups
9
9
 
10
10
  ## Use it from your project
11
11
 
@@ -763,6 +763,12 @@ function createClient(opts = {}) {
763
763
  getMarketWatchAsk: (args) => request("GET", "/market-watch/ask", { hasBody: false }, args),
764
764
  // POST /market-watch/ask/answer — rank: any-builder — POST /market-watch/ask/answer
765
765
  postMarketWatchAskAnswer: (args) => request("POST", "/market-watch/ask/answer", { hasBody: true }, args),
766
+ // GET /market-watch/home — rank: any-builder — GET /market-watch/home
767
+ getMarketWatchHome: (args) => request("GET", "/market-watch/home", { hasBody: false }, args),
768
+ // GET /market-watch/items/{id} — rank: any-builder — GET /market-watch/items/:id
769
+ getMarketWatchItemsId: (args) => request("GET", "/market-watch/items/{id}", { hasBody: false }, args),
770
+ // POST /market-watch/proposals — rank: any-builder — POST /market-watch/proposals
771
+ postMarketWatchProposals: (args) => request("POST", "/market-watch/proposals", { hasBody: true }, args),
766
772
  // POST /market-watch/proposals/{id}/decide — rank: any-builder — POST /market-watch/proposals/:id/decide
767
773
  postMarketWatchProposalsIdDecide: (args) => request("POST", "/market-watch/proposals/{id}/decide", { hasBody: true }, args),
768
774
  // POST /market-watch/proposals/{id}/vote — rank: metic+archon — POST /market-watch/proposals/:id/vote
@@ -762,6 +762,12 @@ function createClient(opts = {}) {
762
762
  getMarketWatchAsk: (args) => request("GET", "/market-watch/ask", { hasBody: false }, args),
763
763
  // POST /market-watch/ask/answer — rank: any-builder — POST /market-watch/ask/answer
764
764
  postMarketWatchAskAnswer: (args) => request("POST", "/market-watch/ask/answer", { hasBody: true }, args),
765
+ // GET /market-watch/home — rank: any-builder — GET /market-watch/home
766
+ getMarketWatchHome: (args) => request("GET", "/market-watch/home", { hasBody: false }, args),
767
+ // GET /market-watch/items/{id} — rank: any-builder — GET /market-watch/items/:id
768
+ getMarketWatchItemsId: (args) => request("GET", "/market-watch/items/{id}", { hasBody: false }, args),
769
+ // POST /market-watch/proposals — rank: any-builder — POST /market-watch/proposals
770
+ postMarketWatchProposals: (args) => request("POST", "/market-watch/proposals", { hasBody: true }, args),
765
771
  // POST /market-watch/proposals/{id}/decide — rank: any-builder — POST /market-watch/proposals/:id/decide
766
772
  postMarketWatchProposalsIdDecide: (args) => request("POST", "/market-watch/proposals/{id}/decide", { hasBody: true }, args),
767
773
  // POST /market-watch/proposals/{id}/vote — rank: metic+archon — POST /market-watch/proposals/:id/vote
@@ -470,6 +470,8 @@ export interface PostLlmCacheStoreResponse { stored: boolean; result_cost_usd?:
470
470
  export interface PostMarketWatchAskAnswerRequest { week_of?: string; picks?: unknown[]; names?: unknown[]; nothing?: boolean; builder_id?: number }
471
471
  export interface PostMarketWatchProposalsIdDecideRequest { decision: "approve" | "decline" }
472
472
  export interface PostMarketWatchProposalsIdVoteResponse { ok: boolean; matter_id: unknown; item_id: unknown }
473
+ export interface PostMarketWatchProposalsRequest { kind: string; reason?: string; item_id?: StringifiableId; dimension?: string; value?: unknown; url?: string; log_entry_id?: StringifiableId; scout?: string; name?: string }
474
+ export interface PostMarketWatchProposalsResponse { proposal: unknown }
473
475
  export interface PostMarketWatchRulesProposalsRequest { step: string; change: Record<string, unknown>; reason: string }
474
476
  export interface PostMarketWatchRulesProposalsResponse { ok: boolean; proposal: unknown }
475
477
  export interface PostMeAnthropicLinkRequest { anthropic_email: string; anthropic_user_id: string }
@@ -1392,6 +1394,12 @@ export interface BongosClient {
1392
1394
  getMarketWatchAsk(args?: RequestArgs): Promise<GetMarketWatchAskResponse>;
1393
1395
  /** POST /market-watch/ask/answer — rank: any-builder */
1394
1396
  postMarketWatchAskAnswer(args?: RequestArgs & { body?: PostMarketWatchAskAnswerRequest }): Promise<ApiResponse>;
1397
+ /** GET /market-watch/home — rank: any-builder */
1398
+ getMarketWatchHome(args?: RequestArgs): Promise<ApiResponse>;
1399
+ /** GET /market-watch/items/{id} — rank: any-builder */
1400
+ getMarketWatchItemsId(args?: RequestArgs): Promise<ApiResponse>;
1401
+ /** POST /market-watch/proposals — rank: any-builder */
1402
+ postMarketWatchProposals(args: RequestArgs & { body: PostMarketWatchProposalsRequest }): Promise<PostMarketWatchProposalsResponse>;
1395
1403
  /** POST /market-watch/proposals/{id}/decide — rank: any-builder */
1396
1404
  postMarketWatchProposalsIdDecide(args: RequestArgs & { body: PostMarketWatchProposalsIdDecideRequest }): Promise<ApiResponse>;
1397
1405
  /** POST /market-watch/proposals/{id}/vote — rank: metic+archon */
@@ -759,6 +759,12 @@ export function createClient(opts = {}) {
759
759
  getMarketWatchAsk: (args) => request("GET", "/market-watch/ask", { hasBody: false }, args),
760
760
  // POST /market-watch/ask/answer — rank: any-builder — POST /market-watch/ask/answer
761
761
  postMarketWatchAskAnswer: (args) => request("POST", "/market-watch/ask/answer", { hasBody: true }, args),
762
+ // GET /market-watch/home — rank: any-builder — GET /market-watch/home
763
+ getMarketWatchHome: (args) => request("GET", "/market-watch/home", { hasBody: false }, args),
764
+ // GET /market-watch/items/{id} — rank: any-builder — GET /market-watch/items/:id
765
+ getMarketWatchItemsId: (args) => request("GET", "/market-watch/items/{id}", { hasBody: false }, args),
766
+ // POST /market-watch/proposals — rank: any-builder — POST /market-watch/proposals
767
+ postMarketWatchProposals: (args) => request("POST", "/market-watch/proposals", { hasBody: true }, args),
762
768
  // POST /market-watch/proposals/{id}/decide — rank: any-builder — POST /market-watch/proposals/:id/decide
763
769
  postMarketWatchProposalsIdDecide: (args) => request("POST", "/market-watch/proposals/{id}/decide", { hasBody: true }, args),
764
770
  // POST /market-watch/proposals/{id}/vote — rank: metic+archon — POST /market-watch/proposals/:id/vote
@@ -6,6 +6,7 @@
6
6
  - **Builds on:** [ADR 0341](0341-the-page-is-the-unit-of-tweak-mode.md) (Tweak Mode; D7 nothing ships without the artist's approval), [ADR 0307](0307-autobongos-a-deterministic-supervisor-and-agentic-workers.md) (Autobongos: one supervisor, one headless worker per task, a DB fence), [ADR 0369](0369-ship-mode-decides-who-starts-a-ship-not-how-it-lands.md) (a live knob in `project_settings` behind one resolver)
7
7
  - **Decided with:** the owner, 2026-09-27 ("queue now, auto later") and 2026-10-08 (write the design now, without waiting for the live artist proof, task 1004329)
8
8
  - **Amended:** 2026-10-29, [task 1005003](https://cloudbongos.com/builders#/task/1005003) — the owner raised the D5 default cap from 20 to **200** rounds a month (decision on [task 1004971](https://cloudbongos.com/builders#/task/1004971), Q7). A project can set its own cap and one cap per builder rank (`tweak.autopickup_rank_cap.<rank>`, one row per rank so two edits never overwrite each other) on the settings page. The cap for a marked claim is the claimer's rank cap when the project set one, else the project cap; it is measured against the one project-wide monthly count, under the same lock.
9
+ - **Amended:** 2026-10-30, [task 1005019](https://cloudbongos.com/builders#/task/1005019) — the owner ruled that a rank cap is a **per-person** allowance: each builder of that rank may have that many marked claims of their own this month, counted from their own claims under the same lock. The project cap still bounds the total across everyone, checked first. A rank with no cap has only the project cap. The refusal says which limit was hit (`cap_from`: `project` or `rank`).
9
10
 
10
11
  ## Context
11
12
 
@@ -14082,6 +14082,131 @@
14082
14082
  ]
14083
14083
  }
14084
14084
  },
14085
+ "/market-watch/home": {
14086
+ "get": {
14087
+ "operationId": "get_market_watch_home",
14088
+ "tags": [
14089
+ "market-watch"
14090
+ ],
14091
+ "summary": "GET /market-watch/home",
14092
+ "description": "every member reads the desk.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
14093
+ "x-rank": "any-builder",
14094
+ "x-source": "modules/market-watch/routes/pages.js",
14095
+ "responses": {
14096
+ "200": {
14097
+ "description": "Success."
14098
+ },
14099
+ "400": {
14100
+ "$ref": "#/components/responses/BadRequest"
14101
+ },
14102
+ "401": {
14103
+ "$ref": "#/components/responses/Unauthorized"
14104
+ },
14105
+ "403": {
14106
+ "$ref": "#/components/responses/Forbidden"
14107
+ }
14108
+ },
14109
+ "security": [
14110
+ {
14111
+ "builderSession": []
14112
+ }
14113
+ ]
14114
+ }
14115
+ },
14116
+ "/market-watch/items/{id}": {
14117
+ "get": {
14118
+ "operationId": "get_market_watch_items_id",
14119
+ "tags": [
14120
+ "market-watch"
14121
+ ],
14122
+ "summary": "GET /market-watch/items/:id",
14123
+ "description": "every member reads an item's case file.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
14124
+ "x-rank": "any-builder",
14125
+ "x-source": "modules/market-watch/routes/pages.js",
14126
+ "parameters": [
14127
+ {
14128
+ "name": "id",
14129
+ "in": "path",
14130
+ "required": true,
14131
+ "schema": {
14132
+ "type": "string"
14133
+ },
14134
+ "description": "Path parameter `id`."
14135
+ }
14136
+ ],
14137
+ "responses": {
14138
+ "200": {
14139
+ "description": "Success."
14140
+ },
14141
+ "400": {
14142
+ "$ref": "#/components/responses/BadRequest"
14143
+ },
14144
+ "401": {
14145
+ "$ref": "#/components/responses/Unauthorized"
14146
+ },
14147
+ "403": {
14148
+ "$ref": "#/components/responses/Forbidden"
14149
+ },
14150
+ "404": {
14151
+ "$ref": "#/components/responses/NotFound"
14152
+ }
14153
+ },
14154
+ "security": [
14155
+ {
14156
+ "builderSession": []
14157
+ }
14158
+ ]
14159
+ }
14160
+ },
14161
+ "/market-watch/proposals": {
14162
+ "post": {
14163
+ "operationId": "post_market_watch_proposals",
14164
+ "tags": [
14165
+ "market-watch"
14166
+ ],
14167
+ "summary": "POST /market-watch/proposals",
14168
+ "description": "every member may propose; the government decides (task 1004941).\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
14169
+ "x-rank": "any-builder",
14170
+ "x-source": "modules/market-watch/routes/pages.js",
14171
+ "requestBody": {
14172
+ "required": true,
14173
+ "content": {
14174
+ "application/json": {
14175
+ "schema": {
14176
+ "$ref": "#/components/schemas/PostMarketWatchProposalsRequest"
14177
+ }
14178
+ }
14179
+ },
14180
+ "x-validated": true
14181
+ },
14182
+ "responses": {
14183
+ "200": {
14184
+ "description": "Success.",
14185
+ "content": {
14186
+ "application/json": {
14187
+ "schema": {
14188
+ "$ref": "#/components/schemas/PostMarketWatchProposalsResponse"
14189
+ }
14190
+ }
14191
+ }
14192
+ },
14193
+ "400": {
14194
+ "$ref": "#/components/responses/ValidationFailed"
14195
+ },
14196
+ "401": {
14197
+ "$ref": "#/components/responses/Unauthorized"
14198
+ },
14199
+ "403": {
14200
+ "$ref": "#/components/responses/Forbidden"
14201
+ }
14202
+ },
14203
+ "security": [
14204
+ {
14205
+ "builderSession": []
14206
+ }
14207
+ ]
14208
+ }
14209
+ },
14085
14210
  "/market-watch/proposals/{id}/decide": {
14086
14211
  "post": {
14087
14212
  "operationId": "post_market_watch_proposals_id_decide",
@@ -37270,6 +37395,53 @@
37270
37395
  "item_id"
37271
37396
  ]
37272
37397
  },
37398
+ "PostMarketWatchProposalsRequest": {
37399
+ "type": "object",
37400
+ "properties": {
37401
+ "kind": {
37402
+ "type": "string"
37403
+ },
37404
+ "reason": {
37405
+ "type": "string",
37406
+ "maxLength": 2000
37407
+ },
37408
+ "item_id": {
37409
+ "$ref": "#/components/schemas/StringifiableId"
37410
+ },
37411
+ "dimension": {
37412
+ "type": "string",
37413
+ "maxLength": 60
37414
+ },
37415
+ "value": {},
37416
+ "url": {
37417
+ "type": "string",
37418
+ "maxLength": 2000
37419
+ },
37420
+ "log_entry_id": {
37421
+ "$ref": "#/components/schemas/StringifiableId"
37422
+ },
37423
+ "scout": {
37424
+ "type": "string"
37425
+ },
37426
+ "name": {
37427
+ "type": "string",
37428
+ "maxLength": 2000
37429
+ }
37430
+ },
37431
+ "required": [
37432
+ "kind"
37433
+ ],
37434
+ "additionalProperties": false
37435
+ },
37436
+ "PostMarketWatchProposalsResponse": {
37437
+ "type": "object",
37438
+ "properties": {
37439
+ "proposal": {}
37440
+ },
37441
+ "required": [
37442
+ "proposal"
37443
+ ]
37444
+ },
37273
37445
  "PostMarketWatchRulesProposalsRequest": {
37274
37446
  "type": "object",
37275
37447
  "properties": {
@@ -41107,9 +41279,9 @@
41107
41279
  "description": "A required dependency/feature is not configured or is temporarily down."
41108
41280
  }
41109
41281
  },
41110
- "x-endpoint-count": 649,
41111
- "x-schema-count": 696,
41282
+ "x-endpoint-count": 652,
41283
+ "x-schema-count": 698,
41112
41284
  "x-undocumented-bodies": 12,
41113
- "x-response-schemas": 446,
41285
+ "x-response-schemas": 447,
41114
41286
  "x-generated-by": "scripts/bongos/gen-api-docs.js"
41115
41287
  }
@@ -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. 649 endpoints across 108 route files.
5
+ > **Generated from the live route files** — the route file is authoritative. 652 endpoints across 109 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`.
@@ -520,12 +520,15 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
520
520
  | POST | `/api/bongos/llm-cache/lookup` | `metic+archon` | `cache_key`, `tokens_saved_est` | POST /llm-cache/lookup — hit/miss + atomic hit_count bump. |
521
521
  | POST | `/api/bongos/llm-cache/store` | `metic+archon` | `spec`, `result_stdout`, `result_cost_usd` | POST /llm-cache/store — upsert a freshly-produced result. |
522
522
 
523
- ## `market-watch` (10)
523
+ ## `market-watch` (13)
524
524
 
525
525
  | Method | Path | Rank | Body | Description |
526
526
  |---|---|---|---|---|
527
527
  | GET | `/api/bongos/market-watch/ask` | `any-builder` | — | every member reads their own card; nobody else's (isMember in gate()). |
528
528
  | POST | `/api/bongos/market-watch/ask/answer` | `any-builder` | `week_of`, `picks`, `names`, `nothing`, `builder_id` | a member answers for themselves only (isMember in gate()). |
529
+ | GET | `/api/bongos/market-watch/home` | `any-builder` | — | every member reads the desk. |
530
+ | GET | `/api/bongos/market-watch/items/:id` | `any-builder` | — | every member reads an item's case file. |
531
+ | POST | `/api/bongos/market-watch/proposals` | `any-builder` | `kind`, `reason`, `item_id`, `dimension`, `value`, `url`, `log_entry_id`, `scout`, `name` | every member may propose; the government decides (task 1004941). |
529
532
  | POST | `/api/bongos/market-watch/proposals/:id/decide` | `any-builder` | `decision` | THE OWNER'S DECISION. |
530
533
  | POST | `/api/bongos/market-watch/proposals/:id/vote` | `metic+archon` | — | PUT TO A VOTE. |
531
534
  | GET | `/api/bongos/market-watch/rules` | `any-builder` | — | every member reads the rules (the task); the read grants nothing. |