@bongos/core 1.17.0
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 +5727 -0
- package/.claude/skills/blocker-review/SKILL.md +91 -0
- package/.claude/skills/blocker-solve/SKILL.md +96 -0
- package/.claude/skills/builder-backup/SKILL.md +54 -0
- package/.claude/skills/builder-box/SKILL.md +45 -0
- package/.claude/skills/builder-claim/SKILL.md +76 -0
- package/.claude/skills/builder-connect/SKILL.md +59 -0
- package/.claude/skills/builder-cost/SKILL.md +47 -0
- package/.claude/skills/builder-end/SKILL.md +81 -0
- package/.claude/skills/builder-exit/SKILL.md +88 -0
- package/.claude/skills/builder-key/SKILL.md +40 -0
- package/.claude/skills/builder-reauth/SKILL.md +50 -0
- package/.claude/skills/builder-redteam/SKILL.md +109 -0
- package/.claude/skills/builder-release/SKILL.md +41 -0
- package/.claude/skills/builder-setup/SKILL.md +62 -0
- package/.claude/skills/builder-ship/SKILL.md +79 -0
- package/.claude/skills/builder-stage/SKILL.md +51 -0
- package/.claude/skills/builder-start/SKILL.md +46 -0
- package/.claude/skills/close-box/SKILL.md +43 -0
- package/.claude/skills/design-sync/SKILL.md +69 -0
- package/.claude/skills/dev/SKILL.md +49 -0
- package/.claude/skills/feedback/SKILL.md +32 -0
- package/.claude/skills/figma-design-sync/SKILL.md +74 -0
- package/.claude/skills/goal-review/SKILL.md +89 -0
- package/.claude/skills/idea-triage/SKILL.md +144 -0
- package/.claude/skills/ideate/SKILL.md +82 -0
- package/.claude/skills/merge-mode/SKILL.md +169 -0
- package/.claude/skills/new-project/SKILL.md +108 -0
- package/.claude/skills/otb-character-review/SKILL.md +71 -0
- package/.claude/skills/otb-design-review/SKILL.md +47 -0
- package/.claude/skills/otb-feedback-capture/SKILL.md +45 -0
- package/.claude/skills/otb-figma-sync/SKILL.md +54 -0
- package/.claude/skills/otb-tile-generate/SKILL.md +45 -0
- package/.claude/skills/paint/SKILL.md +70 -0
- package/.claude/skills/planning-session/SKILL.md +299 -0
- package/.claude/skills/priority-session/SKILL.md +134 -0
- package/.claude/skills/read-session-export/SKILL.md +58 -0
- package/.claude/skills/recall/SKILL.md +52 -0
- package/.claude/skills/session-handoff/SKILL.md +46 -0
- package/.claude/skills/status/SKILL.md +33 -0
- package/.devcontainer/Dockerfile +69 -0
- package/.devcontainer/README.md +73 -0
- package/.devcontainer/devcontainer-lock.json +19 -0
- package/.devcontainer/devcontainer.json +93 -0
- package/.devcontainer/healthcheck.sh +84 -0
- package/.devcontainer/init-firewall.sh +198 -0
- package/.devcontainer/post-create.sh +153 -0
- package/.dockerignore +36 -0
- package/.env.local.example +32 -0
- package/.gitattributes +83 -0
- package/.gitignore +91 -0
- package/CLAUDE.md +242 -0
- package/CODE_OF_CONDUCT.md +46 -0
- package/CONTRIBUTING.md +51 -0
- package/Dockerfile +46 -0
- package/GOVERNANCE.md +44 -0
- package/LICENSE +661 -0
- package/README.md +88 -0
- package/bin/bongos.js +222 -0
- package/clients/bongos-client/README.md +48 -0
- package/clients/bongos-client/bongos-client.global.js +617 -0
- package/clients/bongos-client/examples/hello-world.mjs +62 -0
- package/clients/bongos-client/index.cjs +619 -0
- package/clients/bongos-client/index.d.ts +793 -0
- package/clients/bongos-client/index.mjs +614 -0
- package/clients/bongos-client/package.json +32 -0
- package/config/branding.neutral.json +60 -0
- package/config/design-tokens.neutral.json +51 -0
- package/config/design-tokens.schema.json +96 -0
- package/config/modules.neutral.json +9 -0
- package/docker-compose.yml +52 -0
- package/docker-entrypoint.sh +30 -0
- package/docs/adr/0001-stack-choice-single-vps.md +45 -0
- package/docs/adr/0002-digitalocean-over-hetzner.md +27 -0
- package/docs/adr/0003-cloudflare-origin-cert-over-letsencrypt.md +35 -0
- package/docs/adr/0004-amazonprimea-name-and-trademark-acceptance.md +45 -0
- package/docs/adr/0005-invisible-other-players-in-v1.md +37 -0
- package/docs/adr/0006-singleton-worldroom-plus-queueroom.md +30 -0
- package/docs/adr/0007-persistent-identity-via-localstorage-uuid.md +31 -0
- package/docs/adr/0008-family-based-tile-generation.md +86 -0
- package/docs/adr/0008-google-chat-oauth-user-auth.md +37 -0
- package/docs/adr/0009-autotile-architecture.md +181 -0
- package/docs/adr/0010-pms-architecture.md +70 -0
- package/docs/adr/0011-terrain-id-rendering-model.md +174 -0
- package/docs/adr/0012-ground-object-cell-split.md +208 -0
- package/docs/adr/0013-paths-as-object-overlays-with-autotile-dispatch.md +158 -0
- package/docs/adr/0014-families-canonical-over-vocabulary.md +103 -0
- package/docs/adr/0015-task-dependencies-and-auto-promotion.md +125 -0
- package/docs/adr/0016-trust-boundary-server-enforced-permissions.md +132 -0
- package/docs/adr/0017-code-simplification-and-repo-cleanliness.md +74 -0
- package/docs/adr/0018-three-rank-model-goes-live.md +97 -0
- package/docs/adr/0019-red-team-bounty-payout-table.md +52 -0
- package/docs/adr/0020-security-model-public-stub.md +70 -0
- package/docs/adr/0021-per-builder-skill-model-preferences.md +99 -0
- package/docs/adr/0022-secrets-policy.md +124 -0
- package/docs/adr/0023-kind-multipliers-and-idea-bonus.md +118 -0
- package/docs/adr/0024-cloneable-repo-local-first-memory.md +277 -0
- package/docs/adr/0024-multi-agent-system-architecture.md +125 -0
- package/docs/adr/0025-offsite-backup-vendor-digitalocean-spaces.md +59 -0
- package/docs/adr/0025-structured-criterion-task-link.md +44 -0
- package/docs/adr/0026-bfg-memory-hygiene-and-cross-builder-learning.md +117 -0
- package/docs/adr/0027-bfg-session-inefficiency-evaluator.md +170 -0
- package/docs/adr/0028-honest-llm-spend-accounting.md +109 -0
- package/docs/adr/0029-status-page-outage-resilience.md +59 -0
- package/docs/adr/0030-builders-hall-live-updates.md +59 -0
- package/docs/adr/0031-cloud-dev-environments-for-builders.md +222 -0
- package/docs/adr/0032-discord-mirror-of-gds.md +50 -0
- package/docs/adr/0033-discord-bot-service-principal.md +82 -0
- package/docs/adr/0034-thetes-graduated-newcomer-rank.md +53 -0
- package/docs/adr/0035-builder-onboarding-three-paths.md +128 -0
- package/docs/adr/0036-builders-subdomain-and-ui-reorg.md +40 -0
- package/docs/adr/0037-discord-channel-management.md +51 -0
- package/docs/adr/0038-chromebook-ttyd-cloudflare-tunnel.md +111 -0
- package/docs/adr/0039-setup-first-onboarding-ux.md +49 -0
- package/docs/adr/0040-remote-control-default-browser-onramp.md +47 -0
- package/docs/adr/0041-temporary-grader-bypass-killswitch.md +40 -0
- package/docs/adr/0042-builder-self-deploy-ci-auto-merge.md +82 -0
- package/docs/adr/0043-git-ssh-trust-boundary-and-rank-floor-on-permission-paths.md +74 -0
- package/docs/adr/0044-mediterranean-palette-replacement.md +73 -0
- package/docs/adr/0044-per-box-live-game-preview.md +57 -0
- package/docs/adr/0045-devbox-desktop-app.md +133 -0
- package/docs/adr/0046-sandbox-first-review-gate.md +72 -0
- package/docs/adr/0047-discord-bugs-intake-anti-abuse.md +36 -0
- package/docs/adr/0048-works-in-progress-ia-split.md +32 -0
- package/docs/adr/0049-split-parallel-safety-contract.md +46 -0
- package/docs/adr/0050-device-flow-admission-invite-gated-by-default.md +43 -0
- package/docs/adr/0051-full-session-transcript-corpus.md +57 -0
- package/docs/adr/0052-sandbox-for-everyone-game-only-preview.md +70 -0
- package/docs/adr/0053-scoped-dev-box-session.md +55 -0
- package/docs/adr/0054-session-token-reward-cost-plus.md +63 -0
- package/docs/adr/0055-server-mediated-branch-publish.md +47 -0
- package/docs/adr/0056-prod-deploy-script-mirror-and-healthcheck-retry.md +62 -0
- package/docs/adr/0057-container-cost-ledger.md +28 -0
- package/docs/adr/0057-discord-archon-approval-channels.md +64 -0
- package/docs/adr/0058-automatic-gate-surface-gatekeeper.md +64 -0
- package/docs/adr/0059-single-approval-remove-devbox-approval-gate.md +37 -0
- package/docs/adr/0060-gds-retrieval-layer.md +97 -0
- package/docs/adr/0061-context-layer-decomposition.md +61 -0
- package/docs/adr/0062-medusa-instance-model-decoupling.md +107 -0
- package/docs/adr/0063-generated-repo-map-symbol-skeleton.md +44 -0
- package/docs/adr/0064-rename-medusa-to-cloud-bongos.md +49 -0
- package/docs/adr/0065-agpl-nonprofit-ai-first-governance.md +69 -0
- package/docs/adr/0066-generated-file-map-sections.md +51 -0
- package/docs/adr/0067-session-start-fast-forward-pull.md +43 -0
- package/docs/adr/0068-shared-art-key-for-newcomers.md +38 -0
- package/docs/adr/0069-hall-live-channel-sse-decouple.md +35 -0
- package/docs/adr/0070-deterministic-session-card-delivery.md +44 -0
- package/docs/adr/0071-box-confirm-before-destroyed-and-drift-reconcile.md +59 -0
- package/docs/adr/0072-bongos-app-mac-signed-first-windows-deferred.md +35 -0
- package/docs/adr/0072-dev-box-code-staleness-visibility.md +39 -0
- package/docs/adr/0073-builder-needs-signal-and-byok-gemini-key.md +64 -0
- package/docs/adr/0073-secrets-scan-exclude-uri-detector.md +37 -0
- package/docs/adr/0074-memory-map-stays-light.md +32 -0
- package/docs/adr/0075-per-system-cost-attribution.md +37 -0
- package/docs/adr/0076-in-session-deterministic-compaction.md +58 -0
- package/docs/adr/0077-content-addressed-llm-cache.md +32 -0
- package/docs/adr/0078-deterministic-first-cron.md +48 -0
- package/docs/adr/0079-value-gated-autonomous-engagement.md +39 -0
- package/docs/adr/0080-llm-cache-api-transport-and-trust-model.md +46 -0
- package/docs/adr/0081-tool-agnostic-design-layer.md +62 -0
- package/docs/adr/0082-productized-key-storage-provisioning.md +32 -0
- package/docs/adr/0082-server-side-merge-conflict-auto-resolution.md +55 -0
- package/docs/adr/0083-modular-architecture-strangler-build-plan.md +143 -0
- package/docs/adr/0084-auto-derived-per-task-rank-floor.md +86 -0
- package/docs/adr/0085-remove-default-per-builder-spend-cap.md +39 -0
- package/docs/adr/0086-goal-scoped-work-hierarchy.md +123 -0
- package/docs/adr/0087-bongos-app-architecture-and-handoff-contract.md +49 -0
- package/docs/adr/0087-compete-on-governance-not-tooling-cursor.md +65 -0
- package/docs/adr/0088-consistent-character-generative-animation.md +169 -0
- package/docs/adr/0089-modular-multi-model-adversarial-grader.md +179 -0
- package/docs/adr/0090-metic-task-authoring.md +73 -0
- package/docs/adr/0091-bounding-the-kernel-and-db-carve.md +106 -0
- package/docs/adr/0092-hosting-module-and-on-prem-target.md +117 -0
- package/docs/adr/0093-tranche-2-core-carve-sequence.md +72 -0
- package/docs/adr/0094-repo-atlas-self-drawing-codebase-map.md +49 -0
- package/docs/adr/0095-borrowed-memory-and-retrieval-concepts.md +65 -0
- package/docs/adr/0095-cross-agent-context-management.md +58 -0
- package/docs/adr/0096-require-reward-before-workable.md +209 -0
- package/docs/adr/0097-one-active-claim-per-session-and-worktree-binding.md +46 -0
- package/docs/adr/0097-retroactive-reward-backfill.md +124 -0
- package/docs/adr/0098-public-mirror-publish-manifest.md +92 -0
- package/docs/adr/0099-delayed-redacted-mirror-export.md +55 -0
- package/docs/adr/0100-two-repo-instance-model.md +60 -0
- package/docs/adr/0101-goal-hierarchy-phase-5-judge-membership-reward.md +90 -0
- package/docs/adr/0102-finish-bounding-the-kernel.md +36 -0
- package/docs/adr/0103-core-first-extraction-cloud-bongos-trunk.md +70 -0
- package/docs/adr/0103-gdsv4-bongos-consolidation.md +28 -0
- package/docs/adr/0104-trust-gds-api-channel-in-auto-mode.md +42 -0
- package/docs/adr/0105-instance-seed-migrations-out-of-core.md +47 -0
- package/docs/adr/0106-goal-owner-manager-authority.md +84 -0
- package/docs/adr/0107-module-upstreaming-contribution-to-core-catalog.md +83 -0
- package/docs/adr/0108-instance-composition-configurable-root.md +87 -0
- package/docs/adr/0109-self-describing-openapi-and-hosted-docs.md +44 -0
- package/docs/adr/0110-untrack-whole-file-generated-nav-docs.md +49 -0
- package/docs/adr/0111-instance-hosting-provisioning-module.md +135 -0
- package/docs/adr/0112-private-goals-invitations-join-requests.md +72 -0
- package/docs/adr/0113-sandbox-studio-descope-superseded-by-0044-0052.md +41 -0
- package/docs/adr/0114-instance-docs-discovery-contract.md +32 -0
- package/docs/adr/0115-scheduled-routines-portability.md +31 -0
- package/docs/adr/0116-api-error-envelope-and-code-taxonomy.md +62 -0
- package/docs/adr/0117-api-versioning-and-deprecation-policy.md +50 -0
- package/docs/adr/0118-api-contract-source-of-truth-code-first.md +47 -0
- package/docs/adr/0119-api-pagination-contract.md +34 -0
- package/docs/adr/0120-pay-on-land-and-builder-owned-rebase-gate.md +108 -0
- package/docs/adr/0121-greenfield-vs-brownfield-onboarding-adopt-existing-repo.md +97 -0
- package/docs/adr/0122-onboarding-diagram-renders-deploy-rendered-off-git.md +43 -0
- package/docs/adr/0123-box-idle-sweep-autosave-before-destroy.md +36 -0
- package/docs/adr/0124-typed-api-response-bodies.md +37 -0
- package/docs/adr/0125-control-plane-scaffolds-standalone-instance-repo.md +36 -0
- package/docs/adr/0126-dedicated-cloudbongos-control-plane-droplet.md +30 -0
- package/docs/adr/0127-cross-box-fleet-observability.md +64 -0
- package/docs/adr/0128-provisioning-runner-privilege-and-db-auth-model.md +46 -0
- package/docs/adr/0129-cloudbongos-control-plane-pull-deploy.md +34 -0
- package/docs/adr/0130-provision-remote-exec-over-ssh.md +61 -0
- package/docs/adr/0131-rank-scoped-skill-visibility.md +47 -0
- package/docs/adr/0132-cohost-fleet-control-plane-migration.md +54 -0
- package/docs/adr/0133-github-app-manifest-onboarding-signin.md +42 -0
- package/docs/adr/0134-private-first-npm-distribution.md +38 -0
- package/docs/adr/README.md +208 -0
- package/docs/api/openapi.json +13720 -0
- package/docs/api-reference.md +437 -0
- package/docs/architecture.md +244 -0
- package/docs/branding-contract.md +66 -0
- package/docs/branding-fill-prompt.md +25 -0
- package/docs/canonical-permissions.md +241 -0
- package/docs/design/container-exterior-tiles.md +49 -0
- package/docs/design/container-exterior.md +81 -0
- package/docs/design/container-interior.md +77 -0
- package/docs/design/modular-architecture/00-research-report.md +107 -0
- package/docs/design/modular-architecture/01-architecture.md +125 -0
- package/docs/design/modular-architecture/02-module-map.md +116 -0
- package/docs/design/modular-architecture/03-builder-flows.md +104 -0
- package/docs/design/modular-architecture/04-module-lifecycle.md +62 -0
- package/docs/design/modular-architecture/README.md +27 -0
- package/docs/design/vanilla-hall-ui-redesign-scope.md +284 -0
- package/docs/design/world-map-scroll.md +41 -0
- package/docs/design-contract.md +320 -0
- package/docs/file-map.md +418 -0
- package/docs/handoff-template.md +92 -0
- package/docs/modules-contract.md +293 -0
- package/docs/onboarding/browser-terminal-guide.md +73 -0
- package/docs/onboarding/diagrams/01-task-lifecycle.mmd +28 -0
- package/docs/onboarding/diagrams/02-rank-ladder.mmd +54 -0
- package/docs/onboarding/diagrams/03-drachmae-karma.mmd +37 -0
- package/docs/onboarding/diagrams/04-architecture.mmd +51 -0
- package/docs/onboarding/diagrams/05-versioning.mmd +29 -0
- package/docs/onboarding/diagrams/README.md +94 -0
- package/docs/onboarding/diagrams/assertions.json +170 -0
- package/docs/onboarding/diagrams/puppeteer-config.json +1 -0
- package/docs/onboarding/diagrams/render-config.json +9 -0
- package/docs/onboarding/drachmae-and-karma.md +178 -0
- package/docs/onboarding/primer.md +202 -0
- package/docs/project-context.template.md +67 -0
- package/docs/recipes/README.md +35 -0
- package/docs/recipes/audit-replay.md +100 -0
- package/docs/recipes/bongos-cli-release.md +66 -0
- package/docs/recipes/builder-box-lifecycle.md +152 -0
- package/docs/recipes/claude-design-loop.md +143 -0
- package/docs/recipes/claude-gemini-bongos-doors.md +155 -0
- package/docs/recipes/cloudbongos-staging-gate.md +139 -0
- package/docs/recipes/cloudbongos-standup.md +111 -0
- package/docs/recipes/devbox-app-release.md +93 -0
- package/docs/recipes/devbox-app-windows-test.md +128 -0
- package/docs/recipes/failed-ship-recovery-proof.md +102 -0
- package/docs/recipes/figma-design-loop.md +129 -0
- package/docs/recipes/gds-db-backup.md +255 -0
- package/docs/recipes/instance-deploy.md +37 -0
- package/docs/recipes/managed-settings-remote-control.md +416 -0
- package/docs/recipes/memory-backup.md +71 -0
- package/docs/recipes/memory-sync-conflicts.md +98 -0
- package/docs/recipes/multi-builder-merge.md +78 -0
- package/docs/recipes/ops-gotchas.md +212 -0
- package/docs/recipes/overnight-builder.md +53 -0
- package/docs/recipes/packaging-the-core.md +49 -0
- package/docs/recipes/parallel-load-results-2026-05-30.md +63 -0
- package/docs/recipes/parallel-load-test.md +32 -0
- package/docs/recipes/pixel-art-pipeline.md +411 -0
- package/docs/recipes/private-npm-distribution.md +79 -0
- package/docs/recipes/search-index-ingestion.md +67 -0
- package/docs/recipes/self-host.md +60 -0
- package/docs/recipes/ship-and-regrade.md +72 -0
- package/docs/recipes/staging-data.md +50 -0
- package/docs/recipes/staging-environment.md +215 -0
- package/docs/recipes/upgrading-the-core.md +58 -0
- package/docs/research/cursor-competitive-analysis.md +255 -0
- package/docs/research/llm-model-agnostic-and-cheaper-grader.md +227 -0
- package/migrations/003_pms.sql +284 -0
- package/migrations/004_pms_cost_idempotency.sql +13 -0
- package/migrations/005_pms_smoke_filter.sql +44 -0
- package/migrations/006_pms_v2.sql +378 -0
- package/migrations/007_pms_v2_hierarchy_trigger.sql +59 -0
- package/migrations/008_pms_v2_migration_allocator.sql +27 -0
- package/migrations/009_pms_v2_blockers_table.sql +68 -0
- package/migrations/010_uptime.sql +29 -0
- package/migrations/011_backfill_v2_v3_done_when.sql +20 -0
- package/migrations/012_pms_v2_task_lifecycle_states.sql +82 -0
- package/migrations/013_claim_locking.sql +22 -0
- package/migrations/014_pms_task_discipline.sql +86 -0
- package/migrations/015_pms_estimation_calibration.sql +140 -0
- package/migrations/016_pms_task_grades.sql +60 -0
- package/migrations/017_version_progress_exclude_abandoned.sql +49 -0
- package/migrations/019_rename_pms_v3_to_gds_v3.sql +65 -0
- package/migrations/020_task_dependencies.sql +99 -0
- package/migrations/021_v3_renumber_and_deps.sql +224 -0
- package/migrations/022_v3_reconcile_dep_gated_status.sql +41 -0
- package/migrations/023_pms_rank.sql +30 -0
- package/migrations/025_builder_exit_status.sql +15 -0
- package/migrations/027_builders_preferred_disciplines.sql +46 -0
- package/migrations/028_tasks_parallel_safe.sql +71 -0
- package/migrations/029_rank_three_live.sql +32 -0
- package/migrations/030_vulnerability_reports.sql +61 -0
- package/migrations/031_reward_simplification.sql +57 -0
- package/migrations/032_repo_health_snapshots.sql +56 -0
- package/migrations/033_audit_log.sql +64 -0
- package/migrations/034_lifecycle_breakdown_leaf_only.sql +62 -0
- package/migrations/035_auth_token_hygiene.sql +66 -0
- package/migrations/037_builder_skill_model_prefs.sql +44 -0
- package/migrations/038_task_override_requests.sql +51 -0
- package/migrations/039_newcomer_friendly_column.sql +124 -0
- package/migrations/040_builder_karma.sql +58 -0
- package/migrations/041_kind_multipliers_and_idea_bonus.sql +42 -0
- package/migrations/042_criterion_proposal_workflow.sql +78 -0
- package/migrations/043_builder_onboarding_observability.sql +66 -0
- package/migrations/044_tasks_requires_rank.sql +97 -0
- package/migrations/045_builder_onboarding_state.sql +147 -0
- package/migrations/046_cost_log_builder_attribution.sql +42 -0
- package/migrations/054_builder_memory.sql +108 -0
- package/migrations/055_task_criteria.sql +90 -0
- package/migrations/058_peer_votes.sql +41 -0
- package/migrations/059_onboarding_pick_disciplines.sql +59 -0
- package/migrations/060_access_requests.sql +46 -0
- package/migrations/061_backfill_override_ship_attribution.sql +29 -0
- package/migrations/062_session_records.sql +34 -0
- package/migrations/063_session_records_tool_errors_idx.sql +11 -0
- package/migrations/064_grade_attempts.sql +18 -0
- package/migrations/065_bfg_principal.sql +58 -0
- package/migrations/066_live_notify_triggers.sql +69 -0
- package/migrations/067_builder_boxes.sql +117 -0
- package/migrations/067_discord_bot_foundation.sql +69 -0
- package/migrations/068_thetes_requires_rank.sql +27 -0
- package/migrations/069_builder_ssh_keys.sql +66 -0
- package/migrations/070_box_intents.sql +101 -0
- package/migrations/071_box_first_provision_approval.sql +46 -0
- package/migrations/072_onboarding_ship_three_remove_primer.sql +80 -0
- package/migrations/073_box_terminal_access.sql +46 -0
- package/migrations/075_builder_sound_prefs.sql +28 -0
- package/migrations/078_box_claude_active.sql +22 -0
- package/migrations/079_box_first_connected_at.sql +20 -0
- package/migrations/081_tasks_needs_migration.sql +34 -0
- package/migrations/084_tasks_security_sensitive.sql +24 -0
- package/migrations/085_security_engagement_docs.sql +34 -0
- package/migrations/086_rename_disciplines.sql +125 -0
- package/migrations/088_builders_anthropic_link.sql +28 -0
- package/migrations/089_builders_monthly_budget.sql +19 -0
- package/migrations/090_box_scoped_sessions.sql +38 -0
- package/migrations/091_session_token_reward.sql +44 -0
- package/migrations/093_tasks_sandbox_review.sql +22 -0
- package/migrations/102_remove_box_first_provision_approval.sql +58 -0
- package/migrations/103_search_chunks.sql +90 -0
- package/migrations/104_builder_box_blocked.sql +34 -0
- package/migrations/105_box_host_keys.sql +35 -0
- package/migrations/111_medusa_customer0_framing.sql +35 -0
- package/migrations/112_drop_track_check.sql +25 -0
- package/migrations/113_merge_lease.sql +16 -0
- package/migrations/114_cloudbongos_rename_live_strings.sql +32 -0
- package/migrations/118_currency_label_decoupling.sql +23 -0
- package/migrations/119_builder_behavior_prefs.sql +31 -0
- package/migrations/121_box_code_version.sql +37 -0
- package/migrations/122_builder_gemini_key.sql +30 -0
- package/migrations/123_cost_log_tiers.sql +33 -0
- package/migrations/124_cost_baseline.sql +45 -0
- package/migrations/125_llm_cache.sql +54 -0
- package/migrations/126_autonomy_runs.sql +33 -0
- package/migrations/143_cost_calibration.sql +63 -0
- package/migrations/145_backfill_task_requires_rank.sql +84 -0
- package/migrations/160_goal_tier.sql +88 -0
- package/migrations/163_polymorphic_dependencies.sql +187 -0
- package/migrations/164_event_sound_prefs.sql +20 -0
- package/migrations/165_task_module_key.sql +15 -0
- package/migrations/171_claims_published_head_sha.sql +24 -0
- package/migrations/174_close_orphaned_claims_on_terminal_tasks.sql +30 -0
- package/migrations/175_task_grades_diff_hash.sql +9 -0
- package/migrations/176_promotion_respects_open_blockers.sql +58 -0
- package/migrations/176_ui_discipline.sql +40 -0
- package/migrations/177_require_reward_before_workable.sql +76 -0
- package/migrations/178_reward_gate_auto_assign_revert_autopromote.sql +61 -0
- package/migrations/179_search_chunk_usefulness.sql +33 -0
- package/migrations/180_one_active_claim_per_session.sql +54 -0
- package/migrations/181_cost_log_skill_name.sql +33 -0
- package/migrations/184_claim_release_requested.sql +25 -0
- package/migrations/185_module_upstreaming_goal_wiring.sql +59 -0
- package/migrations/187_goal_sort_order.sql +30 -0
- package/migrations/187_tasks_kind_check_add_verify.sql +21 -0
- package/migrations/README.md +88 -0
- package/migrations/core_188_goal_visibility_and_membership_requests.sql +71 -0
- package/migrations/core_189_core_upgrades_ledger.sql +37 -0
- package/migrations/core_189_credit_log_task_id_index.sql +19 -0
- package/migrations/core_190_rebuild_claimable_task_views.sql +71 -0
- package/migrations/instance/018_pms_v3_planning_seed.sql +131 -0
- package/migrations/instance/080_gds_v4_planning_seed.sql +75 -0
- package/migrations/instance/110_medusa_planning_seed.sql +70 -0
- package/migrations/instance/120_bongos_v1_planning_seed.sql +69 -0
- package/migrations/instance/144_bongos_v1_module_system_criterion.sql +26 -0
- package/migrations/instance/159_bongos_v1_goal_hierarchy_criterion.sql +29 -0
- package/migrations/instance/172_v2_world_planning_seed.sql +163 -0
- package/migrations/instance/173_bongos_v1_c7_core_modularized.sql +33 -0
- package/migrations/instance/182_gdsv4_bongos_consolidation.sql +132 -0
- package/migrations/instance/183_gdsv4_carryover_themed_goals.sql +116 -0
- package/migrations/instance/186_bongos_v1_governance_planning_seed.sql +69 -0
- package/modules/autonomy/CLAUDE.md +49 -0
- package/modules/autonomy/db.js +50 -0
- package/modules/autonomy/module.json +13 -0
- package/modules/autonomy/pollers/routine-timers.js +146 -0
- package/modules/autonomy/routes/autonomy.js +37 -0
- package/modules/builder-settings/CLAUDE.md +58 -0
- package/modules/builder-settings/builder-needs.js +115 -0
- package/modules/builder-settings/db.js +168 -0
- package/modules/builder-settings/display-name.js +84 -0
- package/modules/builder-settings/event-sound-prefs.js +169 -0
- package/modules/builder-settings/interaction-prefs.js +201 -0
- package/modules/builder-settings/model-alloc-prefs.js +147 -0
- package/modules/builder-settings/module.json +10 -0
- package/modules/builder-settings/render-prefs.js +103 -0
- package/modules/builder-settings/routes/settings.js +417 -0
- package/modules/builder-settings/settings.js +52 -0
- package/modules/builder-settings/skill-prefs.js +196 -0
- package/modules/builder-settings/sound-prefs.js +178 -0
- package/modules/builder-settings/wandering-prefs.js +282 -0
- package/modules/dev-box/CLAUDE.md +38 -0
- package/modules/dev-box/box-access.js +275 -0
- package/modules/dev-box/box-credential.js +94 -0
- package/modules/dev-box/box-onboard.js +486 -0
- package/modules/dev-box/boxes.js +842 -0
- package/modules/dev-box/db.js +39 -0
- package/modules/dev-box/module.json +14 -0
- package/modules/dev-box/routes/box.js +977 -0
- package/modules/discord/CLAUDE.md +50 -0
- package/modules/discord/auth.js +54 -0
- package/modules/discord/bug-attachments.js +210 -0
- package/modules/discord/db.js +96 -0
- package/modules/discord/discord-approvals.js +145 -0
- package/modules/discord/discord-audit.js +29 -0
- package/modules/discord/discord-bot.js +545 -0
- package/modules/discord/discord-bugs.js +257 -0
- package/modules/discord/discord-channels.js +412 -0
- package/modules/discord/discord-inbound.js +147 -0
- package/modules/discord/discord-message-buffer.js +54 -0
- package/modules/discord/discord-reaction.js +186 -0
- package/modules/discord/discord-role-sync.js +318 -0
- package/modules/discord/module.json +14 -0
- package/modules/discord/pollers/discord-bot.js +19 -0
- package/modules/discord/routes/bug-attachments.js +44 -0
- package/modules/discord/routes/discord.js +102 -0
- package/modules/discord/ship-broadcast.js +78 -0
- package/modules/discord/webhook.js +74 -0
- package/modules/economy/CLAUDE.md +48 -0
- package/modules/economy/achievements.js +594 -0
- package/modules/economy/cost-classify.js +331 -0
- package/modules/economy/cost-summary-shape.js +90 -0
- package/modules/economy/cost.js +438 -0
- package/modules/economy/credits.js +430 -0
- package/modules/economy/migrations/economy_001_fix_gds_shipper_description.sql +91 -0
- package/modules/economy/module.json +10 -0
- package/modules/economy/reward.js +61 -0
- package/modules/economy/routes/cost.js +97 -0
- package/modules/economy/routes/leaderboard.js +26 -0
- package/modules/economy/routes/reward.js +42 -0
- package/modules/economy/streak.js +285 -0
- package/modules/grading/CLAUDE.md +42 -0
- package/modules/grading/db.js +39 -0
- package/modules/grading/grader-rubric.json +151 -0
- package/modules/grading/grader-workers/efficiency.js +213 -0
- package/modules/grading/grader-workers/extract-json.js +80 -0
- package/modules/grading/grader-workers/fence.js +100 -0
- package/modules/grading/grader-workers/hacker.js +239 -0
- package/modules/grading/grader-workers/index.js +183 -0
- package/modules/grading/grader-workers/narc.js +207 -0
- package/modules/grading/grader-workers/quality.js +198 -0
- package/modules/grading/grader-workers/rubric.js +20 -0
- package/modules/grading/grader-workers/worker-prompt.js +89 -0
- package/modules/grading/grader-workers/worker-verdict.js +50 -0
- package/modules/grading/grader.js +1790 -0
- package/modules/grading/module.json +12 -0
- package/modules/grading/routes/grade.js +51 -0
- package/modules/hall-ui/CLAUDE.md +61 -0
- package/modules/hall-ui/module.json +14 -0
- package/modules/hall-ui/public/atlas.html +180 -0
- package/modules/hall-ui/public/atlas.js +336 -0
- package/modules/hall-ui/public/box-panel.js +423 -0
- package/modules/hall-ui/public/brand-apply.js +117 -0
- package/modules/hall-ui/public/builders.js +3028 -0
- package/modules/hall-ui/public/chime.wav +0 -0
- package/modules/hall-ui/public/copy-on-click.js +174 -0
- package/modules/hall-ui/public/cursors/arrow.png +0 -0
- package/modules/hall-ui/public/cursors/hand-pointer.png +0 -0
- package/modules/hall-ui/public/cursors/magnifier-out.png +0 -0
- package/modules/hall-ui/public/cursors/magnifier.png +0 -0
- package/modules/hall-ui/public/diagram-viewer.css +125 -0
- package/modules/hall-ui/public/diagram-viewer.js +330 -0
- package/modules/hall-ui/public/diagrams.html +113 -0
- package/modules/hall-ui/public/dom-utils.js +212 -0
- package/modules/hall-ui/public/drachmae.html +68 -0
- package/modules/hall-ui/public/drachmae.js +136 -0
- package/modules/hall-ui/public/gate.html +143 -0
- package/modules/hall-ui/public/gate.js +228 -0
- package/modules/hall-ui/public/goals-page.js +1297 -0
- package/modules/hall-ui/public/goals.html +376 -0
- package/modules/hall-ui/public/goals.js +119 -0
- package/modules/hall-ui/public/hall-widgets.js +189 -0
- package/modules/hall-ui/public/harbor.html +167 -0
- package/modules/hall-ui/public/harbor.js +335 -0
- package/modules/hall-ui/public/index.html +116 -0
- package/modules/hall-ui/public/instances-panel.js +172 -0
- package/modules/hall-ui/public/md-reader.js +234 -0
- package/modules/hall-ui/public/modules.html +119 -0
- package/modules/hall-ui/public/modules.js +154 -0
- package/modules/hall-ui/public/new-project-wizard.js +186 -0
- package/modules/hall-ui/public/not-ready.html +48 -0
- package/modules/hall-ui/public/pair.html +119 -0
- package/modules/hall-ui/public/pair.js +132 -0
- package/modules/hall-ui/public/primer.css +404 -0
- package/modules/hall-ui/public/primer.html +85 -0
- package/modules/hall-ui/public/primer.js +641 -0
- package/modules/hall-ui/public/profile.html +85 -0
- package/modules/hall-ui/public/profile.js +236 -0
- package/modules/hall-ui/public/ranks.html +69 -0
- package/modules/hall-ui/public/ranks.js +206 -0
- package/modules/hall-ui/public/roadmap.html +209 -0
- package/modules/hall-ui/public/roadmap.js +375 -0
- package/modules/hall-ui/public/sessions.html +92 -0
- package/modules/hall-ui/public/sessions.js +222 -0
- package/modules/hall-ui/public/settings.html +640 -0
- package/modules/hall-ui/public/settings.js +1219 -0
- package/modules/hall-ui/public/shell.js +495 -0
- package/modules/hall-ui/public/style.css +1748 -0
- package/modules/hall-ui/public/task-detail.js +253 -0
- package/modules/hall-ui/public/task.html +83 -0
- package/modules/hall-ui/public/task.js +326 -0
- package/modules/hall-ui/public/watch.html +333 -0
- package/modules/hall-ui/public/watch.js +859 -0
- package/modules/hall-ui/public/work.html +469 -0
- package/modules/hall-ui/public/work.js +1292 -0
- package/modules/ideas/CLAUDE.md +37 -0
- package/modules/ideas/blockers.js +100 -0
- package/modules/ideas/inbox.js +459 -0
- package/modules/ideas/module.json +10 -0
- package/modules/ideas/routes/blockers.js +120 -0
- package/modules/ideas/routes/inbox.js +230 -0
- package/modules/lifecycle/CLAUDE.md +63 -0
- package/modules/lifecycle/conflict-resolve.js +436 -0
- package/modules/lifecycle/db.js +4970 -0
- package/modules/lifecycle/done-when.js +355 -0
- package/modules/lifecycle/github-push.js +969 -0
- package/modules/lifecycle/goal-conflicts.js +133 -0
- package/modules/lifecycle/hierarchy.js +104 -0
- package/modules/lifecycle/lifecycle.js +58 -0
- package/modules/lifecycle/merge-lock.js +261 -0
- package/modules/lifecycle/migrations/lifecycle_001_goal_first_leads.sql +28 -0
- package/modules/lifecycle/migrations/lifecycle_002_backfill_orphan_task_goals.sql +36 -0
- package/modules/lifecycle/module.json +13 -0
- package/modules/lifecycle/pollers/publish-reconciler.js +20 -0
- package/modules/lifecycle/publish-reconciler.js +418 -0
- package/modules/lifecycle/routes/analytics.js +63 -0
- package/modules/lifecycle/routes/claims.js +506 -0
- package/modules/lifecycle/routes/dependencies.js +82 -0
- package/modules/lifecycle/routes/done-when.js +136 -0
- package/modules/lifecycle/routes/gate-approvals.js +197 -0
- package/modules/lifecycle/routes/goals.js +1419 -0
- package/modules/lifecycle/routes/lifecycle.js +43 -0
- package/modules/lifecycle/routes/tasks.js +1703 -0
- package/modules/lifecycle/routes/versions.js +128 -0
- package/modules/lifecycle/ship-card.js +505 -0
- package/modules/lifecycle/ship-preflight.js +225 -0
- package/modules/lifecycle/task-classifier.js +512 -0
- package/modules/lifecycle/version-close.js +106 -0
- package/modules/memory/CLAUDE.md +40 -0
- package/modules/memory/learnings.js +275 -0
- package/modules/memory/memory.js +572 -0
- package/modules/memory/module.json +12 -0
- package/modules/memory/routes/learnings.js +90 -0
- package/modules/memory/routes/memory.js +916 -0
- package/modules/memory/routes/search.js +188 -0
- package/modules/memory/search-chunker.js +252 -0
- package/modules/memory/search.js +320 -0
- package/modules/onboarding/CLAUDE.md +55 -0
- package/modules/onboarding/approval-broadcast.js +59 -0
- package/modules/onboarding/db.js +54 -0
- package/modules/onboarding/module.json +10 -0
- package/modules/onboarding/newcomer-restock.js +212 -0
- package/modules/onboarding/onboarding-state.js +532 -0
- package/modules/onboarding/onboarding.js +508 -0
- package/modules/onboarding/port.js +63 -0
- package/modules/onboarding/routes/access-requests.js +208 -0
- package/modules/onboarding/routes/onboarding.js +54 -0
- package/modules/security/CLAUDE.md +44 -0
- package/modules/security/module.json +10 -0
- package/modules/security/routes/reports.js +251 -0
- package/modules/security/secret-scrub.js +201 -0
- package/modules/security/security.js +294 -0
- package/modules/sessions/CLAUDE.md +39 -0
- package/modules/sessions/bfg.js +357 -0
- package/modules/sessions/db.js +326 -0
- package/modules/sessions/module.json +10 -0
- package/modules/sessions/pulse.js +149 -0
- package/modules/sessions/routes/sessions.js +331 -0
- package/modules/status-ui/CLAUDE.md +47 -0
- package/modules/status-ui/module.json +14 -0
- package/modules/status-ui/public/README.md +29 -0
- package/modules/status-ui/public/cursors/arrow.png +0 -0
- package/modules/status-ui/public/cursors/hand-pointer.png +0 -0
- package/modules/status-ui/public/index.html +363 -0
- package/modules/status-ui/public/snapshots/.gitkeep +0 -0
- package/modules/status-ui/public/status.js +1375 -0
- package/modules/status-ui/public/style.css +1342 -0
- package/package-lock.json +975 -0
- package/package.json +28 -0
- package/public-docs/index.html +35 -0
- package/public-docs/redoc.standalone.js +1838 -0
- package/public-docs/redoc.standalone.js.LICENSE.txt +102 -0
- package/public-landing/buddha.png +0 -0
- package/public-landing/create.html +868 -0
- package/public-landing/index.html +168 -0
- package/scripts/bongos-mcp.js +28 -0
- package/scripts/cron/style_guide_audit.sh +134 -0
- package/scripts/discord/README.md +52 -0
- package/scripts/discord/lib.js +80 -0
- package/scripts/discord/post.js +51 -0
- package/scripts/gds/CLAUDE.md +144 -0
- package/scripts/gds/abandon.js +58 -0
- package/scripts/gds/adopt-detect.js +123 -0
- package/scripts/gds/adopt-import.js +111 -0
- package/scripts/gds/adopt-preflight.js +121 -0
- package/scripts/gds/api.js +78 -0
- package/scripts/gds/architect-audit.js +288 -0
- package/scripts/gds/art-stage.js +152 -0
- package/scripts/gds/audit-authorship.sh +243 -0
- package/scripts/gds/audit-deps.js +121 -0
- package/scripts/gds/audit-exports.js +128 -0
- package/scripts/gds/audit-replay.sh +161 -0
- package/scripts/gds/audit-ships.js +251 -0
- package/scripts/gds/autonomy-gate.js +135 -0
- package/scripts/gds/backfill-cost.js +165 -0
- package/scripts/gds/backfill-sessions.js +351 -0
- package/scripts/gds/backfill-task-rewards.js +408 -0
- package/scripts/gds/backup.js +94 -0
- package/scripts/gds/bfg-principal-token.js +65 -0
- package/scripts/gds/box-auth-check.js +160 -0
- package/scripts/gds/box-connect-lib.js +453 -0
- package/scripts/gds/box.js +1258 -0
- package/scripts/gds/build-bongos.js +94 -0
- package/scripts/gds/capture.js +123 -0
- package/scripts/gds/cf-tunnel.js +419 -0
- package/scripts/gds/ci-grade.js +82 -0
- package/scripts/gds/claim-recall.js +112 -0
- package/scripts/gds/claim.js +333 -0
- package/scripts/gds/classify-discipline.js +153 -0
- package/scripts/gds/claude-materialize.js +176 -0
- package/scripts/gds/cleanup-orphans.js +74 -0
- package/scripts/gds/cli-lib.js +518 -0
- package/scripts/gds/code.js +101 -0
- package/scripts/gds/codemod-rename-src-gds.js +145 -0
- package/scripts/gds/conductor-dispatch.js +426 -0
- package/scripts/gds/context-pack.js +228 -0
- package/scripts/gds/coreB-carve-proof.sh +716 -0
- package/scripts/gds/cost.js +47 -0
- package/scripts/gds/db-backup-nightly.sh +160 -0
- package/scripts/gds/db-backup-offsite.sh +152 -0
- package/scripts/gds/demote.js +40 -0
- package/scripts/gds/design-sync.js +62 -0
- package/scripts/gds/diagnose-achievements.js +118 -0
- package/scripts/gds/diagram-facts.js +319 -0
- package/scripts/gds/discipline-modes.json +25 -0
- package/scripts/gds/discord-channels.js +66 -0
- package/scripts/gds/do-api.js +176 -0
- package/scripts/gds/docs-entropy.js +403 -0
- package/scripts/gds/doctor.js +389 -0
- package/scripts/gds/feedback-latest.js +94 -0
- package/scripts/gds/fetch-art-key.js +106 -0
- package/scripts/gds/fetch-sound-prefs.js +88 -0
- package/scripts/gds/figma-design-sync.js +61 -0
- package/scripts/gds/fitness.js +1446 -0
- package/scripts/gds/gate-review.js +322 -0
- package/scripts/gds/gating.js +325 -0
- package/scripts/gds/gds-db-backup.service +24 -0
- package/scripts/gds/gds-db-backup.timer +20 -0
- package/scripts/gds/gds-db-offsite.service +29 -0
- package/scripts/gds/gds-db-offsite.timer +18 -0
- package/scripts/gds/gen-api-client.js +508 -0
- package/scripts/gds/gen-api-docs.js +1037 -0
- package/scripts/gds/gen-atlas.js +366 -0
- package/scripts/gds/gen-diagrams.js +608 -0
- package/scripts/gds/gen-file-map.js +196 -0
- package/scripts/gds/gen-repo-map.js +519 -0
- package/scripts/gds/gen-session-index.js +210 -0
- package/scripts/gds/git-merge-regen.js +147 -0
- package/scripts/gds/grade-smoke.js +205 -0
- package/scripts/gds/hooks/pre-push.js +169 -0
- package/scripts/gds/http-api-client.js +88 -0
- package/scripts/gds/init.js +903 -0
- package/scripts/gds/install-git-hooks.js +114 -0
- package/scripts/gds/key-card.js +213 -0
- package/scripts/gds/key-status.js +126 -0
- package/scripts/gds/land-watch.js +168 -0
- package/scripts/gds/learning-capture.js +145 -0
- package/scripts/gds/lib.sh +44 -0
- package/scripts/gds/linkify-refs.js +473 -0
- package/scripts/gds/local-preview-lib.js +159 -0
- package/scripts/gds/local-preview.js +95 -0
- package/scripts/gds/login.js +225 -0
- package/scripts/gds/main-audit.js +279 -0
- package/scripts/gds/me.js +88 -0
- package/scripts/gds/memory-map.js +174 -0
- package/scripts/gds/merge-lock.js +71 -0
- package/scripts/gds/migration-namespace.js +200 -0
- package/scripts/gds/mirror-lineage-check.js +319 -0
- package/scripts/gds/mirror-redact.js +305 -0
- package/scripts/gds/module.js +482 -0
- package/scripts/gds/newcomer-floor.config.json +13 -0
- package/scripts/gds/newcomer-floor.js +415 -0
- package/scripts/gds/newcomer-floor.templates.json +86 -0
- package/scripts/gds/newcomer-floor.test.js +235 -0
- package/scripts/gds/next-number.js +163 -0
- package/scripts/gds/oauth-secret.js +197 -0
- package/scripts/gds/onboard.js +217 -0
- package/scripts/gds/onboarding-analyze.js +226 -0
- package/scripts/gds/onboarding-config.js +178 -0
- package/scripts/gds/onboarding-ship.js +92 -0
- package/scripts/gds/package-core.js +684 -0
- package/scripts/gds/paste-token.js +131 -0
- package/scripts/gds/portability-smoke-art.sh +85 -0
- package/scripts/gds/portability-smoke-memory.sh +147 -0
- package/scripts/gds/provision.js +1324 -0
- package/scripts/gds/publish-manifest.js +307 -0
- package/scripts/gds/pulse.js +309 -0
- package/scripts/gds/push-main.js +45 -0
- package/scripts/gds/read-session-export.js +359 -0
- package/scripts/gds/reauth.js +149 -0
- package/scripts/gds/recall.js +135 -0
- package/scripts/gds/release.js +71 -0
- package/scripts/gds/render-ideas.js +173 -0
- package/scripts/gds/repo-metrics.js +363 -0
- package/scripts/gds/resolve-skill-model.js +57 -0
- package/scripts/gds/run-routine.js +197 -0
- package/scripts/gds/run-unit-tests.js +178 -0
- package/scripts/gds/sandbox-stage.js +653 -0
- package/scripts/gds/search-ingest-db.js +209 -0
- package/scripts/gds/search-ingest-md.js +225 -0
- package/scripts/gds/security-baseline-check.sh +180 -0
- package/scripts/gds/seed-adopt-tasks.js +75 -0
- package/scripts/gds/seed-api-contract-goal-tasks.js +141 -0
- package/scripts/gds/seed-bongos-app-tasks.js +294 -0
- package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +81 -0
- package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +100 -0
- package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +307 -0
- package/scripts/gds/seed-bongos-module-system-tasks.js +346 -0
- package/scripts/gds/seed-bongos-tasks.js +214 -0
- package/scripts/gds/seed-gds-v4-tasks.js +624 -0
- package/scripts/gds/seed-governance-tasks.js +340 -0
- package/scripts/gds/seed-medusa-tasks.js +440 -0
- package/scripts/gds/seed-module-upstreaming.js +219 -0
- package/scripts/gds/seed-productization-tasks.js +235 -0
- package/scripts/gds/seed-provisioning-tasks.js +83 -0
- package/scripts/gds/seed-staging.sh +104 -0
- package/scripts/gds/seed-v2-world-tasks.js +283 -0
- package/scripts/gds/seed-v3-tasks.js +1981 -0
- package/scripts/gds/session-cost.js +393 -0
- package/scripts/gds/session-digest.js +179 -0
- package/scripts/gds/session-eval.js +576 -0
- package/scripts/gds/session.js +404 -0
- package/scripts/gds/setup.js +504 -0
- package/scripts/gds/shell.js +100 -0
- package/scripts/gds/ship.js +3618 -0
- package/scripts/gds/smoke-batch-claim.sh +213 -0
- package/scripts/gds/smoke-batch-release.sh +296 -0
- package/scripts/gds/smoke-box.sh +150 -0
- package/scripts/gds/smoke-claim-consistency.sh +212 -0
- package/scripts/gds/smoke-dependencies.sh +84 -0
- package/scripts/gds/smoke-gds.js +125 -0
- package/scripts/gds/smoke-write.sh +168 -0
- package/scripts/gds/start.js +782 -0
- package/scripts/gds/status.js +365 -0
- package/scripts/gds/triage.js +366 -0
- package/scripts/gds/upgrade.js +421 -0
- package/scripts/gds/validate-design.js +254 -0
- package/scripts/gds/version-close.js +549 -0
- package/scripts/migrate.sh +183 -0
- package/scripts/migrate_cost_ledger.sh +178 -0
- package/scripts/public-mirror-export.js +291 -0
- package/scripts/render-diagrams.sh +88 -0
- package/scripts/security/dep-audit.js +276 -0
- package/scripts/setup-builder.js +274 -0
- package/scripts/setup-builder.sh +28 -0
- package/scripts/snapshots/backfill-history.mjs +292 -0
- package/scripts/snapshots/maybe-render-on-deploy.sh +66 -0
- package/scripts/snapshots/render-pre-art-eras.mjs +329 -0
- package/scripts/snapshots/render-world.mjs +322 -0
- package/scripts/status-mirror-sync.js +192 -0
- package/scripts/status-probe.mjs +185 -0
- package/server.js +212 -0
- package/src/asset-version.js +71 -0
- package/src/bongos/CLAUDE.md +64 -0
- package/src/bongos/api-errors.js +281 -0
- package/src/bongos/api-path-404.js +67 -0
- package/src/bongos/api-prefix.js +38 -0
- package/src/bongos/app-pair.js +172 -0
- package/src/bongos/auth.js +979 -0
- package/src/bongos/cascade-dispatch.js +123 -0
- package/src/bongos/db-kernel.js +252 -0
- package/src/bongos/db.js +911 -0
- package/src/bongos/goal-scope-check.js +120 -0
- package/src/bongos/hierarchy-config.js +189 -0
- package/src/bongos/live-channel.js +145 -0
- package/src/bongos/llm-cache.js +260 -0
- package/src/bongos/llm-pricing.js +220 -0
- package/src/bongos/metrics.js +286 -0
- package/src/bongos/middleware/audit.js +274 -0
- package/src/bongos/middleware/error-envelope.js +93 -0
- package/src/bongos/middleware/rate-limit.js +195 -0
- package/src/bongos/module-scope-map.js +271 -0
- package/src/bongos/optimizer.js +166 -0
- package/src/bongos/path-match.js +47 -0
- package/src/bongos/permission-path-check.js +248 -0
- package/src/bongos/pool.js +55 -0
- package/src/bongos/repo-info.js +91 -0
- package/src/bongos/route-rank-check.js +420 -0
- package/src/bongos/routes/CLAUDE.md +43 -0
- package/src/bongos/routes/_helpers.js +369 -0
- package/src/bongos/routes/audit-log.js +59 -0
- package/src/bongos/routes/auth.js +755 -0
- package/src/bongos/routes/backup.js +104 -0
- package/src/bongos/routes/builders.js +526 -0
- package/src/bongos/routes/healthz.js +16 -0
- package/src/bongos/routes/instance.js +129 -0
- package/src/bongos/routes/live.js +125 -0
- package/src/bongos/routes/llm-cache.js +119 -0
- package/src/bongos/routes/me.js +380 -0
- package/src/bongos/routes/modules.js +131 -0
- package/src/bongos/routes/optimizer.js +54 -0
- package/src/bongos/routes/public.js +476 -0
- package/src/bongos/routes/security.js +207 -0
- package/src/bongos/routes.js +166 -0
- package/src/bongos/secret-box.js +177 -0
- package/src/bongos/sensitive-surfaces.js +30 -0
- package/src/bongos/serve-internal.js +889 -0
- package/src/bongos/uptime-poller.js +90 -0
- package/src/bongos-downloads.js +70 -0
- package/src/branding.js +182 -0
- package/src/build-info.js +77 -0
- package/src/devbox-downloads.js +67 -0
- package/src/instance-config.js +200 -0
- package/src/module-api.js +366 -0
- package/src/module-loader/loader.js +268 -0
- package/src/module-loader/manifest-schema.js +140 -0
- package/src/module-loader/provenance.js +28 -0
- package/src/module-loader/semver.js +100 -0
- package/src/module-seams.js +291 -0
- package/src/modules.js +254 -0
- package/src/platform-server.js +135 -0
- package/src/ui/adapters/claude-design/index.js +333 -0
- package/src/ui/adapters/figma/index.js +328 -0
- package/tests/abandon_task.mjs +138 -0
- package/tests/achievements_reconcile.mjs +167 -0
- package/tests/adopt_detect.mjs +141 -0
- package/tests/adopt_import.mjs +132 -0
- package/tests/adopt_preflight.mjs +105 -0
- package/tests/anti_grid.mjs +89 -0
- package/tests/api_client.mjs +231 -0
- package/tests/api_docs.mjs +283 -0
- package/tests/api_error_envelope_buildcheck.mjs +56 -0
- package/tests/api_error_envelope_middleware.mjs +99 -0
- package/tests/api_error_registry.mjs +108 -0
- package/tests/api_pagination_contract.mjs +51 -0
- package/tests/api_path_404.mjs +96 -0
- package/tests/app_pair.mjs +168 -0
- package/tests/architect.mjs +140 -0
- package/tests/art_key.mjs +121 -0
- package/tests/art_stage.mjs +121 -0
- package/tests/asset_version.mjs +94 -0
- package/tests/atlas.mjs +69 -0
- package/tests/audit_deps.mjs +74 -0
- package/tests/audit_middleware.mjs +385 -0
- package/tests/auth_admission_gate.mjs +164 -0
- package/tests/auth_anthropic_identity.mjs +95 -0
- package/tests/auth_duplicate_cookie.mjs +56 -0
- package/tests/auth_error_brand.mjs +77 -0
- package/tests/auth_flow_slice1.mjs +223 -0
- package/tests/auth_inactive_builder.mjs +94 -0
- package/tests/auth_page_gate.mjs +92 -0
- package/tests/auth_session_ttl.mjs +155 -0
- package/tests/autonomous_fit_protected_paths.mjs +115 -0
- package/tests/autonomy_gate.mjs +85 -0
- package/tests/autotile_variants.mjs +256 -0
- package/tests/autotile_xverify.mjs +133 -0
- package/tests/backfill_sessions.mjs +101 -0
- package/tests/backfill_task_rewards.mjs +152 -0
- package/tests/backup_cli.mjs +104 -0
- package/tests/bfg.mjs +327 -0
- package/tests/bfg_write.mjs +423 -0
- package/tests/bongos_box_connect.mjs +89 -0
- package/tests/bongos_dispatch.mjs +74 -0
- package/tests/bongos_downloads.mjs +118 -0
- package/tests/bongos_login.mjs +34 -0
- package/tests/box_access.mjs +186 -0
- package/tests/box_auth_check.mjs +114 -0
- package/tests/box_code_staleness.mjs +116 -0
- package/tests/box_connect_e2e.mjs +196 -0
- package/tests/box_cost.mjs +70 -0
- package/tests/box_dns_repoint.mjs +151 -0
- package/tests/box_host_keys.mjs +102 -0
- package/tests/box_onboard.mjs +317 -0
- package/tests/box_scope_session.mjs +115 -0
- package/tests/box_ship_permissions.mjs +71 -0
- package/tests/box_terminal_ssrf.mjs +90 -0
- package/tests/boxes.mjs +1255 -0
- package/tests/branding.mjs +88 -0
- package/tests/bug_attachments.mjs +189 -0
- package/tests/build_info.mjs +88 -0
- package/tests/builder_needs.mjs +99 -0
- package/tests/cap_newcomer_tasks.mjs +114 -0
- package/tests/cascade-dispatch.mjs +95 -0
- package/tests/cf_tunnel.mjs +459 -0
- package/tests/claim_recall.mjs +150 -0
- package/tests/claims_bind_session.mjs +47 -0
- package/tests/claude_materialize.mjs +148 -0
- package/tests/cli_box_scope.mjs +52 -0
- package/tests/cli_lib_formatters.mjs +87 -0
- package/tests/cli_token_reissue.mjs +147 -0
- package/tests/client_bundle_route.mjs +47 -0
- package/tests/cloud_bongos_pack.mjs +85 -0
- package/tests/conductor.mjs +496 -0
- package/tests/confirm_attribution.mjs +156 -0
- package/tests/conflict_resolve.mjs +462 -0
- package/tests/context_pack.mjs +240 -0
- package/tests/cost.mjs +94 -0
- package/tests/cost_audit.mjs +122 -0
- package/tests/cost_budget_status.mjs +78 -0
- package/tests/cost_reconcile.mjs +102 -0
- package/tests/cost_summary_shape.mjs +94 -0
- package/tests/credit_grant.mjs +376 -0
- package/tests/criterion_progress.mjs +220 -0
- package/tests/criterion_proposal.mjs +109 -0
- package/tests/criterion_ref_parse.mjs +53 -0
- package/tests/currency_label.mjs +119 -0
- package/tests/day_cycle.mjs +197 -0
- package/tests/dependencies_migration.mjs +77 -0
- package/tests/dependencies_polymorphic.mjs +212 -0
- package/tests/deploy_instance.mjs +78 -0
- package/tests/devbox_downloads.mjs +122 -0
- package/tests/diff_derived_signals.mjs +115 -0
- package/tests/discord_approvals.mjs +174 -0
- package/tests/discord_autojoin.mjs +158 -0
- package/tests/discord_bot.mjs +94 -0
- package/tests/discord_bugs.mjs +297 -0
- package/tests/discord_channels.mjs +337 -0
- package/tests/discord_foundation.mjs +76 -0
- package/tests/discord_inbound.mjs +190 -0
- package/tests/discord_message_buffer.mjs +87 -0
- package/tests/discord_oauth.mjs +55 -0
- package/tests/discord_reaction.mjs +170 -0
- package/tests/discord_role_sync.mjs +151 -0
- package/tests/display_name.mjs +123 -0
- package/tests/dns_preflight.mjs +74 -0
- package/tests/event_sound_prefs.mjs +194 -0
- package/tests/eviction_policy.mjs +279 -0
- package/tests/figma_adapter.mjs +199 -0
- package/tests/file_map.mjs +91 -0
- package/tests/first_admin_bootstrap.mjs +40 -0
- package/tests/fitness.mjs +435 -0
- package/tests/fitness_two_root.mjs +104 -0
- package/tests/fixtures/session-506-digest.json +34 -0
- package/tests/gate_approvals.mjs +451 -0
- package/tests/gate_review.mjs +152 -0
- package/tests/git_merge_regen.mjs +151 -0
- package/tests/github_push_ancestry.mjs +119 -0
- package/tests/github_push_land_proof.mjs +127 -0
- package/tests/github_push_merge_driver.mjs +175 -0
- package/tests/goal_abuse_matrix.mjs +187 -0
- package/tests/goal_achievement.mjs +146 -0
- package/tests/goal_conflicts.mjs +305 -0
- package/tests/goal_dependencies_read.mjs +73 -0
- package/tests/goal_member_roles.mjs +420 -0
- package/tests/goal_membership_requests.mjs +332 -0
- package/tests/goal_routes.mjs +203 -0
- package/tests/goal_scope_check.mjs +167 -0
- package/tests/goal_tier.mjs +312 -0
- package/tests/goal_wall_proof.mjs +112 -0
- package/tests/grade_attempts.mjs +73 -0
- package/tests/grade_attribution.mjs +117 -0
- package/tests/grade_diff_hash.mjs +191 -0
- package/tests/grade_server_authoritative.mjs +305 -0
- package/tests/grade_unavailable_display.mjs +66 -0
- package/tests/grader.mjs +1960 -0
- package/tests/grader_bypass.mjs +57 -0
- package/tests/grader_panel.mjs +252 -0
- package/tests/grader_prompt_fencing.mjs +192 -0
- package/tests/helpers.mjs +52 -0
- package/tests/hierarchy-config.mjs +81 -0
- package/tests/init.mjs +463 -0
- package/tests/instance_config.mjs +76 -0
- package/tests/instance_manifest.mjs +110 -0
- package/tests/interaction_prefs.mjs +72 -0
- package/tests/key-card.mjs +110 -0
- package/tests/key-status.mjs +45 -0
- package/tests/land_watch.mjs +115 -0
- package/tests/lifecycle-card.mjs +145 -0
- package/tests/lifecycle_breakdown_view.mjs +236 -0
- package/tests/linkify_refs.mjs +264 -0
- package/tests/live_channel.mjs +128 -0
- package/tests/live_sse.mjs +122 -0
- package/tests/llm-cache-route.mjs +110 -0
- package/tests/llm-cache.mjs +140 -0
- package/tests/llm-pricing.mjs +152 -0
- package/tests/local_preview.mjs +136 -0
- package/tests/main_audit.mjs +137 -0
- package/tests/memory_isolation.mjs +431 -0
- package/tests/memory_map.mjs +107 -0
- package/tests/memory_pull.mjs +429 -0
- package/tests/merge_lease.mjs +100 -0
- package/tests/merge_lock.mjs +312 -0
- package/tests/metrics.mjs +147 -0
- package/tests/migration_allocation.mjs +146 -0
- package/tests/migration_namespace.mjs +185 -0
- package/tests/migrations_fresh_replay_guard.mjs +38 -0
- package/tests/mirror_lineage_fulltree.mjs +45 -0
- package/tests/mirror_lineage_proof.mjs +72 -0
- package/tests/mirror_redact.mjs +193 -0
- package/tests/model_alloc_prefs.mjs +63 -0
- package/tests/module-scope-map.mjs +88 -0
- package/tests/module_api.mjs +110 -0
- package/tests/module_cli.mjs +292 -0
- package/tests/module_contributions.mjs +148 -0
- package/tests/module_loader.mjs +286 -0
- package/tests/module_manifest.mjs +194 -0
- package/tests/module_owned_tests.mjs +105 -0
- package/tests/module_provenance.mjs +34 -0
- package/tests/module_route_rank.mjs +147 -0
- package/tests/module_seams.mjs +68 -0
- package/tests/modules.mjs +156 -0
- package/tests/modules_route.mjs +38 -0
- package/tests/newcomer_floor.mjs +17 -0
- package/tests/newcomer_restock.mjs +80 -0
- package/tests/next_number.mjs +154 -0
- package/tests/oauth_secret.mjs +60 -0
- package/tests/onboard.mjs +70 -0
- package/tests/onboarding_gate.mjs +267 -0
- package/tests/onboarding_observability.mjs +344 -0
- package/tests/onboarding_route_signals.mjs +175 -0
- package/tests/onboarding_state.mjs +346 -0
- package/tests/one_active_claim_per_session.mjs +111 -0
- package/tests/orphaned_claim_ship.mjs +135 -0
- package/tests/override_attribution.mjs +142 -0
- package/tests/override_request_ownership.mjs +235 -0
- package/tests/package_core.mjs +435 -0
- package/tests/parallel-load.mjs +402 -0
- package/tests/path_match.mjs +62 -0
- package/tests/permission_path.mjs +151 -0
- package/tests/platform_boot.mjs +167 -0
- package/tests/pre_compact.mjs +60 -0
- package/tests/preview_server.mjs +127 -0
- package/tests/profile_route.mjs +197 -0
- package/tests/provision.mjs +805 -0
- package/tests/provisioning_github_app_routes.mjs +98 -0
- package/tests/public_mirror_export.mjs +124 -0
- package/tests/public_task_resolver.mjs +112 -0
- package/tests/publish_branch_route.mjs +422 -0
- package/tests/publish_manifest.mjs +184 -0
- package/tests/publish_reconciler.mjs +728 -0
- package/tests/rank_gate.mjs +463 -0
- package/tests/rate_limit_public.mjs +217 -0
- package/tests/read_session_export.mjs +89 -0
- package/tests/recall_cli.mjs +82 -0
- package/tests/recall_hints.mjs +119 -0
- package/tests/recent_shipped_window.mjs +80 -0
- package/tests/regrade_eligibility.mjs +202 -0
- package/tests/render_prefs.mjs +122 -0
- package/tests/repo_map.mjs +92 -0
- package/tests/reward_gate.mjs +284 -0
- package/tests/route_rank_check.mjs +243 -0
- package/tests/route_validation.mjs +490 -0
- package/tests/routine_timers.mjs +72 -0
- package/tests/rubric_fixtures.mjs +140 -0
- package/tests/run_routine.mjs +69 -0
- package/tests/sandbox_stage.mjs +582 -0
- package/tests/scrubber_corpus.mjs +257 -0
- package/tests/search_chunker.mjs +209 -0
- package/tests/search_ingest.mjs +96 -0
- package/tests/search_ingest_db.mjs +88 -0
- package/tests/search_isolation.mjs +204 -0
- package/tests/search_route.mjs +95 -0
- package/tests/secret_box.mjs +189 -0
- package/tests/security_docs.mjs +186 -0
- package/tests/security_route.mjs +108 -0
- package/tests/served_paths_shipped.mjs +118 -0
- package/tests/session-cards.mjs +142 -0
- package/tests/session_506_regression.mjs +69 -0
- package/tests/session_caps.mjs +238 -0
- package/tests/session_cost.mjs +133 -0
- package/tests/session_digest.mjs +73 -0
- package/tests/session_eval.mjs +386 -0
- package/tests/session_index.mjs +105 -0
- package/tests/session_records.mjs +369 -0
- package/tests/session_search.mjs +78 -0
- package/tests/session_start_freshness.mjs +123 -0
- package/tests/setup_smoke.mjs +154 -0
- package/tests/ship_autolinkify.mjs +60 -0
- package/tests/ship_automerge_injection.mjs +174 -0
- package/tests/ship_broadcast_routing.mjs +125 -0
- package/tests/ship_broadcast_server.mjs +175 -0
- package/tests/ship_card.mjs +280 -0
- package/tests/ship_ci_deploy.mjs +374 -0
- package/tests/ship_preflight.mjs +368 -0
- package/tests/ship_premerge.mjs +75 -0
- package/tests/ship_resume.mjs +129 -0
- package/tests/ship_upload_skip.mjs +89 -0
- package/tests/ship_zero_commit.mjs +60 -0
- package/tests/single_host_hall.mjs +98 -0
- package/tests/skill_prefs.mjs +150 -0
- package/tests/smoke_preflight.mjs +66 -0
- package/tests/snapshot_picker.mjs +233 -0
- package/tests/sound_prefs.mjs +198 -0
- package/tests/sprite_facing.mjs +35 -0
- package/tests/status-probe.mjs +89 -0
- package/tests/status_backfill.mjs +94 -0
- package/tests/stop_refcheck.mjs +127 -0
- package/tests/streak.mjs +175 -0
- package/tests/subdomain_auth.mjs +58 -0
- package/tests/task_classifier_vocab.mjs +41 -0
- package/tests/task_create_idempotency.mjs +96 -0
- package/tests/task_goal_link.mjs +93 -0
- package/tests/task_ownership_gate.mjs +125 -0
- package/tests/terrain_picker.mjs +298 -0
- package/tests/touches_overlap.mjs +75 -0
- package/tests/triage_development.mjs +140 -0
- package/tests/turn_in_place.mjs +280 -0
- package/tests/upgrade.mjs +357 -0
- package/tests/verify_task_guard.mjs +64 -0
- package/tests/version_close.mjs +76 -0
- package/tests/versions_route.mjs +93 -0
- package/tests/walkability.mjs +188 -0
- package/tests/wandering_prefs.mjs +176 -0
- package/tests/worktree_disambiguation.mjs +105 -0
- package/tests/worktree_guard.mjs +90 -0
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// modules/builder-settings/routes/settings.js — the per-builder PREFERENCE
|
|
4
|
+
// endpoints (BV1.R80 / ADR 0093 §1).
|
|
5
|
+
//
|
|
6
|
+
// Carved out of the core src/bongos/routes/me.js: the five SELF-CONTAINED pref
|
|
7
|
+
// surfaces — skill-model / sound / event-sound / wandering / render — moved here
|
|
8
|
+
// verbatim (the security-carve precedent that SPLIT routes/security.js: the
|
|
9
|
+
// feature routes left, the aggregator stayed). They keep their exact `/me/*`
|
|
10
|
+
// paths (the loader mounts this router on the same /api/bongos router, BEFORE the
|
|
11
|
+
// public catch-all), so the API surface is OTB byte-identical — only the
|
|
12
|
+
// require() paths changed: the auth gates + validators reach the published
|
|
13
|
+
// doorway (`api.*`); the pref shapers + the db slice are intra-module requires.
|
|
14
|
+
//
|
|
15
|
+
// The `GET /me` AGGREGATOR stayed in core me.js as a thin facade — it resolves
|
|
16
|
+
// the `builder-settings` kernel port for its wandering/render/needs slices
|
|
17
|
+
// (02-module-map §2). This factory also REGISTERS that port (below), mirroring
|
|
18
|
+
// modules/economy/routes/reward.js.
|
|
19
|
+
|
|
20
|
+
const express = require('express');
|
|
21
|
+
const api = require('../../../src/module-api');
|
|
22
|
+
const settings = require('../settings');
|
|
23
|
+
const db = require('../db');
|
|
24
|
+
const skillPrefs = require('../skill-prefs');
|
|
25
|
+
const soundPrefs = require('../sound-prefs');
|
|
26
|
+
const eventSoundPrefs = require('../event-sound-prefs');
|
|
27
|
+
const wanderingPrefs = require('../wandering-prefs');
|
|
28
|
+
const interactionPrefs = require('../interaction-prefs');
|
|
29
|
+
const modelAllocPrefs = require('../model-alloc-prefs');
|
|
30
|
+
const renderPrefs = require('../render-prefs');
|
|
31
|
+
const displayName = require('../display-name');
|
|
32
|
+
|
|
33
|
+
// Register the `builder-settings` kernel PORT (BV1.R80 / ADR 0093 §1). The core
|
|
34
|
+
// consumers (routes/me.js's GET /me aggregator + cascade-dispatch.js) resolve it
|
|
35
|
+
// instead of importing the module (the boundary rule: core never requires a
|
|
36
|
+
// module). Pattern mirrors modules/economy/routes/reward.js — registered from the
|
|
37
|
+
// route factory (the one boot hook that runs both live AND when a test rebuilds
|
|
38
|
+
// the GDS router), hasProvider-guarded so re-instantiation never trips the
|
|
39
|
+
// single-provider guard.
|
|
40
|
+
function registerSeams() {
|
|
41
|
+
if (!api.hasProvider('builder-settings')) {
|
|
42
|
+
api.registerProvider('builder-settings', settings);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
module.exports = function buildBuilderSettingsRouter() {
|
|
47
|
+
registerSeams();
|
|
48
|
+
const router = express.Router();
|
|
49
|
+
|
|
50
|
+
// Per-builder skill model preferences (V3.R85 / #304, migration 037).
|
|
51
|
+
//
|
|
52
|
+
// The matrix shows every skill from skill-prefs.KNOWN_SKILLS with three
|
|
53
|
+
// columns: the system default (audit-derived in skill-prefs.js), the
|
|
54
|
+
// builder's override if any, and the effective pick (override > default).
|
|
55
|
+
// ALLOWED_MODELS + KNOWN_SKILLS are echoed back so the UI doesn't have to
|
|
56
|
+
// mirror them from a second source.
|
|
57
|
+
//
|
|
58
|
+
// rank: any-builder — own profile config; mirrors the disciplines route.
|
|
59
|
+
router.get('/me/skill-prefs', api.requireBuilder, async (req, res) => {
|
|
60
|
+
try {
|
|
61
|
+
const stored = await db.getBuilderSkillPrefs(req.builder.id);
|
|
62
|
+
res.json({
|
|
63
|
+
prefs: stored,
|
|
64
|
+
effective: skillPrefs.listEffective(stored),
|
|
65
|
+
defaults: skillPrefs.SKILL_DEFAULTS,
|
|
66
|
+
known_skills: skillPrefs.KNOWN_SKILLS,
|
|
67
|
+
allowed_models: skillPrefs.ALLOWED_MODELS,
|
|
68
|
+
});
|
|
69
|
+
} catch (err) {
|
|
70
|
+
console.error('[gds] GET /me/skill-prefs', err);
|
|
71
|
+
res.fail('read_failed', { status: 500, message: 'internal error' });
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// PATCH a partial set of skill overrides. Body shape is
|
|
76
|
+
// { "<skill-name>": "<model>" | null, ... }
|
|
77
|
+
// with the `null` sentinel meaning "clear this skill's override (fall
|
|
78
|
+
// back to the system default)". Unknown skill names or unknown models
|
|
79
|
+
// → 422 with an errors array naming each bad entry; nothing is written
|
|
80
|
+
// when validation fails. An empty body is a no-op (returns current).
|
|
81
|
+
//
|
|
82
|
+
// rank: any-builder — self-service profile edit; same posture as
|
|
83
|
+
// /me/disciplines.
|
|
84
|
+
router.patch('/me/skill-prefs', api.requireBuilder, async (req, res) => {
|
|
85
|
+
try {
|
|
86
|
+
const v = skillPrefs.validatePatch(req.body || {});
|
|
87
|
+
if (!v.ok) {
|
|
88
|
+
return res.fail('invalid_patch', 422, { errors: v.errors });
|
|
89
|
+
}
|
|
90
|
+
const existing = await db.getBuilderSkillPrefs(req.builder.id);
|
|
91
|
+
const next = skillPrefs.applyPatch(existing, v.patch);
|
|
92
|
+
const saved = await db.setBuilderSkillPrefs(req.builder.id, next);
|
|
93
|
+
res.json({
|
|
94
|
+
prefs: saved,
|
|
95
|
+
effective: skillPrefs.listEffective(saved),
|
|
96
|
+
defaults: skillPrefs.SKILL_DEFAULTS,
|
|
97
|
+
known_skills: skillPrefs.KNOWN_SKILLS,
|
|
98
|
+
allowed_models: skillPrefs.ALLOWED_MODELS,
|
|
99
|
+
});
|
|
100
|
+
} catch (err) {
|
|
101
|
+
console.error('[gds] PATCH /me/skill-prefs', err);
|
|
102
|
+
res.fail('write_failed', { status: 500, message: 'internal error' });
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// Per-builder per-sound on/off preferences (V3.R91 / #786, migration 075).
|
|
107
|
+
//
|
|
108
|
+
// The toggle list shows every sound from sound-prefs.KNOWN_SOUNDS with its
|
|
109
|
+
// label/description, system default (ON), the builder's override if any, and
|
|
110
|
+
// the effective enabled-state. The local player (.claude/sounds/play.js) reads
|
|
111
|
+
// a mirror of these prefs written by scripts/gds/fetch-sound-prefs.js at
|
|
112
|
+
// session start — this endpoint is the source of truth.
|
|
113
|
+
//
|
|
114
|
+
// rank: any-builder — own profile config; mirrors the skill-prefs route.
|
|
115
|
+
router.get('/me/sound-prefs', api.requireBuilder, async (req, res) => {
|
|
116
|
+
try {
|
|
117
|
+
const stored = await db.getBuilderSoundPrefs(req.builder.id);
|
|
118
|
+
res.json({
|
|
119
|
+
prefs: stored,
|
|
120
|
+
effective: soundPrefs.listEffective(stored),
|
|
121
|
+
effective_map: soundPrefs.effectiveMap(stored),
|
|
122
|
+
volume: soundPrefs.getVolume(stored),
|
|
123
|
+
defaults: soundPrefs.SOUND_DEFAULTS,
|
|
124
|
+
known_sounds: soundPrefs.KNOWN_SOUNDS,
|
|
125
|
+
});
|
|
126
|
+
} catch (err) {
|
|
127
|
+
console.error('[gds] GET /me/sound-prefs', err);
|
|
128
|
+
res.fail('read_failed', { status: 500, message: 'internal error' });
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
// PATCH a partial set of sound overrides. Body shape is
|
|
133
|
+
// { "<sound-name>": <bool> | null, ... }
|
|
134
|
+
// with the `null` sentinel meaning "clear this sound's override (fall back to
|
|
135
|
+
// the system default ON)". Unknown sound names or non-boolean values → 422
|
|
136
|
+
// with an errors array; nothing is written when validation fails. An empty
|
|
137
|
+
// body is a no-op (returns current).
|
|
138
|
+
//
|
|
139
|
+
// rank: any-builder — self-service profile edit; same posture as
|
|
140
|
+
// /me/skill-prefs.
|
|
141
|
+
router.patch('/me/sound-prefs', api.requireBuilder, async (req, res) => {
|
|
142
|
+
try {
|
|
143
|
+
const v = soundPrefs.validatePatch(req.body || {});
|
|
144
|
+
if (!v.ok) {
|
|
145
|
+
return res.fail('invalid_patch', 422, { errors: v.errors });
|
|
146
|
+
}
|
|
147
|
+
const existing = await db.getBuilderSoundPrefs(req.builder.id);
|
|
148
|
+
const next = soundPrefs.applyPatch(existing, v.patch);
|
|
149
|
+
const saved = await db.setBuilderSoundPrefs(req.builder.id, next);
|
|
150
|
+
res.json({
|
|
151
|
+
prefs: saved,
|
|
152
|
+
effective: soundPrefs.listEffective(saved),
|
|
153
|
+
effective_map: soundPrefs.effectiveMap(saved),
|
|
154
|
+
volume: soundPrefs.getVolume(saved),
|
|
155
|
+
defaults: soundPrefs.SOUND_DEFAULTS,
|
|
156
|
+
known_sounds: soundPrefs.KNOWN_SOUNDS,
|
|
157
|
+
});
|
|
158
|
+
} catch (err) {
|
|
159
|
+
console.error('[gds] PATCH /me/sound-prefs', err);
|
|
160
|
+
res.fail('write_failed', { status: 500, message: 'internal error' });
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
// Per-builder per-event sound variant selection (task 582, migration 164).
|
|
165
|
+
//
|
|
166
|
+
// Returns each of the 5 build events with their available world-themed variants,
|
|
167
|
+
// the builder's current selection (or the default), and the resolved .wav file
|
|
168
|
+
// name. The local player uses a mirror written by fetch-sound-prefs.js.
|
|
169
|
+
//
|
|
170
|
+
// rank: any-builder — own profile config; mirrors the sound-prefs route.
|
|
171
|
+
router.get('/me/event-sound-prefs', api.requireBuilder, async (req, res) => {
|
|
172
|
+
try {
|
|
173
|
+
const stored = await db.getBuilderEventSoundPrefs(req.builder.id);
|
|
174
|
+
res.json({
|
|
175
|
+
prefs: stored,
|
|
176
|
+
effective: eventSoundPrefs.listEffective(stored),
|
|
177
|
+
effective_wav: eventSoundPrefs.effectiveWavMap(stored),
|
|
178
|
+
events: eventSoundPrefs.EVENTS,
|
|
179
|
+
});
|
|
180
|
+
} catch (err) {
|
|
181
|
+
console.error('[gds] GET /me/event-sound-prefs', err);
|
|
182
|
+
res.fail('read_failed', { status: 500, message: 'internal error' });
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
// PATCH a partial set of event sound overrides. Body shape:
|
|
187
|
+
// { "<event-id>": "<variant-id>" | null, ... }
|
|
188
|
+
// null clears the override (falls back to the event's default). Unknown event
|
|
189
|
+
// IDs, non-string variants, or variants that don't belong to the event → 422.
|
|
190
|
+
//
|
|
191
|
+
// rank: any-builder — self-service profile edit; mirrors the sound-prefs route.
|
|
192
|
+
router.patch('/me/event-sound-prefs', api.requireBuilder, async (req, res) => {
|
|
193
|
+
try {
|
|
194
|
+
const v = eventSoundPrefs.validatePatch(req.body || {});
|
|
195
|
+
if (!v.ok) {
|
|
196
|
+
return res.fail('invalid_patch', 422, { errors: v.errors });
|
|
197
|
+
}
|
|
198
|
+
const existing = await db.getBuilderEventSoundPrefs(req.builder.id);
|
|
199
|
+
const next = eventSoundPrefs.applyPatch(existing, v.patch);
|
|
200
|
+
const saved = await db.setBuilderEventSoundPrefs(req.builder.id, next);
|
|
201
|
+
res.json({
|
|
202
|
+
prefs: saved,
|
|
203
|
+
effective: eventSoundPrefs.listEffective(saved),
|
|
204
|
+
effective_wav: eventSoundPrefs.effectiveWavMap(saved),
|
|
205
|
+
events: eventSoundPrefs.EVENTS,
|
|
206
|
+
});
|
|
207
|
+
} catch (err) {
|
|
208
|
+
console.error('[gds] PATCH /me/event-sound-prefs', err);
|
|
209
|
+
res.fail('write_failed', { status: 500, message: 'internal error' });
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
// Per-builder "wandering" level (task 1268, migration 119). Governs how
|
|
214
|
+
// readily the agent opens a NEW THREAD of work (tangent / investigation /
|
|
215
|
+
// unsolicited suggestion) vs. staying on the claimed task — off-task only,
|
|
216
|
+
// never in-task initiative. The effective level is resolved server-side: the
|
|
217
|
+
// builder's override clamped to [0, maxForRank], with the rank default when
|
|
218
|
+
// unset (wandering-prefs.js is the single source of truth). Newcomers (Xenos)
|
|
219
|
+
// are hard-clamped to Locked; Thetes capped at Focused; Metic+ free.
|
|
220
|
+
//
|
|
221
|
+
// rank: any-builder — own profile config; mirrors the skill/sound-prefs routes.
|
|
222
|
+
router.get('/me/wandering', api.requireBuilder, async (req, res) => {
|
|
223
|
+
try {
|
|
224
|
+
const builder = await api.getBuilderById(req.builder.id);
|
|
225
|
+
const stored = await db.getBuilderBehaviorPrefs(req.builder.id);
|
|
226
|
+
res.json(wanderingPrefs.describeForApi(stored, builder?.rank));
|
|
227
|
+
} catch (err) {
|
|
228
|
+
console.error('[gds] GET /me/wandering', err);
|
|
229
|
+
res.fail('read_failed', { status: 500, message: 'internal error' });
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
// PATCH the wandering level. Body: { wandering: <0..3> | null } where null
|
|
234
|
+
// clears the override (fall back to the rank default). A level above the
|
|
235
|
+
// builder's rank ceiling → 422 above_rank_cap (the UI also hides those). Any
|
|
236
|
+
// other key → 422. Empty body is a no-op (returns current).
|
|
237
|
+
//
|
|
238
|
+
// rank: any-builder — self-service profile edit; same posture as
|
|
239
|
+
// /me/skill-prefs. The rank cap is enforced server-side, so a builder can
|
|
240
|
+
// never store a level their rank doesn't permit.
|
|
241
|
+
router.patch('/me/wandering', api.requireBuilder, async (req, res) => {
|
|
242
|
+
try {
|
|
243
|
+
const builder = await api.getBuilderById(req.builder.id);
|
|
244
|
+
const maxLevel = wanderingPrefs.maxLevelForRank(builder?.rank);
|
|
245
|
+
const v = wanderingPrefs.validatePatch(req.body || {}, { maxLevel });
|
|
246
|
+
if (!v.ok) {
|
|
247
|
+
return res.fail('invalid_patch', 422, { errors: v.errors });
|
|
248
|
+
}
|
|
249
|
+
const existing = await db.getBuilderBehaviorPrefs(req.builder.id);
|
|
250
|
+
const next = wanderingPrefs.applyPatch(existing, v.patch);
|
|
251
|
+
const saved = await db.setBuilderBehaviorPrefs(req.builder.id, next);
|
|
252
|
+
res.json(wanderingPrefs.describeForApi(saved, builder?.rank));
|
|
253
|
+
} catch (err) {
|
|
254
|
+
console.error('[gds] PATCH /me/wandering', err);
|
|
255
|
+
res.fail('write_failed', { status: 500, message: 'internal error' });
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
// Per-builder INTERACTION PROFILE (task 2010, shares the behavior_prefs jsonb /
|
|
260
|
+
// migration 119). Tone, technical level, and local-toolchain familiarity — the
|
|
261
|
+
// old CLAUDE.md §2 "The Prompter" defaults, now a per-builder profile (there is
|
|
262
|
+
// no special "owner" entity; an owner is a builder with a profile). Resolved
|
|
263
|
+
// server-side over the portable defaults; the effective contract is injected
|
|
264
|
+
// each session (like wandering). interaction-prefs.js is the source of truth.
|
|
265
|
+
//
|
|
266
|
+
// rank: any-builder — own profile config; mirrors the wandering/render routes.
|
|
267
|
+
router.get('/me/interaction', api.requireBuilder, async (req, res) => {
|
|
268
|
+
try {
|
|
269
|
+
const stored = await db.getBuilderBehaviorPrefs(req.builder.id);
|
|
270
|
+
res.json(interactionPrefs.describeForApi(stored));
|
|
271
|
+
} catch (err) {
|
|
272
|
+
console.error('[gds] GET /me/interaction', err);
|
|
273
|
+
res.fail('read_failed', { status: 500, message: 'internal error' });
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
// PATCH the interaction profile. Body: { <field>: <value> | null } — null
|
|
278
|
+
// clears a field back to its default. Unknown field/value → 422. Empty body is
|
|
279
|
+
// a no-op (returns current). No rank cap (pure ergonomics, not a trust gate).
|
|
280
|
+
router.patch('/me/interaction', api.requireBuilder, async (req, res) => {
|
|
281
|
+
try {
|
|
282
|
+
const v = interactionPrefs.validatePatch(req.body || {});
|
|
283
|
+
if (!v.ok) {
|
|
284
|
+
return res.fail('invalid_patch', 422, { errors: v.errors });
|
|
285
|
+
}
|
|
286
|
+
const existing = await db.getBuilderBehaviorPrefs(req.builder.id);
|
|
287
|
+
const nextInteraction = interactionPrefs.applyPatch(interactionPrefs.storedProfile(existing), v.patch);
|
|
288
|
+
const nextPrefs = { ...(existing || {}), [interactionPrefs.RESERVED_KEY]: nextInteraction };
|
|
289
|
+
const saved = await db.setBuilderBehaviorPrefs(req.builder.id, nextPrefs);
|
|
290
|
+
res.json(interactionPrefs.describeForApi(saved));
|
|
291
|
+
} catch (err) {
|
|
292
|
+
console.error('[gds] PATCH /me/interaction', err);
|
|
293
|
+
res.fail('write_failed', { status: 500, message: 'internal error' });
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
// Per-builder / per-instance MODEL ALLOCATION (task 2011, shares the
|
|
298
|
+
// behavior_prefs jsonb). The subagent model-routing policy (main tier +
|
|
299
|
+
// subagent default/routine tiers) — the old CLAUDE.md §2 hardcoded table, now
|
|
300
|
+
// settings-driven: resolved as builder override → instance default
|
|
301
|
+
// (`branding.models`) → code default. model-alloc-prefs.js is the SSOT.
|
|
302
|
+
//
|
|
303
|
+
// rank: any-builder — own profile config; mirrors the wandering/interaction routes.
|
|
304
|
+
function instanceModels() {
|
|
305
|
+
try { return api.branding().models || {}; } catch { return {}; }
|
|
306
|
+
}
|
|
307
|
+
router.get('/me/model-allocation', api.requireBuilder, async (req, res) => {
|
|
308
|
+
try {
|
|
309
|
+
const stored = await db.getBuilderBehaviorPrefs(req.builder.id);
|
|
310
|
+
res.json(modelAllocPrefs.describeForApi(stored, instanceModels()));
|
|
311
|
+
} catch (err) {
|
|
312
|
+
console.error('[gds] GET /me/model-allocation', err);
|
|
313
|
+
res.fail('read_failed', { status: 500, message: 'internal error' });
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
// PATCH the model allocation. Body: { <slot>: <tier> | null } — null clears the
|
|
318
|
+
// override for that slot (fall back to instance/code default). Unknown slot or
|
|
319
|
+
// bad tier → 422. Empty body is a no-op (returns current).
|
|
320
|
+
router.patch('/me/model-allocation', api.requireBuilder, async (req, res) => {
|
|
321
|
+
try {
|
|
322
|
+
const v = modelAllocPrefs.validatePatch(req.body || {});
|
|
323
|
+
if (!v.ok) {
|
|
324
|
+
return res.fail('invalid_patch', 422, { errors: v.errors });
|
|
325
|
+
}
|
|
326
|
+
const existing = await db.getBuilderBehaviorPrefs(req.builder.id);
|
|
327
|
+
const nextOverride = modelAllocPrefs.applyPatch(modelAllocPrefs.storedOverride(existing), v.patch);
|
|
328
|
+
const nextPrefs = { ...(existing || {}), [modelAllocPrefs.RESERVED_KEY]: nextOverride };
|
|
329
|
+
const saved = await db.setBuilderBehaviorPrefs(req.builder.id, nextPrefs);
|
|
330
|
+
res.json(modelAllocPrefs.describeForApi(saved, instanceModels()));
|
|
331
|
+
} catch (err) {
|
|
332
|
+
console.error('[gds] PATCH /me/model-allocation', err);
|
|
333
|
+
res.fail('write_failed', { status: 500, message: 'internal error' });
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
// Per-builder "render widgets" knob (task 1279, shares the behavior_prefs
|
|
338
|
+
// jsonb / migration 119). Whether the deterministic session cards render as a
|
|
339
|
+
// rich in-feed HTML widget or the plain text fallback. The widget is nicer but
|
|
340
|
+
// the agent must relay its full markup verbatim into show_widget (read +
|
|
341
|
+
// re-emit) every session-start / claim / ship stage — a real token cost. This
|
|
342
|
+
// toggle turns that off; when off the CLIs emit only text (no HTML relayed).
|
|
343
|
+
// No rank cap (pure cost/taste, not a trust gate); default ON. render-prefs.js
|
|
344
|
+
// is the single source of truth.
|
|
345
|
+
//
|
|
346
|
+
// rank: any-builder — own profile config; mirrors the skill/sound/wandering routes.
|
|
347
|
+
router.get('/me/render', api.requireBuilder, async (req, res) => {
|
|
348
|
+
try {
|
|
349
|
+
const stored = await db.getBuilderBehaviorPrefs(req.builder.id);
|
|
350
|
+
res.json(renderPrefs.describeForApi(stored));
|
|
351
|
+
} catch (err) {
|
|
352
|
+
console.error('[gds] GET /me/render', err);
|
|
353
|
+
res.fail('read_failed', { status: 500, message: 'internal error' });
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
// PATCH the render knob. Body: { widgets: <bool> | null } where null clears the
|
|
358
|
+
// override (fall back to the default ON). Any other key, or a non-boolean
|
|
359
|
+
// value → 422. Empty body is a no-op (returns current). Sibling behavior keys
|
|
360
|
+
// (e.g. wandering) are preserved by applyPatch.
|
|
361
|
+
//
|
|
362
|
+
// rank: any-builder — self-service profile edit; same posture as /me/wandering.
|
|
363
|
+
router.patch('/me/render', api.requireBuilder, async (req, res) => {
|
|
364
|
+
try {
|
|
365
|
+
const v = renderPrefs.validatePatch(req.body || {});
|
|
366
|
+
if (!v.ok) {
|
|
367
|
+
return res.fail('invalid_patch', 422, { errors: v.errors });
|
|
368
|
+
}
|
|
369
|
+
const existing = await db.getBuilderBehaviorPrefs(req.builder.id);
|
|
370
|
+
const next = renderPrefs.applyPatch(existing, v.patch);
|
|
371
|
+
const saved = await db.setBuilderBehaviorPrefs(req.builder.id, next);
|
|
372
|
+
res.json(renderPrefs.describeForApi(saved));
|
|
373
|
+
} catch (err) {
|
|
374
|
+
console.error('[gds] PATCH /me/render', err);
|
|
375
|
+
res.fail('write_failed', { status: 500, message: 'internal error' });
|
|
376
|
+
}
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
// Per-builder DISPLAY NAME (task 1669). The free label shown next to a
|
|
380
|
+
// builder's work in the hall (header, leaderboard, work feed — all already read
|
|
381
|
+
// display_name, so a DB update propagates). Seeded once from GitHub at account
|
|
382
|
+
// creation; these routes are the only way to change it afterward. Stable
|
|
383
|
+
// identity stays github_login/id — the display name is just the rendered label.
|
|
384
|
+
//
|
|
385
|
+
// rank: any-builder — own profile config; mirrors the skill/sound/render routes.
|
|
386
|
+
router.get('/me/display-name', api.requireBuilder, async (req, res) => {
|
|
387
|
+
try {
|
|
388
|
+
const current = await db.getBuilderDisplayName(req.builder.id);
|
|
389
|
+
res.json({ display_name: current, max_length: displayName.MAX_LENGTH });
|
|
390
|
+
} catch (err) {
|
|
391
|
+
console.error('[gds] GET /me/display-name', err);
|
|
392
|
+
res.fail('read_failed', { status: 500, message: 'internal error' });
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
|
|
396
|
+
// PATCH the display name. Body: { display_name: "<new name>" }. Validated +
|
|
397
|
+
// trimmed by display-name.js: empty/whitespace-only, control chars, and names
|
|
398
|
+
// over the length ceiling → 422 with an errors array; nothing is written when
|
|
399
|
+
// validation fails. Own-scoped — only the AUTHENTICATED builder's row is
|
|
400
|
+
// touched (api.requireBuilder + req.builder.id), never another builder.
|
|
401
|
+
// Uniqueness is NOT required (display names may collide).
|
|
402
|
+
router.patch('/me/display-name', api.requireBuilder, async (req, res) => {
|
|
403
|
+
try {
|
|
404
|
+
const v = displayName.validate((req.body || {}).display_name);
|
|
405
|
+
if (!v.ok) {
|
|
406
|
+
return res.fail('invalid_display_name', 422, { errors: v.errors });
|
|
407
|
+
}
|
|
408
|
+
const saved = await db.setBuilderDisplayName(req.builder.id, v.value);
|
|
409
|
+
res.json({ display_name: saved, max_length: displayName.MAX_LENGTH });
|
|
410
|
+
} catch (err) {
|
|
411
|
+
console.error('[gds] PATCH /me/display-name', err);
|
|
412
|
+
res.fail('write_failed', { status: 500, message: 'internal error' });
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
return router;
|
|
417
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// modules/builder-settings/settings.js — the `builder-settings` kernel PORT
|
|
4
|
+
// provider surface (BV1.R80 / ADR 0093 §1).
|
|
5
|
+
//
|
|
6
|
+
// builder-settings owns the per-builder preference domain (wandering · skill ·
|
|
7
|
+
// sound · render) + builder-needs. Most of that surface is reached HTTP-side
|
|
8
|
+
// through the module's own routes (routes/settings.js mounts the `/me/*-prefs`
|
|
9
|
+
// endpoints). But two CORE files legitimately need a sliver of it and must NOT
|
|
10
|
+
// `require()` a module (the one-way boundary, ADR 0083):
|
|
11
|
+
// • routes/me.js — the `GET /me` aggregator builds the `wandering` / `render` /
|
|
12
|
+
// `needs` slices of the profile payload inline (alongside the economy/discord
|
|
13
|
+
// slices it already resolves through ports). It resolves THIS port for them.
|
|
14
|
+
// • cascade-dispatch.js — the dormant System-3 cascade router clamps a spawn to
|
|
15
|
+
// the builder's configured model ceiling (`skillPrefs.getForBuilder`). It
|
|
16
|
+
// resolves THIS port's `skillCeiling`.
|
|
17
|
+
//
|
|
18
|
+
// So this port is the narrow read surface those two core consumers resolve via
|
|
19
|
+
// `seams.resolveOptional('builder-settings')`. builder-settings is default-on, so
|
|
20
|
+
// the provider is present in prod; the consumers degrade gracefully when it isn't
|
|
21
|
+
// (a vanilla instance without the module): me.js's slices are best-effort and
|
|
22
|
+
// cascade's ceiling falls back to 'opus' (its existing `|| 'opus'` default).
|
|
23
|
+
//
|
|
24
|
+
// We DELEGATE (do not spread) every method so a test that stubs a function on the
|
|
25
|
+
// live db/pref module object still bites at call time (the economy reward.js
|
|
26
|
+
// precedent — a spread captures the original reference at module-load).
|
|
27
|
+
|
|
28
|
+
const db = require('./db');
|
|
29
|
+
const skillPrefs = require('./skill-prefs');
|
|
30
|
+
const wanderingPrefs = require('./wandering-prefs');
|
|
31
|
+
const interactionPrefs = require('./interaction-prefs');
|
|
32
|
+
const modelAllocPrefs = require('./model-alloc-prefs');
|
|
33
|
+
const renderPrefs = require('./render-prefs');
|
|
34
|
+
const builderNeeds = require('./builder-needs');
|
|
35
|
+
|
|
36
|
+
module.exports = {
|
|
37
|
+
// --- the raw behavior_prefs blob read (GET /me resolves this once, then shapes
|
|
38
|
+
// the wandering + render slices from the same blob — one DB round-trip).
|
|
39
|
+
getBuilderBehaviorPrefs: (...a) => db.getBuilderBehaviorPrefs(...a),
|
|
40
|
+
|
|
41
|
+
// --- effective-value shapers the GET /me aggregator renders inline (the SSOT
|
|
42
|
+
// for each knob's API shape lives in the corresponding pref lib).
|
|
43
|
+
describeWandering: (...a) => wanderingPrefs.describeForApi(...a),
|
|
44
|
+
describeInteraction: (...a) => interactionPrefs.describeForApi(...a),
|
|
45
|
+
describeModelAllocation: (...a) => modelAllocPrefs.describeForApi(...a),
|
|
46
|
+
describeRender: (...a) => renderPrefs.describeForApi(...a),
|
|
47
|
+
computeNeeds: (...a) => builderNeeds.computeNeeds(...a),
|
|
48
|
+
|
|
49
|
+
// --- the per-builder model ceiling for a skill (cascade-dispatch clamps to it;
|
|
50
|
+
// never exceeds it). Mirrors the former `skillPrefs.getForBuilder` call.
|
|
51
|
+
skillCeiling: (builderPrefs, skillName) => skillPrefs.getForBuilder(builderPrefs, skillName),
|
|
52
|
+
};
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
// src/bongos/skill-prefs.js — per-builder model preferences per skill (V3.R85
|
|
2
|
+
// / #304).
|
|
3
|
+
//
|
|
4
|
+
// One jsonb column on `builders` (skill_model_prefs, migration 037) stores
|
|
5
|
+
// each builder's overrides as { <skill-name>: <model-token> }. Missing keys
|
|
6
|
+
// fall back to the system defaults in SKILL_DEFAULTS below. This module is
|
|
7
|
+
// the single source of truth that the API surfaces, the /builders UI reads
|
|
8
|
+
// from, and any future skill-execution-time hook resolves against.
|
|
9
|
+
//
|
|
10
|
+
// The audit that produced SKILL_DEFAULTS lives in ADR 0021 — each skill is
|
|
11
|
+
// classified as one of:
|
|
12
|
+
//
|
|
13
|
+
// - 'script' — pure mechanism; no LLM judgment needed. Slash
|
|
14
|
+
// command shells out to a script in scripts/gds/ and
|
|
15
|
+
// formats the output. No model selection meaningful.
|
|
16
|
+
// - 'opus' (default for heavy judgment) — design/strategy work the
|
|
17
|
+
// builder really wants right.
|
|
18
|
+
// - 'sonnet' — middle tier; judgment is involved but not load-
|
|
19
|
+
// bearing. Cheaper than opus, more capable than
|
|
20
|
+
// haiku.
|
|
21
|
+
// - 'haiku' — light judgment; classification, sorting, brief
|
|
22
|
+
// framing.
|
|
23
|
+
//
|
|
24
|
+
// A skill listed here as default 'script' still appears in the UI matrix so
|
|
25
|
+
// a builder can deliberately upgrade it (e.g. someone using /builder-cost
|
|
26
|
+
// wants Opus to suggest the right cost category) — the system default just
|
|
27
|
+
// signals "no LLM judgment is structurally needed."
|
|
28
|
+
|
|
29
|
+
const ALLOWED_MODELS = Object.freeze(['opus', 'sonnet', 'haiku', 'script']);
|
|
30
|
+
|
|
31
|
+
// The complete set of skills the matrix exposes. Drives both the UI render
|
|
32
|
+
// and the PATCH validation — any pref for a skill not in this set is
|
|
33
|
+
// rejected. Add a new skill = add one line here + one line in
|
|
34
|
+
// SKILL_DEFAULTS. (Keeping these in code, not in a table, so that the
|
|
35
|
+
// allowlist is reviewed alongside the skill SKILL.md itself.)
|
|
36
|
+
//
|
|
37
|
+
// Ordered to match the /builders UI grouping: methodology + workflow
|
|
38
|
+
// builders first, then otb-art at the bottom.
|
|
39
|
+
const KNOWN_SKILLS = Object.freeze([
|
|
40
|
+
// Methodology / workflow
|
|
41
|
+
'builder-start',
|
|
42
|
+
'builder-claim',
|
|
43
|
+
'builder-ship',
|
|
44
|
+
'builder-release',
|
|
45
|
+
'builder-exit',
|
|
46
|
+
'builder-cost',
|
|
47
|
+
// Daily cadence (heavy judgment)
|
|
48
|
+
'idea-triage',
|
|
49
|
+
'blocker-review',
|
|
50
|
+
'merge-mode',
|
|
51
|
+
// Planning (heavy judgment)
|
|
52
|
+
'planning-session',
|
|
53
|
+
'priority-session',
|
|
54
|
+
// Setup / one-shot
|
|
55
|
+
'builder-setup',
|
|
56
|
+
// Art pipeline
|
|
57
|
+
'otb-tile-generate',
|
|
58
|
+
'otb-design-review',
|
|
59
|
+
'otb-feedback-capture',
|
|
60
|
+
'otb-figma-sync',
|
|
61
|
+
]);
|
|
62
|
+
|
|
63
|
+
// System default per skill. The audit's verdict — what runs when the
|
|
64
|
+
// builder hasn't expressed a preference.
|
|
65
|
+
const SKILL_DEFAULTS = Object.freeze({
|
|
66
|
+
// Pure mechanism — script wrappers around scripts/gds/*.js. No LLM
|
|
67
|
+
// judgment needed for the wrapped operation; the slash command just
|
|
68
|
+
// routes input → script → formatted output.
|
|
69
|
+
'builder-start': 'script',
|
|
70
|
+
'builder-claim': 'script',
|
|
71
|
+
'builder-release': 'script',
|
|
72
|
+
'builder-exit': 'script',
|
|
73
|
+
'builder-cost': 'script',
|
|
74
|
+
'otb-figma-sync': 'script',
|
|
75
|
+
// Mechanism with a small judgment moment (drafting the handoff notes
|
|
76
|
+
// and value summary). Default Sonnet — Opus is overkill for short note
|
|
77
|
+
// drafting, Haiku would weaken the value summary.
|
|
78
|
+
'builder-ship': 'sonnet',
|
|
79
|
+
// Heavy judgment — the skill IS the LLM walking through verdicts,
|
|
80
|
+
// proposals, conflict resolution, criterion design. Defaults Opus per
|
|
81
|
+
// the project-wide subagent-routing rule (CLAUDE.md §2).
|
|
82
|
+
'idea-triage': 'opus',
|
|
83
|
+
'blocker-review': 'opus',
|
|
84
|
+
'merge-mode': 'opus',
|
|
85
|
+
'planning-session': 'opus',
|
|
86
|
+
'priority-session': 'opus',
|
|
87
|
+
// One-shot setup — long-form environment walk-through, but mechanical
|
|
88
|
+
// once the steps are clear. Sonnet is enough.
|
|
89
|
+
'builder-setup': 'sonnet',
|
|
90
|
+
// Art pipeline — generation + design review + feedback capture all use
|
|
91
|
+
// an EXTERNAL model (Gemini for the image gen + review). The 'model'
|
|
92
|
+
// here refers to the orchestrating Claude subagent, not the image
|
|
93
|
+
// model. Sonnet is sufficient for orchestration.
|
|
94
|
+
'otb-tile-generate': 'sonnet',
|
|
95
|
+
'otb-design-review': 'sonnet',
|
|
96
|
+
'otb-feedback-capture': 'sonnet',
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// Sanity assertion at module-load: every KNOWN_SKILLS entry has a default.
|
|
100
|
+
// Catches drift between the two lists at deploy time, not at runtime.
|
|
101
|
+
for (const s of KNOWN_SKILLS) {
|
|
102
|
+
if (!Object.prototype.hasOwnProperty.call(SKILL_DEFAULTS, s)) {
|
|
103
|
+
throw new Error(`skill-prefs: KNOWN_SKILLS lists '${s}' but SKILL_DEFAULTS has no entry`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function isAllowedModel(value) {
|
|
108
|
+
return typeof value === 'string' && ALLOWED_MODELS.includes(value);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function isKnownSkill(value) {
|
|
112
|
+
return typeof value === 'string' && KNOWN_SKILLS.includes(value);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Resolve a builder's effective preference for one skill: the override if
|
|
116
|
+
// they've set one, else the system default. Returns null for unknown
|
|
117
|
+
// skills (caller should treat as "not configurable").
|
|
118
|
+
//
|
|
119
|
+
// `builderPrefs` is the raw jsonb value off builders.skill_model_prefs.
|
|
120
|
+
// We accept it as a plain object so callers can pass it in once (e.g. the
|
|
121
|
+
// API endpoint resolves it once per request) rather than hitting the DB
|
|
122
|
+
// per-skill.
|
|
123
|
+
function getForBuilder(builderPrefs, skillName) {
|
|
124
|
+
if (!isKnownSkill(skillName)) return null;
|
|
125
|
+
const override = builderPrefs && builderPrefs[skillName];
|
|
126
|
+
if (isAllowedModel(override)) return override;
|
|
127
|
+
return SKILL_DEFAULTS[skillName];
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Build the per-builder effective-preference list shown in the UI matrix.
|
|
131
|
+
// Each row carries the skill name, the system default, the builder's
|
|
132
|
+
// override (or null if unset), and the effective pick. Ordered to match
|
|
133
|
+
// KNOWN_SKILLS for stable UI rendering.
|
|
134
|
+
function listEffective(builderPrefs) {
|
|
135
|
+
return KNOWN_SKILLS.map((skill) => ({
|
|
136
|
+
skill,
|
|
137
|
+
default_model: SKILL_DEFAULTS[skill],
|
|
138
|
+
override_model: isAllowedModel(builderPrefs?.[skill]) ? builderPrefs[skill] : null,
|
|
139
|
+
effective_model: getForBuilder(builderPrefs, skill),
|
|
140
|
+
}));
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Validate a PATCH body: { <skill>: <model>, ... } where every skill is
|
|
144
|
+
// KNOWN_SKILLS and every model is ALLOWED_MODELS OR null (null = clear
|
|
145
|
+
// the override and fall back to the system default).
|
|
146
|
+
//
|
|
147
|
+
// Returns { ok: true, patch } on success, { ok: false, errors } on
|
|
148
|
+
// failure. Empty body is allowed (no-op).
|
|
149
|
+
function validatePatch(body) {
|
|
150
|
+
if (body == null || typeof body !== 'object' || Array.isArray(body)) {
|
|
151
|
+
return { ok: false, errors: [{ error: 'body_must_be_object' }] };
|
|
152
|
+
}
|
|
153
|
+
const errors = [];
|
|
154
|
+
const patch = {};
|
|
155
|
+
for (const [skill, model] of Object.entries(body)) {
|
|
156
|
+
if (!isKnownSkill(skill)) {
|
|
157
|
+
errors.push({ skill, error: 'unknown_skill' });
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
if (model === null) {
|
|
161
|
+
patch[skill] = null; // sentinel: clear the override
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (!isAllowedModel(model)) {
|
|
165
|
+
errors.push({ skill, error: 'unknown_model', value: model, allowed: ALLOWED_MODELS });
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
patch[skill] = model;
|
|
169
|
+
}
|
|
170
|
+
if (errors.length > 0) return { ok: false, errors };
|
|
171
|
+
return { ok: true, patch };
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Apply a validated patch to a builder's existing prefs. Pure — does not
|
|
175
|
+
// touch the DB. Returns a new object suitable for writing back. null
|
|
176
|
+
// values delete keys; defined string values overwrite.
|
|
177
|
+
function applyPatch(existing, patch) {
|
|
178
|
+
const next = { ...(existing || {}) };
|
|
179
|
+
for (const [skill, model] of Object.entries(patch)) {
|
|
180
|
+
if (model === null) delete next[skill];
|
|
181
|
+
else next[skill] = model;
|
|
182
|
+
}
|
|
183
|
+
return next;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
module.exports = {
|
|
187
|
+
ALLOWED_MODELS,
|
|
188
|
+
KNOWN_SKILLS,
|
|
189
|
+
SKILL_DEFAULTS,
|
|
190
|
+
isAllowedModel,
|
|
191
|
+
isKnownSkill,
|
|
192
|
+
getForBuilder,
|
|
193
|
+
listEffective,
|
|
194
|
+
validatePatch,
|
|
195
|
+
applyPatch,
|
|
196
|
+
};
|