@bongos/core 1.25.17 → 1.25.18

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 (68) hide show
  1. package/.bongos-core.json +131 -61
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +10 -0
  4. package/clients/bongos-client/index.cjs +10 -0
  5. package/clients/bongos-client/index.d.ts +15 -1
  6. package/clients/bongos-client/index.mjs +10 -0
  7. package/docs/adr/0408-a-genesis-stage-is-three-doors-onto-one-record.md +1 -0
  8. package/docs/api/openapi.json +243 -6
  9. package/docs/api-reference.md +12 -3
  10. package/docs/copy-inventory.md +118 -108
  11. package/docs/copy-registry.json +315 -172
  12. package/docs/file-map.md +2 -1
  13. package/docs/module-api-changelog.md +2 -0
  14. package/docs/page-inventory.json +3 -0
  15. package/docs/page-readings.json +62 -62
  16. package/modules/app-host/CLAUDE.md +15 -0
  17. package/modules/app-host/module.json +20 -0
  18. package/modules/app-host/public/settings-widget.js +143 -0
  19. package/modules/app-host/routes/app-host.js +88 -0
  20. package/modules/government/charter-advice.js +103 -0
  21. package/modules/government/presets.js +42 -0
  22. package/modules/government/recommendations.js +102 -7
  23. package/modules/government/routes/government.js +1 -0
  24. package/modules/lifecycle/first-read-catalog.js +62 -0
  25. package/modules/lifecycle/first-read-db.js +47 -9
  26. package/modules/lifecycle/first-read.js +88 -23
  27. package/modules/lifecycle/migrations/lifecycle_023_repo_map_dismissed.sql +19 -0
  28. package/modules/lifecycle/routes/first-read.js +27 -5
  29. package/modules/onboarding/genesis-work.js +101 -4
  30. package/modules/onboarding/routes/genesis-work.js +2 -2
  31. package/modules/platform-identity/module.json +1 -1
  32. package/modules/platform-identity/routes/sso-app-status.js +65 -0
  33. package/modules/provisioning/module.json +1 -0
  34. package/modules/provisioning/seams.js +32 -1
  35. package/modules/provisioning/starter-bundles.js +1 -0
  36. package/modules/public-landing/public/assets/guide-core.js +475 -0
  37. package/modules/public-landing/public/assets/guide-hall.css +121 -0
  38. package/modules/public-landing/public/assets/guide-hall.js +164 -0
  39. package/modules/public-landing/public/assets/guide-scene.css +9 -0
  40. package/modules/public-landing/public/assets/guide-scene.js +58 -381
  41. package/modules/public-landing/public/index.html +46 -1
  42. package/modules/public-landing/public/projects.html +11 -2
  43. package/modules/ui-design/kit/serve.js +1 -1
  44. package/package-lock.json +2 -2
  45. package/package.json +1 -1
  46. package/release-notes.json +18 -0
  47. package/scripts/bongos/first-read.js +45 -11
  48. package/scripts/bongos/genesis.js +21 -1
  49. package/scripts/bongos/publish-manifest.js +1 -0
  50. package/scripts/bongos/seam-wiring-guard.js +3 -2
  51. package/scripts/hall-preview/server.js +2 -0
  52. package/src/bongos/auth-admission.js +64 -0
  53. package/src/bongos/auth.js +2 -1
  54. package/src/bongos/module-scope-map.js +4 -0
  55. package/src/bongos/routes/core-update.js +3 -16
  56. package/src/bongos/routes/modules.js +11 -0
  57. package/src/bongos/serve-internal.js +20 -6
  58. package/src/module-api.js +6 -1
  59. package/src/module-loader/loader.js +2 -2
  60. package/tests/app_host.mjs +413 -0
  61. package/tests/first_read.mjs +184 -8
  62. package/tests/genesis_work.mjs +74 -3
  63. package/tests/government_charter_advice.mjs +150 -0
  64. package/tests/landing_guide_hall.mjs +364 -0
  65. package/tests/landing_guide_scene.mjs +8 -5
  66. package/tests/module_api.mjs +1 -0
  67. package/tests/module_loader.mjs +1 -1
  68. package/tests/npm_release_where.mjs +13 -3
@@ -153,6 +153,10 @@ function createClient(opts = {}) {
153
153
  // GET /analytics/builder/{id} — rank: any-builder — GET /analytics/builder/:id
154
154
  getAnalyticsBuilderId: (args) => request("GET", "/analytics/builder/{id}", { hasBody: false }, args),
155
155
  },
156
+ "appHost": {
157
+ // GET /app-host — rank: any-builder — GET /app-host
158
+ getAppHost: (args) => request("GET", "/app-host", { hasBody: false }, args),
159
+ },
156
160
  "artistGate": {
157
161
  // GET /artist-gate — rank: any-builder — GET /artist-gate
158
162
  getArtistGate: (args) => request("GET", "/artist-gate", { hasBody: false }, args),
@@ -468,12 +472,16 @@ function createClient(opts = {}) {
468
472
  getFeedbackReceiptId: (args) => request("GET", "/feedback/receipt/{id}", { hasBody: false }, args),
469
473
  },
470
474
  "firstRead": {
475
+ // GET /first-read/catalog — rank: any-builder — GET /first-read/catalog
476
+ getFirstReadCatalog: (args) => request("GET", "/first-read/catalog", { hasBody: false }, args),
471
477
  // POST /first-read/maps — rank: metic+archon — POST /first-read/maps
472
478
  postFirstReadMaps: (args) => request("POST", "/first-read/maps", { hasBody: true }, args),
473
479
  // GET /first-read/maps/{id} — rank: metic+archon — GET /first-read/maps/:id
474
480
  getFirstReadMapsId: (args) => request("GET", "/first-read/maps/{id}", { hasBody: false }, args),
475
481
  // POST /first-read/maps/{id}/accept — rank: metic+archon — POST /first-read/maps/:id/accept
476
482
  postFirstReadMapsIdAccept: (args) => request("POST", "/first-read/maps/{id}/accept", { hasBody: true }, args),
483
+ // POST /first-read/maps/{id}/dismiss — rank: metic+archon — POST /first-read/maps/:id/dismiss
484
+ postFirstReadMapsIdDismiss: (args) => request("POST", "/first-read/maps/{id}/dismiss", { hasBody: true }, args),
477
485
  // POST /first-read/maps/{id}/reject — rank: metic+archon — POST /first-read/maps/:id/reject
478
486
  postFirstReadMapsIdReject: (args) => request("POST", "/first-read/maps/{id}/reject", { hasBody: true }, args),
479
487
  // GET /first-read/prompt — rank: any-builder — GET /first-read/prompt
@@ -1514,6 +1522,8 @@ function createClient(opts = {}) {
1514
1522
  "sso": {
1515
1523
  // POST /sso/activity/rollup — rank: public — POST /sso/activity/rollup
1516
1524
  postSsoActivityRollup: (args) => request("POST", "/sso/activity/rollup", { hasBody: true }, args),
1525
+ // POST /sso/app-status — rank: public — POST /sso/app-status
1526
+ postSsoAppStatus: (args) => request("POST", "/sso/app-status", { hasBody: true }, args),
1517
1527
  // POST /sso/applicant-profile — rank: public — POST /sso/applicant-profile
1518
1528
  postSsoApplicantProfile: (args) => request("POST", "/sso/applicant-profile", { hasBody: true }, args),
1519
1529
  // GET /sso/authorize — rank: public — GET /sso/authorize
@@ -75,7 +75,8 @@ export interface GetCoreUpgradesResponse { ok: boolean; running: unknown; limit:
75
75
  export interface GetDiscordChannelsPlanResponse { ok: boolean; guild_id: unknown; op_count: unknown; ops: unknown; warnings: unknown }
76
76
  export interface GetDiscordChannelsSnapshotResponse { ok: boolean; guild_id: unknown; config: unknown; warnings: unknown }
77
77
  export interface GetDoneWhenPendingReviewResponse { criteria: unknown; count: unknown }
78
- export interface GetFirstReadPromptResponse { schema: unknown; file: unknown; prompt: unknown; example: unknown; limits: unknown }
78
+ export interface GetFirstReadCatalogResponse { available: unknown; modules: unknown }
79
+ export interface GetFirstReadPromptResponse { schema: unknown; file: unknown; prompt: unknown; example: unknown; limits: unknown; catalog: unknown }
79
80
  export interface GetFrontDoorGuideMineResponse { ok: boolean; conversation: unknown }
80
81
  export interface GetGithubOrgsOrgResponse { org: unknown }
81
82
  export interface GetGithubRepoResponse { ok: boolean; repo: unknown; private_deployable: boolean }
@@ -391,6 +392,7 @@ export interface PostDoneWhenCriterionIdUnsatisfyResponse { criterion: unknown }
391
392
  export interface PostFeedbackReceiptRequest { sha256: string; kind?: "bug" | "idea" }
392
393
  export interface PostFeedbackReceiptResponse { ok: boolean; receipt: unknown; hub: unknown }
393
394
  export interface PostFirstReadMapsIdAcceptRequest { all?: boolean; items?: string[] }
395
+ export interface PostFirstReadMapsIdDismissRequest { items: string[] }
394
396
  export interface PostFirstReadMapsRequest { map: Record<string, unknown> }
395
397
  export interface PostFirstReadMapsResponse { map_id: unknown; status: unknown; items: unknown; next: unknown }
396
398
  export interface PostFoundingPlanRequest { days?: Record<string, unknown>; passes?: number; advisors?: string; government?: string; expected_builders?: number; existing?: boolean }
@@ -658,6 +660,8 @@ export interface PostSpecialitiesRequest { name: string; discipline: string; sum
658
660
  export interface PostSpecialitiesResponse { speciality: unknown }
659
661
  export interface PostSsoActivityRollupRequest { client_id: string; client_secret: string; github_id: StringifiableId; credits?: number; tasks_shipped?: number; karma?: number; rank?: string; disciplines?: unknown; recent_ships?: unknown; crafts?: unknown }
660
662
  export interface PostSsoActivityRollupResponse { ok: boolean }
663
+ export interface PostSsoAppStatusRequest { client_id: string; client_secret: string }
664
+ export interface PostSsoAppStatusResponse { ok: boolean; known: boolean; app: unknown; sandbox: unknown }
661
665
  export interface PostSsoApplicantProfileRequest { client_id: string; client_secret: string; github_id: StringifiableId }
662
666
  export interface PostSsoApplicantProfileResponse { profile: unknown; guild: unknown }
663
667
  export interface PostSsoDevicePollRequest { device_code: string }
@@ -842,6 +846,10 @@ export interface BongosClient {
842
846
  /** GET /analytics/builder/{id} — rank: any-builder */
843
847
  getAnalyticsBuilderId(args?: RequestArgs): Promise<ApiResponse>;
844
848
  };
849
+ "appHost": {
850
+ /** GET /app-host — rank: any-builder */
851
+ getAppHost(args?: RequestArgs): Promise<ApiResponse>;
852
+ };
845
853
  "artistGate": {
846
854
  /** GET /artist-gate — rank: any-builder */
847
855
  getArtistGate(args?: RequestArgs): Promise<GetArtistGateResponse>;
@@ -1157,12 +1165,16 @@ export interface BongosClient {
1157
1165
  getFeedbackReceiptId(args?: RequestArgs): Promise<ApiResponse>;
1158
1166
  };
1159
1167
  "firstRead": {
1168
+ /** GET /first-read/catalog — rank: any-builder */
1169
+ getFirstReadCatalog(args?: RequestArgs): Promise<GetFirstReadCatalogResponse>;
1160
1170
  /** POST /first-read/maps — rank: metic+archon */
1161
1171
  postFirstReadMaps(args: RequestArgs & { body: PostFirstReadMapsRequest }): Promise<PostFirstReadMapsResponse>;
1162
1172
  /** GET /first-read/maps/{id} — rank: metic+archon */
1163
1173
  getFirstReadMapsId(args?: RequestArgs): Promise<ApiResponse>;
1164
1174
  /** POST /first-read/maps/{id}/accept — rank: metic+archon */
1165
1175
  postFirstReadMapsIdAccept(args?: RequestArgs & { body?: PostFirstReadMapsIdAcceptRequest }): Promise<ApiResponse>;
1176
+ /** POST /first-read/maps/{id}/dismiss — rank: metic+archon */
1177
+ postFirstReadMapsIdDismiss(args: RequestArgs & { body: PostFirstReadMapsIdDismissRequest }): Promise<ApiResponse>;
1166
1178
  /** POST /first-read/maps/{id}/reject — rank: metic+archon */
1167
1179
  postFirstReadMapsIdReject(args?: RequestArgs): Promise<ApiResponse>;
1168
1180
  /** GET /first-read/prompt — rank: any-builder */
@@ -2203,6 +2215,8 @@ export interface BongosClient {
2203
2215
  "sso": {
2204
2216
  /** POST /sso/activity/rollup — rank: public */
2205
2217
  postSsoActivityRollup(args: RequestArgs & { body: PostSsoActivityRollupRequest }): Promise<PostSsoActivityRollupResponse>;
2218
+ /** POST /sso/app-status — rank: public */
2219
+ postSsoAppStatus(args: RequestArgs & { body: PostSsoAppStatusRequest }): Promise<PostSsoAppStatusResponse>;
2206
2220
  /** POST /sso/applicant-profile — rank: public */
2207
2221
  postSsoApplicantProfile(args: RequestArgs & { body: PostSsoApplicantProfileRequest }): Promise<PostSsoApplicantProfileResponse>;
2208
2222
  /** GET /sso/authorize — rank: public */
@@ -150,6 +150,10 @@ export function createClient(opts = {}) {
150
150
  // GET /analytics/builder/{id} — rank: any-builder — GET /analytics/builder/:id
151
151
  getAnalyticsBuilderId: (args) => request("GET", "/analytics/builder/{id}", { hasBody: false }, args),
152
152
  },
153
+ "appHost": {
154
+ // GET /app-host — rank: any-builder — GET /app-host
155
+ getAppHost: (args) => request("GET", "/app-host", { hasBody: false }, args),
156
+ },
153
157
  "artistGate": {
154
158
  // GET /artist-gate — rank: any-builder — GET /artist-gate
155
159
  getArtistGate: (args) => request("GET", "/artist-gate", { hasBody: false }, args),
@@ -465,12 +469,16 @@ export function createClient(opts = {}) {
465
469
  getFeedbackReceiptId: (args) => request("GET", "/feedback/receipt/{id}", { hasBody: false }, args),
466
470
  },
467
471
  "firstRead": {
472
+ // GET /first-read/catalog — rank: any-builder — GET /first-read/catalog
473
+ getFirstReadCatalog: (args) => request("GET", "/first-read/catalog", { hasBody: false }, args),
468
474
  // POST /first-read/maps — rank: metic+archon — POST /first-read/maps
469
475
  postFirstReadMaps: (args) => request("POST", "/first-read/maps", { hasBody: true }, args),
470
476
  // GET /first-read/maps/{id} — rank: metic+archon — GET /first-read/maps/:id
471
477
  getFirstReadMapsId: (args) => request("GET", "/first-read/maps/{id}", { hasBody: false }, args),
472
478
  // POST /first-read/maps/{id}/accept — rank: metic+archon — POST /first-read/maps/:id/accept
473
479
  postFirstReadMapsIdAccept: (args) => request("POST", "/first-read/maps/{id}/accept", { hasBody: true }, args),
480
+ // POST /first-read/maps/{id}/dismiss — rank: metic+archon — POST /first-read/maps/:id/dismiss
481
+ postFirstReadMapsIdDismiss: (args) => request("POST", "/first-read/maps/{id}/dismiss", { hasBody: true }, args),
474
482
  // POST /first-read/maps/{id}/reject — rank: metic+archon — POST /first-read/maps/:id/reject
475
483
  postFirstReadMapsIdReject: (args) => request("POST", "/first-read/maps/{id}/reject", { hasBody: true }, args),
476
484
  // GET /first-read/prompt — rank: any-builder — GET /first-read/prompt
@@ -1511,6 +1519,8 @@ export function createClient(opts = {}) {
1511
1519
  "sso": {
1512
1520
  // POST /sso/activity/rollup — rank: public — POST /sso/activity/rollup
1513
1521
  postSsoActivityRollup: (args) => request("POST", "/sso/activity/rollup", { hasBody: true }, args),
1522
+ // POST /sso/app-status — rank: public — POST /sso/app-status
1523
+ postSsoAppStatus: (args) => request("POST", "/sso/app-status", { hasBody: true }, args),
1514
1524
  // POST /sso/applicant-profile — rank: public — POST /sso/applicant-profile
1515
1525
  postSsoApplicantProfile: (args) => request("POST", "/sso/applicant-profile", { hasBody: true }, args),
1516
1526
  // GET /sso/authorize — rank: public — GET /sso/authorize
@@ -58,4 +58,5 @@ every stage, not a strategize feature that charter then copies.
58
58
  the hall version (task 1005285). Today a founder works a stage through their AI session
59
59
  and `npx bongos genesis …`.
60
60
  - Task 1005115 renders each stage's record as an editable document from this store.
61
+ - Charter adopted it (task 1005119): how decisions should go and the founder's principles. A question may declare `choices` (a closed answer, stored as its key) where another module reads the answer; the charter stage's read carries the government module's recommendation built from them.
61
62
  - Scope adopted it with the project interview (task 1005114): six questions in three groups. `/goal-create` and `/planning-session` read the answers before planning, through `genesis.js context`.
@@ -45,6 +45,10 @@
45
45
  "name": "analytics",
46
46
  "description": "Endpoints under `/api/bongos/analytics`."
47
47
  },
48
+ {
49
+ "name": "app-host",
50
+ "description": "Endpoints under `/api/bongos/app-host`."
51
+ },
48
52
  {
49
53
  "name": "artist-gate",
50
54
  "description": "Endpoints under `/api/bongos/artist-gate`."
@@ -1748,6 +1752,37 @@
1748
1752
  ]
1749
1753
  }
1750
1754
  },
1755
+ "/app-host": {
1756
+ "get": {
1757
+ "operationId": "get_app_host",
1758
+ "tags": [
1759
+ "app-host"
1760
+ ],
1761
+ "summary": "GET /app-host",
1762
+ "description": "GET /app-host — rank: any signed-in builder; owner-only parts gated on core.pin.move.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
1763
+ "x-rank": "any-builder",
1764
+ "x-source": "modules/app-host/routes/app-host.js",
1765
+ "responses": {
1766
+ "200": {
1767
+ "description": "Success."
1768
+ },
1769
+ "400": {
1770
+ "$ref": "#/components/responses/BadRequest"
1771
+ },
1772
+ "401": {
1773
+ "$ref": "#/components/responses/Unauthorized"
1774
+ },
1775
+ "403": {
1776
+ "$ref": "#/components/responses/Forbidden"
1777
+ }
1778
+ },
1779
+ "security": [
1780
+ {
1781
+ "builderSession": []
1782
+ }
1783
+ ]
1784
+ }
1785
+ },
1751
1786
  "/artist-gate": {
1752
1787
  "get": {
1753
1788
  "operationId": "get_artist_gate",
@@ -7613,6 +7648,44 @@
7613
7648
  "security": []
7614
7649
  }
7615
7650
  },
7651
+ "/first-read/catalog": {
7652
+ "get": {
7653
+ "operationId": "get_first_read_catalog",
7654
+ "tags": [
7655
+ "first-read"
7656
+ ],
7657
+ "summary": "GET /first-read/catalog",
7658
+ "description": "the modules this project can switch on, the only ones a map may recommend. `available: false` when the list cannot be read here.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
7659
+ "x-rank": "any-builder",
7660
+ "x-source": "modules/lifecycle/routes/first-read.js",
7661
+ "responses": {
7662
+ "200": {
7663
+ "description": "Success.",
7664
+ "content": {
7665
+ "application/json": {
7666
+ "schema": {
7667
+ "$ref": "#/components/schemas/GetFirstReadCatalogResponse"
7668
+ }
7669
+ }
7670
+ }
7671
+ },
7672
+ "400": {
7673
+ "$ref": "#/components/responses/BadRequest"
7674
+ },
7675
+ "401": {
7676
+ "$ref": "#/components/responses/Unauthorized"
7677
+ },
7678
+ "403": {
7679
+ "$ref": "#/components/responses/Forbidden"
7680
+ }
7681
+ },
7682
+ "security": [
7683
+ {
7684
+ "builderSession": []
7685
+ }
7686
+ ]
7687
+ }
7688
+ },
7616
7689
  "/first-read/maps": {
7617
7690
  "post": {
7618
7691
  "operationId": "post_first_read_maps",
@@ -7772,6 +7845,65 @@
7772
7845
  ]
7773
7846
  }
7774
7847
  },
7848
+ "/first-read/maps/{id}/dismiss": {
7849
+ "post": {
7850
+ "operationId": "post_first_read_maps_id_dismiss",
7851
+ "tags": [
7852
+ "first-read"
7853
+ ],
7854
+ "summary": "POST /first-read/maps/:id/dismiss",
7855
+ "description": ".create — the owner's no to named items (a module recommendation, usually). Files nothing; a later \"accept all\" passes them by.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `goal.create` (all required).",
7856
+ "x-rank": "metic+archon",
7857
+ "x-source": "modules/lifecycle/routes/first-read.js",
7858
+ "x-permissions": [
7859
+ "goal.create"
7860
+ ],
7861
+ "parameters": [
7862
+ {
7863
+ "name": "id",
7864
+ "in": "path",
7865
+ "required": true,
7866
+ "schema": {
7867
+ "type": "string"
7868
+ },
7869
+ "description": "Path parameter `id`."
7870
+ }
7871
+ ],
7872
+ "requestBody": {
7873
+ "required": true,
7874
+ "content": {
7875
+ "application/json": {
7876
+ "schema": {
7877
+ "$ref": "#/components/schemas/PostFirstReadMapsIdDismissRequest"
7878
+ }
7879
+ }
7880
+ },
7881
+ "x-validated": true
7882
+ },
7883
+ "responses": {
7884
+ "200": {
7885
+ "description": "Success."
7886
+ },
7887
+ "400": {
7888
+ "$ref": "#/components/responses/ValidationFailed"
7889
+ },
7890
+ "401": {
7891
+ "$ref": "#/components/responses/Unauthorized"
7892
+ },
7893
+ "403": {
7894
+ "$ref": "#/components/responses/Forbidden"
7895
+ },
7896
+ "404": {
7897
+ "$ref": "#/components/responses/NotFound"
7898
+ }
7899
+ },
7900
+ "security": [
7901
+ {
7902
+ "builderSession": []
7903
+ }
7904
+ ]
7905
+ }
7906
+ },
7775
7907
  "/first-read/maps/{id}/reject": {
7776
7908
  "post": {
7777
7909
  "operationId": "post_first_read_maps_id_reject",
@@ -7827,7 +7959,7 @@
7827
7959
  "first-read"
7828
7960
  ],
7829
7961
  "summary": "GET /first-read/prompt",
7830
- "description": "the prompt and the shape are instructions, not project data.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
7962
+ "description": "the prompt and the shape are instructions, not project data. The prompt carries the live module list (task 1005281), so a session recommends from it.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
7831
7963
  "x-rank": "any-builder",
7832
7964
  "x-source": "modules/lifecycle/routes/first-read.js",
7833
7965
  "responses": {
@@ -29282,6 +29414,45 @@
29282
29414
  "security": []
29283
29415
  }
29284
29416
  },
29417
+ "/sso/app-status": {
29418
+ "post": {
29419
+ "operationId": "post_sso_app_status",
29420
+ "tags": [
29421
+ "sso"
29422
+ ],
29423
+ "summary": "POST /sso/app-status",
29424
+ "description": "authenticated by client_id + client_secret, not a builder rank.\n\n**Rank:** `public` — No authentication — any caller.",
29425
+ "x-rank": "public",
29426
+ "x-source": "modules/platform-identity/routes/sso-app-status.js",
29427
+ "requestBody": {
29428
+ "required": true,
29429
+ "content": {
29430
+ "application/json": {
29431
+ "schema": {
29432
+ "$ref": "#/components/schemas/PostSsoAppStatusRequest"
29433
+ }
29434
+ }
29435
+ },
29436
+ "x-validated": true
29437
+ },
29438
+ "responses": {
29439
+ "200": {
29440
+ "description": "Success.",
29441
+ "content": {
29442
+ "application/json": {
29443
+ "schema": {
29444
+ "$ref": "#/components/schemas/PostSsoAppStatusResponse"
29445
+ }
29446
+ }
29447
+ }
29448
+ },
29449
+ "400": {
29450
+ "$ref": "#/components/responses/ValidationFailed"
29451
+ }
29452
+ },
29453
+ "security": []
29454
+ }
29455
+ },
29285
29456
  "/sso/applicant-profile": {
29286
29457
  "post": {
29287
29458
  "operationId": "post_sso_applicant_profile",
@@ -34664,6 +34835,17 @@
34664
34835
  "count"
34665
34836
  ]
34666
34837
  },
34838
+ "GetFirstReadCatalogResponse": {
34839
+ "type": "object",
34840
+ "properties": {
34841
+ "available": {},
34842
+ "modules": {}
34843
+ },
34844
+ "required": [
34845
+ "available",
34846
+ "modules"
34847
+ ]
34848
+ },
34667
34849
  "GetFirstReadPromptResponse": {
34668
34850
  "type": "object",
34669
34851
  "properties": {
@@ -34671,14 +34853,16 @@
34671
34853
  "file": {},
34672
34854
  "prompt": {},
34673
34855
  "example": {},
34674
- "limits": {}
34856
+ "limits": {},
34857
+ "catalog": {}
34675
34858
  },
34676
34859
  "required": [
34677
34860
  "schema",
34678
34861
  "file",
34679
34862
  "prompt",
34680
34863
  "example",
34681
- "limits"
34864
+ "limits",
34865
+ "catalog"
34682
34866
  ]
34683
34867
  },
34684
34868
  "GetFrontDoorGuideMineResponse": {
@@ -39192,6 +39376,22 @@
39192
39376
  },
39193
39377
  "additionalProperties": false
39194
39378
  },
39379
+ "PostFirstReadMapsIdDismissRequest": {
39380
+ "type": "object",
39381
+ "properties": {
39382
+ "items": {
39383
+ "type": "array",
39384
+ "items": {
39385
+ "type": "string"
39386
+ },
39387
+ "maxItems": 500
39388
+ }
39389
+ },
39390
+ "required": [
39391
+ "items"
39392
+ ],
39393
+ "additionalProperties": false
39394
+ },
39195
39395
  "PostFirstReadMapsRequest": {
39196
39396
  "type": "object",
39197
39397
  "properties": {
@@ -43544,6 +43744,43 @@
43544
43744
  "ok"
43545
43745
  ]
43546
43746
  },
43747
+ "PostSsoAppStatusRequest": {
43748
+ "type": "object",
43749
+ "properties": {
43750
+ "client_id": {
43751
+ "type": "string",
43752
+ "maxLength": 200
43753
+ },
43754
+ "client_secret": {
43755
+ "type": "string",
43756
+ "maxLength": 512
43757
+ }
43758
+ },
43759
+ "required": [
43760
+ "client_id",
43761
+ "client_secret"
43762
+ ],
43763
+ "additionalProperties": false
43764
+ },
43765
+ "PostSsoAppStatusResponse": {
43766
+ "type": "object",
43767
+ "properties": {
43768
+ "ok": {
43769
+ "type": "boolean"
43770
+ },
43771
+ "known": {
43772
+ "type": "boolean"
43773
+ },
43774
+ "app": {},
43775
+ "sandbox": {}
43776
+ },
43777
+ "required": [
43778
+ "ok",
43779
+ "known",
43780
+ "app",
43781
+ "sandbox"
43782
+ ]
43783
+ },
43547
43784
  "PostSsoApplicantProfileRequest": {
43548
43785
  "type": "object",
43549
43786
  "properties": {
@@ -45306,9 +45543,9 @@
45306
45543
  "description": "A required dependency/feature is not configured or is temporarily down."
45307
45544
  }
45308
45545
  },
45309
- "x-endpoint-count": 725,
45310
- "x-schema-count": 755,
45546
+ "x-endpoint-count": 729,
45547
+ "x-schema-count": 759,
45311
45548
  "x-undocumented-bodies": 12,
45312
- "x-response-schemas": 471,
45549
+ "x-response-schemas": 473,
45313
45550
  "x-generated-by": "scripts/bongos/gen-api-docs.js"
45314
45551
  }
@@ -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. 725 endpoints across 122 route files.
5
+ > **Generated from the live route files** — the route file is authoritative. 729 endpoints across 124 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`.
@@ -66,6 +66,12 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
66
66
  |---|---|---|---|---|
67
67
  | GET | `/api/bongos/analytics/builder/:id` | `any-builder` | — | a builder's historical AI dev curve. |
68
68
 
69
+ ## `app-host` (1)
70
+
71
+ | Method | Path | Rank | Body | Description |
72
+ |---|---|---|---|---|
73
+ | GET | `/api/bongos/app-host` | `any-builder` | — | GET /app-host — rank: any signed-in builder; owner-only parts gated on core.pin.move. |
74
+
69
75
  ## `artist-gate` (1)
70
76
 
71
77
  | Method | Path | Rank | Body | Description |
@@ -315,13 +321,15 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
315
321
  | POST | `/api/bongos/feedback/receipt` | `any-builder` | `sha256`, `kind` | signed-in builder — a receipt only says "this builder sent this text"; it grants nothing here, and the hub files every report behind a nod. |
316
322
  | GET | `/api/bongos/feedback/receipt/:id` | `public` | — | the hub redeems a receipt with no session of its own. |
317
323
 
318
- ## `first-read` (5)
324
+ ## `first-read` (7)
319
325
 
320
326
  | Method | Path | Rank | Body | Description |
321
327
  |---|---|---|---|---|
328
+ | GET | `/api/bongos/first-read/catalog` | `any-builder` | — | the modules this project can switch on, the only ones a map may recommend. |
322
329
  | POST | `/api/bongos/first-read/maps` | `metic+archon` | `map` | .create — a map is a planning proposal for this project. |
323
330
  | GET | `/api/bongos/first-read/maps/:id` | `metic+archon` | — | .create — the review is for whoever may accept or reject it. |
324
331
  | POST | `/api/bongos/first-read/maps/:id/accept` | `metic+archon` | `all`, `items` | .create + act-alone planning — the owner's yes. |
332
+ | POST | `/api/bongos/first-read/maps/:id/dismiss` | `metic+archon` | `items` | .create — the owner's no to named items (a module recommendation, usually). |
325
333
  | POST | `/api/bongos/first-read/maps/:id/reject` | `metic+archon` | — | .create — the owner's no. |
326
334
  | GET | `/api/bongos/first-read/prompt` | `any-builder` | — | the prompt and the shape are instructions, not project data. |
327
335
 
@@ -1041,11 +1049,12 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
1041
1049
  | GET | `/api/bongos/specialities/installed-skills` | `any-builder` | — | GET /specialities/installed-skills — every skill THIS instance has, each explained the way the adoption walkthrough explains it, so a spe… |
1042
1050
  | GET | `/api/bongos/specialities/offered` | `any-builder` | — | GET /specialities/offered — the suggestions for THIS builder. |
1043
1051
 
1044
- ## `sso` (12)
1052
+ ## `sso` (13)
1045
1053
 
1046
1054
  | Method | Path | Rank | Body | Description |
1047
1055
  |---|---|---|---|---|
1048
1056
  | POST | `/api/bongos/sso/activity/rollup` | `public` | `client_id`, `client_secret`, `github_id`, `credits`, `tasks_shipped`, `karma`, `rank`, `disciplines`, `recent_ships`, `crafts` | POST /sso/activity/rollup — a federated instance reports a builder's activity snapshot (ADR 0141 §4). |
1057
+ | POST | `/api/bongos/sso/app-status` | `public` | `client_id`, `client_secret` | authenticated by client_id + client_secret, not a builder rank. |
1049
1058
  | POST | `/api/bongos/sso/applicant-profile` | `public` | `client_id`, `client_secret`, `github_id` | POST /sso/applicant-profile — a federated instance resolves ONE applicant's profile view for its own reviewer queue, LIVE at render (priv… |
1050
1059
  | GET | `/api/bongos/sso/authorize` | `public` | — | GET /sso/authorize?client_id=&redirect_uri=&state= — the browser authorize leg. |
1051
1060
  | POST | `/api/bongos/sso/device/poll` | `public` | `device_code` | POST /sso/device/poll — poll the hub device flow. |