@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,169 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
// src/bongos/event-sound-prefs.js — per-builder per-event sound variant selection
|
|
3
|
+
// (task 582). Extends the mute-toggle system (sound-prefs.js) with variant
|
|
4
|
+
// picking: for each of 5 build events a builder can choose which world-themed
|
|
5
|
+
// sound variant plays. Each variant maps to an EXISTING .wav in .claude/sounds/;
|
|
6
|
+
// the dedicated world-themed audio assets (lyre-pluck.wav etc.) ship separately.
|
|
7
|
+
|
|
8
|
+
// 5 build events, ordered for the UI. Each has a world-themed default variant
|
|
9
|
+
// plus alternates. `wav` is the existing .claude/sounds/<name>.wav that backs
|
|
10
|
+
// the variant until dedicated audio ships.
|
|
11
|
+
const EVENTS = Object.freeze([
|
|
12
|
+
{
|
|
13
|
+
id: 'user-input',
|
|
14
|
+
label: 'Awaiting Thy Counsel',
|
|
15
|
+
desc: 'Claude has paused and needs thy response',
|
|
16
|
+
variants: [
|
|
17
|
+
{ id: 'lyre-pluck', label: 'Lyre Pluck', wav: 'alert', isDefault: true },
|
|
18
|
+
{ id: 'chime-soft', label: 'Chime Soft', wav: 'chime' },
|
|
19
|
+
],
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
id: 'task-shipped',
|
|
23
|
+
label: 'Task Shipped',
|
|
24
|
+
desc: 'A task has been confirmed and merged',
|
|
25
|
+
variants: [
|
|
26
|
+
{ id: 'bronze-fanfare', label: 'Bronze Fanfare', wav: 'ship', isDefault: true },
|
|
27
|
+
{ id: 'triumph-call', label: 'Triumph Call', wav: 'triumph' },
|
|
28
|
+
],
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: 'credits-awarded',
|
|
32
|
+
label: 'Drachmae Awarded',
|
|
33
|
+
desc: 'Drachmae have been credited to thy treasury',
|
|
34
|
+
variants: [
|
|
35
|
+
{ id: 'coin-clink', label: 'Coin Clink', wav: 'chime', isDefault: true },
|
|
36
|
+
{ id: 'herald-short', label: 'Herald Short', wav: 'alert' },
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
id: 'rank-promoted',
|
|
41
|
+
label: 'Rank Promotion',
|
|
42
|
+
desc: 'Thou hast advanced to a new rank',
|
|
43
|
+
variants: [
|
|
44
|
+
{ id: 'herald-call', label: 'Herald Call', wav: 'fanfare', isDefault: true },
|
|
45
|
+
{ id: 'grand-fanfare', label: 'Grand Fanfare', wav: 'triumph' },
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
id: 'achievement',
|
|
50
|
+
label: 'Achievement Unlocked',
|
|
51
|
+
desc: 'A badge or milestone has been earned',
|
|
52
|
+
variants: [
|
|
53
|
+
{ id: 'harp-flourish', label: 'Harp Flourish', wav: 'triumph', isDefault: true },
|
|
54
|
+
{ id: 'brass-flourish', label: 'Brass Flourish', wav: 'fanfare' },
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
]);
|
|
58
|
+
|
|
59
|
+
// flat: variantId → wav file name
|
|
60
|
+
const VARIANT_WAV = Object.freeze(
|
|
61
|
+
Object.fromEntries(EVENTS.flatMap(e => e.variants.map(v => [v.id, v.wav])))
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
// flat: eventId → default variant id
|
|
65
|
+
const EVENT_DEFAULT = Object.freeze(
|
|
66
|
+
Object.fromEntries(
|
|
67
|
+
EVENTS.map(e => [e.id, e.variants.find(v => v.isDefault)?.id ?? e.variants[0].id])
|
|
68
|
+
)
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
// Sets for fast membership checks
|
|
72
|
+
const KNOWN_EVENT_IDS = Object.freeze(new Set(EVENTS.map(e => e.id)));
|
|
73
|
+
const KNOWN_VARIANT_IDS = Object.freeze(new Set(EVENTS.flatMap(e => e.variants.map(v => v.id))));
|
|
74
|
+
|
|
75
|
+
// Map: eventId → Set of valid variant ids for that event
|
|
76
|
+
const EVENT_VARIANTS = Object.freeze(
|
|
77
|
+
Object.fromEntries(EVENTS.map(e => [e.id, new Set(e.variants.map(v => v.id))]))
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
function resolveVariant(eventId, builderPrefs) {
|
|
81
|
+
const stored = builderPrefs && builderPrefs[eventId];
|
|
82
|
+
if (typeof stored === 'string' && KNOWN_VARIANT_IDS.has(stored)) return stored;
|
|
83
|
+
return EVENT_DEFAULT[eventId];
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function resolveWav(eventId, builderPrefs) {
|
|
87
|
+
return VARIANT_WAV[resolveVariant(eventId, builderPrefs)] ?? 'chime';
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Full list for the API/UI — every event with variants, current selection,
|
|
91
|
+
// and the resolved wav file name.
|
|
92
|
+
function listEffective(builderPrefs) {
|
|
93
|
+
return EVENTS.map(event => ({
|
|
94
|
+
event: event.id,
|
|
95
|
+
label: event.label,
|
|
96
|
+
desc: event.desc,
|
|
97
|
+
variants: event.variants.map(v => ({
|
|
98
|
+
id: v.id,
|
|
99
|
+
label: v.label,
|
|
100
|
+
wav: v.wav,
|
|
101
|
+
is_default: !!v.isDefault,
|
|
102
|
+
})),
|
|
103
|
+
selected: resolveVariant(event.id, builderPrefs),
|
|
104
|
+
wav: resolveWav(event.id, builderPrefs),
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Compact event→wav map written to the local prefs file so the offline hook
|
|
109
|
+
// can play the right sound without a network call.
|
|
110
|
+
function effectiveWavMap(builderPrefs) {
|
|
111
|
+
const out = {};
|
|
112
|
+
for (const e of EVENTS) out[e.id] = resolveWav(e.id, builderPrefs);
|
|
113
|
+
return out;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Validate a PATCH body: { <eventId>: <variantId|null>, ... }
|
|
117
|
+
// null = clear override → fall back to default.
|
|
118
|
+
function validatePatch(body) {
|
|
119
|
+
if (body == null || typeof body !== 'object' || Array.isArray(body)) {
|
|
120
|
+
return { ok: false, errors: [{ error: 'body_must_be_object' }] };
|
|
121
|
+
}
|
|
122
|
+
const errors = [];
|
|
123
|
+
const patch = {};
|
|
124
|
+
for (const [eventId, variantId] of Object.entries(body)) {
|
|
125
|
+
if (!KNOWN_EVENT_IDS.has(eventId)) {
|
|
126
|
+
errors.push({ event: eventId, error: 'unknown_event' });
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (variantId === null) {
|
|
130
|
+
patch[eventId] = null;
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (typeof variantId !== 'string') {
|
|
134
|
+
errors.push({ event: eventId, variant: variantId, error: 'variant_must_be_string_or_null' });
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (!EVENT_VARIANTS[eventId].has(variantId)) {
|
|
138
|
+
errors.push({ event: eventId, variant: variantId, error: 'variant_not_for_event' });
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
patch[eventId] = variantId;
|
|
142
|
+
}
|
|
143
|
+
if (errors.length > 0) return { ok: false, errors };
|
|
144
|
+
return { ok: true, patch };
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function applyPatch(existing, patch) {
|
|
148
|
+
const next = { ...(existing || {}) };
|
|
149
|
+
for (const [eventId, variantId] of Object.entries(patch)) {
|
|
150
|
+
if (variantId === null) delete next[eventId];
|
|
151
|
+
else next[eventId] = variantId;
|
|
152
|
+
}
|
|
153
|
+
return next;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
module.exports = {
|
|
157
|
+
EVENTS,
|
|
158
|
+
VARIANT_WAV,
|
|
159
|
+
EVENT_DEFAULT,
|
|
160
|
+
KNOWN_EVENT_IDS,
|
|
161
|
+
KNOWN_VARIANT_IDS,
|
|
162
|
+
EVENT_VARIANTS,
|
|
163
|
+
resolveVariant,
|
|
164
|
+
resolveWav,
|
|
165
|
+
listEffective,
|
|
166
|
+
effectiveWavMap,
|
|
167
|
+
validatePatch,
|
|
168
|
+
applyPatch,
|
|
169
|
+
};
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
// modules/builder-settings/interaction-prefs.js — the per-builder INTERACTION
|
|
2
|
+
// PROFILE (task 2010 / BONGOS-V1).
|
|
3
|
+
//
|
|
4
|
+
// Principle (2026-07-04 review, bullets 85/87/92): there is NO special "owner"
|
|
5
|
+
// entity — an owner is just a builder with elevated permissions + a profile. So
|
|
6
|
+
// "how to work with me" (the old CLAUDE.md §2 "The Prompter" defaults) is NOT
|
|
7
|
+
// portable-core prose; it's a PER-BUILDER profile — tone, technical level, and
|
|
8
|
+
// local-toolchain familiarity — captured at onboarding and injected each
|
|
9
|
+
// session, exactly like the `wandering` knob (wandering-prefs.js is the sibling
|
|
10
|
+
// this mirrors). CLAUDE.md keeps only the PORTABLE DEFAULTS as the fallback.
|
|
11
|
+
//
|
|
12
|
+
// Storage. One reserved key ('interaction') inside the `behavior_prefs` jsonb
|
|
13
|
+
// (migration 119, shared with wandering/sound). Its value is a small object of
|
|
14
|
+
// field → chosen value; unset/invalid fields fall back to the field default.
|
|
15
|
+
//
|
|
16
|
+
// The defaults below are the portable §2 defaults verbatim: assume the reader
|
|
17
|
+
// may not be a software engineer, define jargon on first use, treat local
|
|
18
|
+
// toolchains as new, frame trade-offs as cost/time/what-the-user-sees, be
|
|
19
|
+
// concise. An engineer builder overrides to a more technical profile; the
|
|
20
|
+
// injected contract then tells the agent how to pitch its replies for THAT
|
|
21
|
+
// builder.
|
|
22
|
+
|
|
23
|
+
const RESERVED_KEY = 'interaction';
|
|
24
|
+
|
|
25
|
+
// Each field: allowed values (first = default), a short label per value, and a
|
|
26
|
+
// one-line contract fragment injected when the value is NON-default (the default
|
|
27
|
+
// already matches the portable baseline, so injecting it would be noise —
|
|
28
|
+
// mirrors wandering's `inject` idea).
|
|
29
|
+
const FIELDS = {
|
|
30
|
+
technical_level: {
|
|
31
|
+
label: 'Technical level',
|
|
32
|
+
blurb: 'How much software-engineering vocabulary to assume.',
|
|
33
|
+
values: {
|
|
34
|
+
non_technical: {
|
|
35
|
+
label: 'Non-technical (default)',
|
|
36
|
+
// default — matches the portable baseline; not injected.
|
|
37
|
+
contract: '',
|
|
38
|
+
},
|
|
39
|
+
mixed: {
|
|
40
|
+
label: 'Some technical background',
|
|
41
|
+
contract: 'Technical level: mixed — plain language by default, but light SWE vocabulary is fine without defining every term.',
|
|
42
|
+
},
|
|
43
|
+
engineer: {
|
|
44
|
+
label: 'Engineer',
|
|
45
|
+
contract: 'Technical level: engineer — assume software-engineering fluency; skip basic explanations and speak in code/architecture terms.',
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
toolchain_familiarity: {
|
|
50
|
+
label: 'Local-toolchain familiarity',
|
|
51
|
+
blurb: 'Whether local dev tools (package managers, ports, env vars) need step-by-step help.',
|
|
52
|
+
values: {
|
|
53
|
+
new: {
|
|
54
|
+
label: 'New to local tooling (default)',
|
|
55
|
+
contract: '',
|
|
56
|
+
},
|
|
57
|
+
comfortable: {
|
|
58
|
+
label: 'Comfortable with local tooling',
|
|
59
|
+
contract: 'Toolchain familiarity: comfortable — no need to walk through local toolchains (Homebrew, ports, env vars) step by step.',
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
verbosity: {
|
|
64
|
+
label: 'Reply length',
|
|
65
|
+
blurb: 'How much prose to return by default.',
|
|
66
|
+
values: {
|
|
67
|
+
concise: {
|
|
68
|
+
label: 'Concise (default)',
|
|
69
|
+
contract: '',
|
|
70
|
+
},
|
|
71
|
+
detailed: {
|
|
72
|
+
label: 'Detailed',
|
|
73
|
+
contract: 'Verbosity: detailed — this builder wants fuller explanations and context, not just the short answer.',
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const FIELD_KEYS = Object.keys(FIELDS);
|
|
80
|
+
|
|
81
|
+
// The default value for a field is its FIRST declared value.
|
|
82
|
+
function defaultValue(field) {
|
|
83
|
+
return Object.keys(FIELDS[field].values)[0];
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function isValidValue(field, value) {
|
|
87
|
+
return typeof value === 'string' && Object.prototype.hasOwnProperty.call(FIELDS[field].values, value);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// The raw stored profile (the `interaction` object off behavior_prefs), sanitized
|
|
91
|
+
// to only known fields/values. Unknown keys/values are dropped (not an error —
|
|
92
|
+
// the effective profile falls back to defaults).
|
|
93
|
+
function storedProfile(behaviorPrefs) {
|
|
94
|
+
const raw = (behaviorPrefs && typeof behaviorPrefs[RESERVED_KEY] === 'object' && behaviorPrefs[RESERVED_KEY]) || {};
|
|
95
|
+
const out = {};
|
|
96
|
+
for (const f of FIELD_KEYS) {
|
|
97
|
+
if (isValidValue(f, raw[f])) out[f] = raw[f];
|
|
98
|
+
}
|
|
99
|
+
return out;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// The effective profile: stored override per field, else the field default.
|
|
103
|
+
function effectiveProfile(behaviorPrefs) {
|
|
104
|
+
const stored = storedProfile(behaviorPrefs);
|
|
105
|
+
const out = {};
|
|
106
|
+
for (const f of FIELD_KEYS) out[f] = stored[f] || defaultValue(f);
|
|
107
|
+
return out;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// The session-injected contract: the non-default fragments joined into one
|
|
111
|
+
// paragraph. Empty string when the builder is on all defaults (the portable
|
|
112
|
+
// baseline already covers that — nothing to inject).
|
|
113
|
+
function contractFor(behaviorPrefs) {
|
|
114
|
+
const eff = effectiveProfile(behaviorPrefs);
|
|
115
|
+
const parts = [];
|
|
116
|
+
for (const f of FIELD_KEYS) {
|
|
117
|
+
const frag = FIELDS[f].values[eff[f]].contract;
|
|
118
|
+
if (frag) parts.push(frag);
|
|
119
|
+
}
|
|
120
|
+
if (!parts.length) return '';
|
|
121
|
+
return 'Interaction profile for this builder — pitch replies accordingly:\n- ' + parts.join('\n- ');
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function shouldInject(behaviorPrefs) {
|
|
125
|
+
return contractFor(behaviorPrefs) !== '';
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// The full catalog the /settings UI renders.
|
|
129
|
+
function fieldCatalog() {
|
|
130
|
+
return FIELD_KEYS.map((f) => ({
|
|
131
|
+
field: f,
|
|
132
|
+
label: FIELDS[f].label,
|
|
133
|
+
blurb: FIELDS[f].blurb,
|
|
134
|
+
default_value: defaultValue(f),
|
|
135
|
+
values: Object.entries(FIELDS[f].values).map(([value, meta]) => ({ value, label: meta.label })),
|
|
136
|
+
}));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Everything the /me payload + the /settings UI need in one object.
|
|
140
|
+
function describeForApi(behaviorPrefs) {
|
|
141
|
+
return {
|
|
142
|
+
fields: fieldCatalog(),
|
|
143
|
+
stored: storedProfile(behaviorPrefs),
|
|
144
|
+
effective: effectiveProfile(behaviorPrefs),
|
|
145
|
+
contract: contractFor(behaviorPrefs),
|
|
146
|
+
inject: shouldInject(behaviorPrefs),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Validate a PATCH body: { <field>: <value> | null }. `null` clears a field
|
|
151
|
+
// (fall back to its default). Unknown fields/values → 422. Returns
|
|
152
|
+
// { ok, patch } or { ok:false, errors }. The route merges `patch` into the
|
|
153
|
+
// stored `interaction` object.
|
|
154
|
+
function validatePatch(body) {
|
|
155
|
+
if (body == null || typeof body !== 'object' || Array.isArray(body)) {
|
|
156
|
+
return { ok: false, errors: [{ error: 'body_must_be_object' }] };
|
|
157
|
+
}
|
|
158
|
+
const errors = [];
|
|
159
|
+
const patch = {};
|
|
160
|
+
for (const [key, value] of Object.entries(body)) {
|
|
161
|
+
if (!FIELD_KEYS.includes(key)) {
|
|
162
|
+
errors.push({ error: 'unknown_field', field: key });
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
if (value === null) { patch[key] = null; continue; }
|
|
166
|
+
if (!isValidValue(key, value)) {
|
|
167
|
+
errors.push({ error: 'bad_value', field: key, allowed: Object.keys(FIELDS[key].values) });
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
patch[key] = value;
|
|
171
|
+
}
|
|
172
|
+
if (errors.length) return { ok: false, errors };
|
|
173
|
+
return { ok: true, patch };
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Merge a validated patch into an existing stored profile (null clears). Pure —
|
|
177
|
+
// the route persists the result into behavior_prefs.interaction.
|
|
178
|
+
function applyPatch(stored, patch) {
|
|
179
|
+
const next = { ...(stored || {}) };
|
|
180
|
+
for (const [k, v] of Object.entries(patch)) {
|
|
181
|
+
if (v === null) delete next[k];
|
|
182
|
+
else next[k] = v;
|
|
183
|
+
}
|
|
184
|
+
return next;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
module.exports = {
|
|
188
|
+
RESERVED_KEY,
|
|
189
|
+
FIELDS,
|
|
190
|
+
FIELD_KEYS,
|
|
191
|
+
defaultValue,
|
|
192
|
+
isValidValue,
|
|
193
|
+
storedProfile,
|
|
194
|
+
effectiveProfile,
|
|
195
|
+
contractFor,
|
|
196
|
+
shouldInject,
|
|
197
|
+
fieldCatalog,
|
|
198
|
+
describeForApi,
|
|
199
|
+
validatePatch,
|
|
200
|
+
applyPatch,
|
|
201
|
+
};
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// modules/builder-settings/model-alloc-prefs.js — per-builder / per-instance
|
|
2
|
+
// MODEL ALLOCATION (task 2011 / BONGOS-V1).
|
|
3
|
+
//
|
|
4
|
+
// The subagent model-routing policy (main session = top tier; subagents default
|
|
5
|
+
// to the development tier, routine plumbing to the cheap tier; "no Sonnet") was
|
|
6
|
+
// a hardcoded TABLE in CLAUDE.md §2 — it rots as model names change and is the
|
|
7
|
+
// same class of leak as the reward formula (task 2009). This makes the tier
|
|
8
|
+
// VALUES settings-driven: an INSTANCE default (`config/branding.json` `models`)
|
|
9
|
+
// with an optional PER-BUILDER override (behavior_prefs `model_allocation`),
|
|
10
|
+
// resolved over the code defaults. §2 keeps only the stable SHAPE + rationale
|
|
11
|
+
// and points here; changing a tier no longer needs a doc edit.
|
|
12
|
+
//
|
|
13
|
+
// PURE lib (the wandering/interaction-prefs pattern): it takes the instance
|
|
14
|
+
// default as a param (the route reads `branding().models` via the doorway and
|
|
15
|
+
// passes it), so it stays testable with no global-config read.
|
|
16
|
+
|
|
17
|
+
const RESERVED_KEY = 'model_allocation';
|
|
18
|
+
|
|
19
|
+
// Tier vocabulary — mirrors skill-prefs.ALLOWED_MODELS (minus 'script', which is
|
|
20
|
+
// a per-skill escape hatch, not a session tier). Ordered cheap→capable for UIs.
|
|
21
|
+
const ALLOWED_TIERS = Object.freeze(['haiku', 'sonnet', 'opus', 'fable']);
|
|
22
|
+
|
|
23
|
+
// The allocation slots + their code defaults (the current §2 policy verbatim):
|
|
24
|
+
// the main interactive session runs top-tier; subagents default to the
|
|
25
|
+
// development tier; routine plumbing (known-path GDS/DB reads) drops to cheap.
|
|
26
|
+
const SLOTS = Object.freeze({
|
|
27
|
+
main: { label: 'Main interactive session', default: 'opus', blurb: 'The session the builder sits in front of.' },
|
|
28
|
+
subagentDefault: { label: 'Subagents (default)', default: 'opus', blurb: 'Research, audits, code review, design, code that ships, parallel build sessions.' },
|
|
29
|
+
subagentRoutine: { label: 'Subagents (routine plumbing)', default: 'haiku', blurb: 'Mechanical known-path GDS/DB ops: list, fetch-by-id, log a cost row, read a known file.' },
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const SLOT_KEYS = Object.keys(SLOTS);
|
|
33
|
+
|
|
34
|
+
function isValidTier(t) {
|
|
35
|
+
return typeof t === 'string' && ALLOWED_TIERS.includes(t);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Sanitize a raw slot→tier map to known slots + valid tiers.
|
|
39
|
+
function sanitize(raw) {
|
|
40
|
+
const out = {};
|
|
41
|
+
if (raw && typeof raw === 'object' && !Array.isArray(raw)) {
|
|
42
|
+
for (const k of SLOT_KEYS) if (isValidTier(raw[k])) out[k] = raw[k];
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function codeDefaults() {
|
|
48
|
+
const out = {};
|
|
49
|
+
for (const k of SLOT_KEYS) out[k] = SLOTS[k].default;
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// The builder's stored override (behavior_prefs.model_allocation), sanitized.
|
|
54
|
+
function storedOverride(behaviorPrefs) {
|
|
55
|
+
return sanitize(behaviorPrefs && behaviorPrefs[RESERVED_KEY]);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// The instance default (branding.models), sanitized. Passed in by the route.
|
|
59
|
+
function instanceDefault(instanceModels) {
|
|
60
|
+
return sanitize(instanceModels);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Effective allocation: builder override → instance default → code default,
|
|
64
|
+
// per slot. This is what the agent consults when spawning subagents.
|
|
65
|
+
function effectiveAllocation(behaviorPrefs, instanceModels) {
|
|
66
|
+
const override = storedOverride(behaviorPrefs);
|
|
67
|
+
const inst = instanceDefault(instanceModels);
|
|
68
|
+
const code = codeDefaults();
|
|
69
|
+
const out = {};
|
|
70
|
+
for (const k of SLOT_KEYS) out[k] = override[k] || inst[k] || code[k];
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// A compact human/agent-facing guidance line for the effective allocation.
|
|
75
|
+
function contractFor(behaviorPrefs, instanceModels) {
|
|
76
|
+
const eff = effectiveAllocation(behaviorPrefs, instanceModels);
|
|
77
|
+
return `Model allocation — main session: ${eff.main}; subagents default: ${eff.subagentDefault}, routine plumbing: ${eff.subagentRoutine}. Set the Agent \`model\` param explicitly per this allocation.`;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// The catalog the /settings UI renders.
|
|
81
|
+
function slotCatalog() {
|
|
82
|
+
return SLOT_KEYS.map((k) => ({
|
|
83
|
+
slot: k,
|
|
84
|
+
label: SLOTS[k].label,
|
|
85
|
+
blurb: SLOTS[k].blurb,
|
|
86
|
+
code_default: SLOTS[k].default,
|
|
87
|
+
tiers: ALLOWED_TIERS.slice(),
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Everything /me + /settings need in one object.
|
|
92
|
+
function describeForApi(behaviorPrefs, instanceModels) {
|
|
93
|
+
return {
|
|
94
|
+
slots: slotCatalog(),
|
|
95
|
+
allowed_tiers: ALLOWED_TIERS.slice(),
|
|
96
|
+
code_defaults: codeDefaults(),
|
|
97
|
+
instance_default: instanceDefault(instanceModels),
|
|
98
|
+
override: storedOverride(behaviorPrefs),
|
|
99
|
+
effective: effectiveAllocation(behaviorPrefs, instanceModels),
|
|
100
|
+
contract: contractFor(behaviorPrefs, instanceModels),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Validate a PATCH body: { <slot>: <tier> | null }. null clears the override for
|
|
105
|
+
// that slot (fall back to instance/code default). Unknown slot / bad tier → 422.
|
|
106
|
+
function validatePatch(body) {
|
|
107
|
+
if (body == null || typeof body !== 'object' || Array.isArray(body)) {
|
|
108
|
+
return { ok: false, errors: [{ error: 'body_must_be_object' }] };
|
|
109
|
+
}
|
|
110
|
+
const errors = [];
|
|
111
|
+
const patch = {};
|
|
112
|
+
for (const [key, value] of Object.entries(body)) {
|
|
113
|
+
if (!SLOT_KEYS.includes(key)) { errors.push({ error: 'unknown_slot', slot: key }); continue; }
|
|
114
|
+
if (value === null) { patch[key] = null; continue; }
|
|
115
|
+
if (!isValidTier(value)) { errors.push({ error: 'bad_tier', slot: key, allowed: ALLOWED_TIERS }); continue; }
|
|
116
|
+
patch[key] = value;
|
|
117
|
+
}
|
|
118
|
+
if (errors.length) return { ok: false, errors };
|
|
119
|
+
return { ok: true, patch };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Merge a validated patch into the stored override (null clears). Pure.
|
|
123
|
+
function applyPatch(stored, patch) {
|
|
124
|
+
const next = { ...(stored || {}) };
|
|
125
|
+
for (const [k, v] of Object.entries(patch)) {
|
|
126
|
+
if (v === null) delete next[k];
|
|
127
|
+
else next[k] = v;
|
|
128
|
+
}
|
|
129
|
+
return next;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
module.exports = {
|
|
133
|
+
RESERVED_KEY,
|
|
134
|
+
ALLOWED_TIERS,
|
|
135
|
+
SLOTS,
|
|
136
|
+
SLOT_KEYS,
|
|
137
|
+
isValidTier,
|
|
138
|
+
codeDefaults,
|
|
139
|
+
storedOverride,
|
|
140
|
+
instanceDefault,
|
|
141
|
+
effectiveAllocation,
|
|
142
|
+
contractFor,
|
|
143
|
+
slotCatalog,
|
|
144
|
+
describeForApi,
|
|
145
|
+
validatePatch,
|
|
146
|
+
applyPatch,
|
|
147
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"key": "builder-settings",
|
|
3
|
+
"title": "Builder settings (prefs · needs)",
|
|
4
|
+
"description": "The per-builder PREFERENCE domain — the wandering knob (how readily the agent opens off-task threads, rank-clamped), per-skill model ceilings, per-sound + per-event-sound on/off, and the render-widgets toggle — plus builder-needs (the 'the system needs an input from you' list). A core-domain module carved out of the GDS core in BV1.R80 (ADR 0093 §1); default-on because every instance configures its own builders. The `/me/*-prefs` routes mount here; the `GET /me` aggregator stays a thin core facade that resolves the `builder-settings` kernel PORT for its wandering/render/needs slices (02-module-map §2).",
|
|
5
|
+
"coreVersion": "^1.8.0",
|
|
6
|
+
"default": true,
|
|
7
|
+
"contributes": { "routes": ["settings"] },
|
|
8
|
+
"provides": ["builder-settings"],
|
|
9
|
+
"consumes": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// src/bongos/render-prefs.js — the per-builder "render widgets" knob (task 1279).
|
|
2
|
+
//
|
|
3
|
+
// Governs whether the deterministic session cards (start.js's /builder-start
|
|
4
|
+
// card + the ship-card lifecycle card: claimed → review → confirmed → shipped)
|
|
5
|
+
// render as a rich in-feed HTML widget (via the app's show_widget tool) or as
|
|
6
|
+
// the plain markdown / monospace fallback.
|
|
7
|
+
//
|
|
8
|
+
// Why it's a knob: the widget is nicer, but the agent must relay its full markup
|
|
9
|
+
// VERBATIM into show_widget — reading it once and re-emitting it once — so every
|
|
10
|
+
// byte of HTML is shuttled through the model twice, at every session-start,
|
|
11
|
+
// claim, and ship stage. Measured: the /builder-start widget is ~4.7K tokens vs
|
|
12
|
+
// ~0.5K for the markdown form (9×); the lifecycle card ~0.9K vs ~0.12K monospace
|
|
13
|
+
// (7×). This knob lets a builder turn that token cost off. When off, the CLIs
|
|
14
|
+
// emit ONLY the text form (no HTML is ever written or relayed) — so it's a real
|
|
15
|
+
// saving, not just a visual change.
|
|
16
|
+
//
|
|
17
|
+
// Unlike the wandering knob ([[wandering-prefs]]) this is pure cost/taste, NOT a
|
|
18
|
+
// trust gate — so there is NO rank cap: any builder may pick either value, and
|
|
19
|
+
// the default is ON (the experience tasks 1273/1275 deliberately shipped).
|
|
20
|
+
//
|
|
21
|
+
// Storage: one reserved key ('widgets') inside the `behavior_prefs` jsonb column
|
|
22
|
+
// on `builders` (migration 119 — the same blob the wandering knob uses). Value
|
|
23
|
+
// is a scalar boolean; a missing key falls back to DEFAULT_ENABLED, so the
|
|
24
|
+
// column stays sparse. applyPatch leaves sibling keys (e.g. 'wandering') alone.
|
|
25
|
+
//
|
|
26
|
+
// This module is the single source of truth: GET/PATCH /api/gds/me/render + the
|
|
27
|
+
// /me payload surface it, the /settings UI reads it, and the start/claim/ship
|
|
28
|
+
// CLIs read the resolved boolean to decide whether to emit HTML at all.
|
|
29
|
+
|
|
30
|
+
const RESERVED_KEY = 'widgets';
|
|
31
|
+
const DEFAULT_ENABLED = true;
|
|
32
|
+
|
|
33
|
+
// ---- pure helpers ----
|
|
34
|
+
|
|
35
|
+
// The raw override a builder has stored (the 'widgets' key off behavior_prefs),
|
|
36
|
+
// or null when unset/invalid. Kept separate from the effective value so the UI
|
|
37
|
+
// can show "you chose X" vs "the default (Y)".
|
|
38
|
+
function overrideEnabled(behaviorPrefs) {
|
|
39
|
+
const raw = behaviorPrefs && behaviorPrefs[RESERVED_KEY];
|
|
40
|
+
return typeof raw === 'boolean' ? raw : null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// The resolved boolean — the value the CLIs act on. Override if set, else the
|
|
44
|
+
// default. This is the one function the start/claim/ship scripts care about.
|
|
45
|
+
function widgetsEnabled(behaviorPrefs) {
|
|
46
|
+
const o = overrideEnabled(behaviorPrefs);
|
|
47
|
+
return o === null ? DEFAULT_ENABLED : o;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Everything the /me payload + the /settings UI need in one object.
|
|
51
|
+
function describeForApi(behaviorPrefs) {
|
|
52
|
+
return {
|
|
53
|
+
widgets_enabled: widgetsEnabled(behaviorPrefs),
|
|
54
|
+
default_enabled: DEFAULT_ENABLED,
|
|
55
|
+
override: overrideEnabled(behaviorPrefs),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Validate a PATCH body: { widgets: <bool> | null }. `null` clears the override
|
|
60
|
+
// (fall back to the default). Unknown keys → 422. Non-boolean values → 422.
|
|
61
|
+
// Returns { ok, patch } or { ok:false, errors }. An empty body is a valid no-op.
|
|
62
|
+
function validatePatch(body) {
|
|
63
|
+
if (body == null || typeof body !== 'object' || Array.isArray(body)) {
|
|
64
|
+
return { ok: false, errors: [{ error: 'body_must_be_object' }] };
|
|
65
|
+
}
|
|
66
|
+
const errors = [];
|
|
67
|
+
const patch = {};
|
|
68
|
+
for (const [key, value] of Object.entries(body)) {
|
|
69
|
+
if (key !== RESERVED_KEY) {
|
|
70
|
+
errors.push({ key, error: 'unknown_key', allowed: [RESERVED_KEY] });
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (value === null || typeof value === 'boolean') {
|
|
74
|
+
patch[RESERVED_KEY] = value; // null = clear → default
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
errors.push({ key, error: 'invalid_value', value, allowed: 'boolean or null' });
|
|
78
|
+
}
|
|
79
|
+
if (errors.length > 0) return { ok: false, errors };
|
|
80
|
+
return { ok: true, patch };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Apply a validated patch to a builder's existing behavior_prefs. Pure. null
|
|
84
|
+
// deletes the key (fall back to default); a boolean overwrites. Other keys in
|
|
85
|
+
// the blob (e.g. the wandering knob) are left untouched.
|
|
86
|
+
function applyPatch(existing, patch) {
|
|
87
|
+
const next = { ...(existing || {}) };
|
|
88
|
+
for (const [key, value] of Object.entries(patch)) {
|
|
89
|
+
if (value === null) delete next[key];
|
|
90
|
+
else next[key] = value;
|
|
91
|
+
}
|
|
92
|
+
return next;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
module.exports = {
|
|
96
|
+
RESERVED_KEY,
|
|
97
|
+
DEFAULT_ENABLED,
|
|
98
|
+
overrideEnabled,
|
|
99
|
+
widgetsEnabled,
|
|
100
|
+
describeForApi,
|
|
101
|
+
validatePatch,
|
|
102
|
+
applyPatch,
|
|
103
|
+
};
|