@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,380 @@
|
|
|
1
|
+
const express = require('express');
|
|
2
|
+
const auth = require('../auth');
|
|
3
|
+
const db = require('../db');
|
|
4
|
+
// streak + achievement getters + cost status carved into modules/economy/ (BV1.R77
|
|
5
|
+
// / ADR 0093 §1-2); reached through the `reward` kernel port (resolved per call),
|
|
6
|
+
// never a direct require of a module file.
|
|
7
|
+
// The per-builder PREFERENCE domain (wandering · skill · sound · render) +
|
|
8
|
+
// builder-needs carved into modules/builder-settings/ (BV1.R80 / ADR 0093 §1):
|
|
9
|
+
// the five `/me/*-prefs` routes moved there; THIS aggregator stays a thin facade
|
|
10
|
+
// that resolves the `builder-settings` kernel port for its wandering/render/needs
|
|
11
|
+
// slices (02-module-map §2) — never a direct require of a module file. The
|
|
12
|
+
// provider is default-on (present in prod); resolveOptional degrades on a
|
|
13
|
+
// prefs-module-less instance so the slices simply render their unset/default shape.
|
|
14
|
+
const { validateOrRespond } = require('./_helpers');
|
|
15
|
+
const { branding } = require('../../branding'); // task 2011: instance model-allocation default
|
|
16
|
+
// The onboarding state machine carved into modules/onboarding/ (BV1.R81 / ADR
|
|
17
|
+
// 0093 §1): the GET /me aggregator + PATCH /me/disciplines resolve the
|
|
18
|
+
// `onboarding` kernel port for their checklist slices (read/shape/mark) — never a
|
|
19
|
+
// direct require of a module file.
|
|
20
|
+
const { pool } = require('../pool');
|
|
21
|
+
const seams = require('../../module-seams');
|
|
22
|
+
// The lifecycle (tasks · claims · ship) carved to modules/lifecycle/ (BV1.R86 /
|
|
23
|
+
// ADR 0093 §3): the per-builder claims/estimation/grade reads resolve the
|
|
24
|
+
// `lifecycle` kernel PORT (lc()); the grade-TREND read (builderRollingAvgGrade)
|
|
25
|
+
// stays core db (the sessions BFG also consumes it — kept on the doorway).
|
|
26
|
+
const lc = () => seams.resolveOptional('lifecycle');
|
|
27
|
+
// The dev-box "has this builder ever connected a box?" signal, read through the
|
|
28
|
+
// kernel seam instead of a direct `require('../boxes')` (a forbidden core→module
|
|
29
|
+
// edge once dev-box moved to modules/dev-box/, ADR 0083 / BV1.R43). The dev-box
|
|
30
|
+
// module provides the `box.hasEverConnected` port when enabled; resolveOptional
|
|
31
|
+
// degrades to false on a box-less instance, so onboarding's box_connect step
|
|
32
|
+
// simply never auto-clears there. Resolved per call (the provider registers at
|
|
33
|
+
// boot, before any request).
|
|
34
|
+
const boxHasEverConnected = (builderId) =>
|
|
35
|
+
seams.resolveOptional('box.hasEverConnected', async () => false)(builderId);
|
|
36
|
+
// The art-pipeline "is the shared newcomer key configured?" signal, read through
|
|
37
|
+
// the kernel seam (ADR 0083 / BV1.R48). The art-pipeline module provides
|
|
38
|
+
// 'art.sharedKeyConfigured' when enabled; resolveOptional degrades to false on a
|
|
39
|
+
// vanilla instance so builder-needs.computeNeeds still works without the module.
|
|
40
|
+
const artSharedKeyConfigured = () =>
|
|
41
|
+
seams.resolveOptional('art.sharedKeyConfigured', () => false)();
|
|
42
|
+
// The "has this builder linked their Discord account?" signal, read through the
|
|
43
|
+
// kernel seam instead of a direct `require('../db').getDiscordLink` (a forbidden
|
|
44
|
+
// core→module edge once discord moved to modules/discord/, ADR 0083 / BV1.R47).
|
|
45
|
+
// The discord module provides the `discord.isLinked` port when enabled;
|
|
46
|
+
// resolveOptional degrades to false on a discord-less instance, so the hall just
|
|
47
|
+
// renders the un-linked state and onboarding's discord step never auto-clears.
|
|
48
|
+
// `discord.configured` (does the server hold OAuth creds?) stays core — the
|
|
49
|
+
// account-LINK flow (routes/auth.js) is not part of the module.
|
|
50
|
+
const discordIsLinked = (builderId) =>
|
|
51
|
+
seams.resolveOptional('discord.isLinked', async () => false)(builderId);
|
|
52
|
+
|
|
53
|
+
module.exports = function buildMeRouter() {
|
|
54
|
+
const router = express.Router();
|
|
55
|
+
|
|
56
|
+
// PMS-V2 #188: response now also carries `unlocked` (server-joined
|
|
57
|
+
// achievement metadata) + `locked_with_progress` (server-computed
|
|
58
|
+
// human-readable progress hint per locked achievement) so the /builders
|
|
59
|
+
// UI can render achievements without a follow-up API call. Additive only —
|
|
60
|
+
// existing keys preserved for back-compat with scripts/gds/me.js and the
|
|
61
|
+
// /builders web client.
|
|
62
|
+
//
|
|
63
|
+
// V3.R24 (#244): the `builder` payload now carries `karma` (migration 040
|
|
64
|
+
// added the column + karma_log table). The field is surfaced by
|
|
65
|
+
// db.getBuilderById() — no shape change here, just documenting that the
|
|
66
|
+
// /api/gds/me response is the canonical place clients read karma from.
|
|
67
|
+
//
|
|
68
|
+
// rank: any-builder — own identity + own contributions; preserved per CRITICAL §4.
|
|
69
|
+
router.get('/me', auth.requireBuilder, async (req, res) => {
|
|
70
|
+
// economy reads (achievement getters, streak, cost status) resolve the
|
|
71
|
+
// `reward` kernel port (BV1.R77 / ADR 0093 §1-2). economy is default-on, so
|
|
72
|
+
// the provider is present in prod; tests register it.
|
|
73
|
+
const reward = seams.resolveOptional('reward');
|
|
74
|
+
// builder-settings reads (the wandering/render/needs profile slices) resolve
|
|
75
|
+
// the `builder-settings` kernel port (BV1.R80 / ADR 0093 §1). Default-on, so
|
|
76
|
+
// present in prod; degrades to unset/default shapes when the module is off.
|
|
77
|
+
const settings = seams.resolveOptional('builder-settings');
|
|
78
|
+
// onboarding reads (the builder's own checklist state, shaped for the hall)
|
|
79
|
+
// resolve the `onboarding` kernel port (BV1.R81 / ADR 0093 §1). Default-on, so
|
|
80
|
+
// present in prod; degrades to a null state row (shapeForApi synthesizes the
|
|
81
|
+
// "nothing cleared" view) when the module is off.
|
|
82
|
+
const onboarding = seams.resolveOptional('onboarding');
|
|
83
|
+
const [
|
|
84
|
+
builder, activeClaims, estVsActual, unlocked, lockedWithProgress, streakInfo,
|
|
85
|
+
recentGrades, builderAvg, onboardingRow, shipCount, recentKarma, karma30d, discordLink, boxConnected, cliAuthed,
|
|
86
|
+
behaviorPrefs, geminiKeyRow,
|
|
87
|
+
] = await Promise.all([
|
|
88
|
+
db.getBuilderById(req.builder.id),
|
|
89
|
+
lc().getActiveClaimsForBuilder(req.builder.id),
|
|
90
|
+
lc().getEstVsActualRatio(req.builder.id, 10),
|
|
91
|
+
reward.getBuilderAchievements(req.builder.id),
|
|
92
|
+
reward.getLockedAchievementsProgress(req.builder.id),
|
|
93
|
+
reward.computeStreak(req.builder.id),
|
|
94
|
+
// Task #197: surface the builder's last 5 quality grades + rolling avg.
|
|
95
|
+
lc().recentGradesForBuilder(req.builder.id, 5),
|
|
96
|
+
// Grade-trend read via the grading port (ADR 0102); zero-grade shape when grading is off.
|
|
97
|
+
seams.resolveOptional('grade.builderRollingAvgGrade', async () => ({ n: 0, avg_score: 0, n_passed: 0 }))(req.builder.id, 14),
|
|
98
|
+
// V3.R75 (#294): the builder's own onboarding state, shaped for the
|
|
99
|
+
// /builders hall checklist. Save the client a follow-up call. Through the
|
|
100
|
+
// `onboarding` port (BV1.R81); null row when the module is off.
|
|
101
|
+
onboarding ? onboarding.getState(pool, req.builder.id) : null,
|
|
102
|
+
// #766: shipped-task count drives the onboarding 'ship_three' "N of 3"
|
|
103
|
+
// counter. Cheap COUNT; folded into the parallel fan-out.
|
|
104
|
+
lc().countShippedTasksForBuilder(req.builder.id),
|
|
105
|
+
// V3.R28 (#248): the builder's last 10 karma_log entries so the
|
|
106
|
+
// proposer's "karma feed" — the done-when from R28 — is visible
|
|
107
|
+
// without a follow-up call. Newest first; granted_by joined to
|
|
108
|
+
// builders so the UI can render "granted by @<login>".
|
|
109
|
+
db.recentKarmaForBuilder(req.builder.id, 10),
|
|
110
|
+
// V3.R26 (#246): rolling 30-day karma delta so the profile card can
|
|
111
|
+
// render the karma trend without a follow-up call.
|
|
112
|
+
db.karmaDelta30d(req.builder.id),
|
|
113
|
+
// F7 (ADR 0033): whether this builder has linked a Discord account, so the
|
|
114
|
+
// hall can render Connect-Discord vs the linked/Unlink state without a
|
|
115
|
+
// follow-up call. Boolean only — the discord_user_id itself is never sent
|
|
116
|
+
// to the client (it's PII the UI has no need for).
|
|
117
|
+
discordIsLinked(req.builder.id),
|
|
118
|
+
// #823: whether the builder's dev box has ever reported a live Claude
|
|
119
|
+
// process (first_connected_at). Auto-clears the onboarding 'box_connect'
|
|
120
|
+
// step — the monotonic "properly connected to the dev box" signal.
|
|
121
|
+
boxHasEverConnected(req.builder.id),
|
|
122
|
+
// #777: whether the builder has ever authenticated the GDS CLI (ran
|
|
123
|
+
// /builder-setup, or the box-connect bootstrap). Auto-clears the
|
|
124
|
+
// onboarding 'cli_setup' step — distinct from box_connect (#823: both
|
|
125
|
+
// steps have a place — connecting vs. signing the GDS in).
|
|
126
|
+
db.hasCliSession(req.builder.id),
|
|
127
|
+
// task 1268: the builder's behavior_prefs blob (the 'wandering' + 'render'
|
|
128
|
+
// knobs), resolved against builder.rank below so /me carries the effective
|
|
129
|
+
// level + its contract. The Conductor reads this to inject focus guidance.
|
|
130
|
+
// Through the builder-settings port (BV1.R80); {} when the module is off.
|
|
131
|
+
settings ? settings.getBuilderBehaviorPrefs(req.builder.id) : {},
|
|
132
|
+
// task 1013 / ADR 0073: does this builder have their OWN Gemini key stored
|
|
133
|
+
// (server-side, encrypted)? Drives the `needs` "image-generation key" item
|
|
134
|
+
// below — covered (newcomer) vs action-needed (Thetes+, no key) vs satisfied.
|
|
135
|
+
// Cheap single-row read; folded into the parallel fan-out.
|
|
136
|
+
// Own Gemini-key status via the art-pipeline port (ADR 0102) — the storage
|
|
137
|
+
// is art-pipeline domain now; degrades to a no-key shape on a vanilla instance.
|
|
138
|
+
seams.resolveOptional('art.getBuilderGeminiKeyRow', async () => ({ enc: null, last4: null, set_at: null }))(req.builder.id),
|
|
139
|
+
]);
|
|
140
|
+
// V3.R84 (#302), criterion C3: the builder's month-to-date spend vs their
|
|
141
|
+
// monthly budget. Surfaced here so the CLI (session-start ping) and the hall
|
|
142
|
+
// profile banner read it without a follow-up call; the ship + art-pipeline
|
|
143
|
+
// hard-cap refusal reads the same `level`. Best-effort — a cost-status read
|
|
144
|
+
// failure must never break the profile, so it defaults to null on error.
|
|
145
|
+
let costStatus = null;
|
|
146
|
+
try {
|
|
147
|
+
costStatus = await reward.getBuilderCostStatus(req.builder.id);
|
|
148
|
+
} catch (err) {
|
|
149
|
+
console.error('[gds] GET /me cost status', err);
|
|
150
|
+
}
|
|
151
|
+
// For each active claim, compute the streak preview (cheap; pool query).
|
|
152
|
+
// Lets the CLI render "shipping this would extend streak to N days" hints.
|
|
153
|
+
const activeClaimsWithPreview = await Promise.all(
|
|
154
|
+
activeClaims.map(async (c) => {
|
|
155
|
+
const preview = await reward.wouldExtendStreak(req.builder.id, c.task_id);
|
|
156
|
+
return { ...c, streak_preview: preview };
|
|
157
|
+
})
|
|
158
|
+
);
|
|
159
|
+
const payload = {
|
|
160
|
+
builder,
|
|
161
|
+
active_claims: activeClaimsWithPreview,
|
|
162
|
+
// Legacy field — first claim only. Prefer active_claims (plural).
|
|
163
|
+
active_claim: activeClaimsWithPreview[0] ?? null,
|
|
164
|
+
est_vs_actual: estVsActual,
|
|
165
|
+
unlocked,
|
|
166
|
+
locked_with_progress: lockedWithProgress,
|
|
167
|
+
streak: {
|
|
168
|
+
current: streakInfo.current_streak,
|
|
169
|
+
longest: streakInfo.longest_streak,
|
|
170
|
+
last_ship_day: streakInfo.last_ship_day,
|
|
171
|
+
started_on: streakInfo.current_started_on,
|
|
172
|
+
timezone: streakInfo.timezone,
|
|
173
|
+
today: streakInfo.today,
|
|
174
|
+
},
|
|
175
|
+
grades: {
|
|
176
|
+
recent: recentGrades,
|
|
177
|
+
rolling: builderAvg,
|
|
178
|
+
},
|
|
179
|
+
// V3.R28 (#248): karma feed — last 10 karma_log entries for this
|
|
180
|
+
// builder. `builder.karma` is the cached total; `karma.recent` is
|
|
181
|
+
// the audit trail (deltas, reasons, granters). Empty array when
|
|
182
|
+
// the builder has no karma events yet.
|
|
183
|
+
// V3.R26 (#246): `delta_30d` is the rolling 30-day karma sum so the
|
|
184
|
+
// profile card can show a trend without a follow-up call.
|
|
185
|
+
karma: {
|
|
186
|
+
recent: recentKarma,
|
|
187
|
+
delta_30d: karma30d,
|
|
188
|
+
},
|
|
189
|
+
// V3.R75 (#294): auto-completing onboarding checklist. Always present
|
|
190
|
+
// — when the row is missing (legacy builder, no event yet) shapeForApi
|
|
191
|
+
// returns a stage-1 "nothing cleared" view so the client renders the
|
|
192
|
+
// checklist either way. Through the `onboarding` port (BV1.R81); null when
|
|
193
|
+
// the module is off.
|
|
194
|
+
onboarding: onboarding ? onboarding.shapeForApi(onboardingRow, { shipCount, discordLinked: !!discordLink, boxConnected: !!boxConnected, cliAuthed: !!cliAuthed }) : null,
|
|
195
|
+
// F7 (ADR 0033): Discord link state for the hall's Connect/Unlink UI.
|
|
196
|
+
// `configured` tells the client whether the server even has Discord OAuth
|
|
197
|
+
// creds — when false the hall renders nothing (the start route 503s).
|
|
198
|
+
discord: {
|
|
199
|
+
linked: !!discordLink,
|
|
200
|
+
configured: auth.discordConfigured(),
|
|
201
|
+
},
|
|
202
|
+
// #853 (ADR 0041): when the temporary global grader bypass is ON, ship.js
|
|
203
|
+
// skips the subagent grader and confirms directly (the /tasks/:id/confirm
|
|
204
|
+
// gate is correspondingly relaxed to any-builder server-side). Default OFF
|
|
205
|
+
// — when unset the normal grader flow + ADR 0016 trust boundary hold.
|
|
206
|
+
grader_bypass: process.env.GRADER_BYPASS_ENABLED === '1',
|
|
207
|
+
// V3.R84 (#302), criterion C3: { spend_mtd_usd, budget_mtd_usd, pct_used,
|
|
208
|
+
// level } where level is ok|warn|over. budget_mtd_usd is null when the
|
|
209
|
+
// builder is uncapped (no cap set — the default; ADR 0085), in which case
|
|
210
|
+
// level is always 'ok'. The whole object is null only if the read errored.
|
|
211
|
+
cost: costStatus,
|
|
212
|
+
// task 1268: the per-builder "wandering" knob, resolved to an effective
|
|
213
|
+
// level (clamped by rank) + its behavior contract. The Conductor + the
|
|
214
|
+
// /settings UI read this; the builder-settings port's describeWandering is
|
|
215
|
+
// the SSOT (BV1.R80). null when the prefs module is off.
|
|
216
|
+
wandering: settings ? settings.describeWandering(behaviorPrefs, builder.rank) : null,
|
|
217
|
+
// task 2010: the per-builder interaction profile (tone / technical level /
|
|
218
|
+
// toolchain familiarity), resolved to an effective profile + an injectable
|
|
219
|
+
// contract. The old §2 "The Prompter" owner-defaults, now per-builder. The
|
|
220
|
+
// session-start injection + /settings UI read this; describeInteraction is
|
|
221
|
+
// the SSOT (builder-settings port). null when the prefs module is off.
|
|
222
|
+
interaction: settings && settings.describeInteraction ? settings.describeInteraction(behaviorPrefs) : null,
|
|
223
|
+
// task 2011: the resolved subagent model allocation (main + subagent tiers),
|
|
224
|
+
// builder override → instance default (branding.models) → code default. The
|
|
225
|
+
// agent consults `effective` when spawning subagents; §2 links here.
|
|
226
|
+
model_allocation: settings && settings.describeModelAllocation
|
|
227
|
+
? settings.describeModelAllocation(behaviorPrefs, (() => { try { return branding().models || {}; } catch { return {}; } })())
|
|
228
|
+
: null,
|
|
229
|
+
// task 1279: the per-builder "render widgets" knob (shares behavior_prefs).
|
|
230
|
+
// { widgets_enabled } tells the start/claim/ship CLIs whether to emit the
|
|
231
|
+
// rich HTML card or the cheap text fallback. No rank cap (cost/taste, not
|
|
232
|
+
// trust); default ON. The builder-settings port's describeRender is the SSOT.
|
|
233
|
+
render: settings ? settings.describeRender(behaviorPrefs) : null,
|
|
234
|
+
// task 1013 / ADR 0073: the consistent "the system needs an input from you"
|
|
235
|
+
// list. Today one item — the image-generation key — in one of three states
|
|
236
|
+
// (covered | action_needed | satisfied). The hall Standing card + the CLI
|
|
237
|
+
// session nudge render this SAME shape; the builder-settings port's
|
|
238
|
+
// computeNeeds is the SSOT (BV1.R80). [] when the prefs module is off.
|
|
239
|
+
needs: settings ? settings.computeNeeds({
|
|
240
|
+
rank: builder?.rank,
|
|
241
|
+
ownKeySet: !!(geminiKeyRow && geminiKeyRow.enc),
|
|
242
|
+
sharedKeyConfigured: artSharedKeyConfigured(),
|
|
243
|
+
}) : [],
|
|
244
|
+
};
|
|
245
|
+
// Module→core contribution seam (BV1.R42, ADR 0083). Let each enabled module
|
|
246
|
+
// add its own profile slice instead of core hardcoding it — the strangler
|
|
247
|
+
// prerequisite that lets dev-box/discord/art leave this route. ADD-ONLY (core
|
|
248
|
+
// keys win); a collision means a move task took over a core key without
|
|
249
|
+
// dropping the core copy. Empty until a module registers → byte-identical today.
|
|
250
|
+
const slices = await seams.collectContributions('profile.fields', {
|
|
251
|
+
builderId: req.builder.id, builder, req,
|
|
252
|
+
});
|
|
253
|
+
const { collisions } = seams.mergeContributions(payload, slices);
|
|
254
|
+
for (const k of collisions) {
|
|
255
|
+
console.error(`[gds] /me profile contribution tried to overwrite core key "${k}" — ignored`);
|
|
256
|
+
}
|
|
257
|
+
res.json(payload);
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
// Self-service edit of the authenticated builder's preferred disciplines
|
|
261
|
+
// (migrations 027 + 086 / V3.R80). Body: { preferred_disciplines: ["artist", ...] }.
|
|
262
|
+
// Valid elements are engineer|artist|ideator; [] clears the preference (a
|
|
263
|
+
// multi-element set just means several lanes). No rank gate — a builder owns their own
|
|
264
|
+
// profile. 422 invalid_discipline if any element is out of range.
|
|
265
|
+
// rank: any-builder — self-service profile edit; documented "no rank gate" in the
|
|
266
|
+
// handler comment above (a builder owns their own preference).
|
|
267
|
+
router.patch('/me/disciplines', auth.requireBuilder, async (req, res) => {
|
|
268
|
+
if (validateOrRespond(req, res, {
|
|
269
|
+
preferred_disciplines: { required: true, type: 'array', maxItems: 16, itemsType: 'string' },
|
|
270
|
+
})) return;
|
|
271
|
+
const input = req.body?.preferred_disciplines;
|
|
272
|
+
if (!Array.isArray(input)) {
|
|
273
|
+
return res.fail('preferred_disciplines must be an array', 400);
|
|
274
|
+
}
|
|
275
|
+
try {
|
|
276
|
+
const builder = await db.updateBuilderDisciplines(req.builder.id, input);
|
|
277
|
+
// The onboarding state machine carved into modules/onboarding/ (BV1.R81 /
|
|
278
|
+
// ADR 0093 §1): resolve the `onboarding` kernel port for the mark + echo —
|
|
279
|
+
// never a direct require of a module. Default-on (present in prod); degrades
|
|
280
|
+
// to a null state row (shapeForApi synthesizes the "nothing cleared" view).
|
|
281
|
+
const onboardingPort = seams.resolveOptional('onboarding');
|
|
282
|
+
// Picking a craft is an onboarding milestone (the 'pick_disciplines'
|
|
283
|
+
// stage). Only a non-empty selection counts as "chosen" — clearing the
|
|
284
|
+
// preference ([]) is not a milestone. safeMarkStage is idempotent and
|
|
285
|
+
// swallows errors so onboarding plumbing never breaks the profile save.
|
|
286
|
+
if (onboardingPort && Array.isArray(input) && input.length > 0) {
|
|
287
|
+
await onboardingPort.safeMarkStage(pool, req.builder.id, 'pick_disciplines', req.builder);
|
|
288
|
+
}
|
|
289
|
+
// Echo the onboarding state back so the hall's path checklist can tick
|
|
290
|
+
// this step off without a follow-up /me round-trip.
|
|
291
|
+
const [state, shipCount, discordLink, boxConnected, cliAuthed] = await Promise.all([
|
|
292
|
+
onboardingPort ? onboardingPort.getState(pool, req.builder.id) : null,
|
|
293
|
+
lc().countShippedTasksForBuilder(req.builder.id),
|
|
294
|
+
discordIsLinked(req.builder.id),
|
|
295
|
+
boxHasEverConnected(req.builder.id),
|
|
296
|
+
db.hasCliSession(req.builder.id),
|
|
297
|
+
]);
|
|
298
|
+
const onboarding = onboardingPort ? onboardingPort.shapeForApi(state, { shipCount, discordLinked: !!discordLink, boxConnected: !!boxConnected, cliAuthed: !!cliAuthed }) : null;
|
|
299
|
+
res.json({ builder, onboarding });
|
|
300
|
+
} catch (err) {
|
|
301
|
+
if (err.code === 'invalid_discipline') {
|
|
302
|
+
return res.fail('invalid_discipline', 422, { bad: err.bad });
|
|
303
|
+
}
|
|
304
|
+
throw err;
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
// V3.R10 (#235), criterion C3 — link the authed builder's Anthropic account.
|
|
309
|
+
// Body: { anthropic_email, anthropic_user_id }. Self-attestation: the builder's
|
|
310
|
+
// own Claude Code reads ~/.claude.json oauthAccount during /builder-setup,
|
|
311
|
+
// confirms the email locally (aborting setup on mismatch), then POSTs the
|
|
312
|
+
// attested pair here. anthropic_user_id (accountUuid) is stored as optional
|
|
313
|
+
// cosmetic attribution only — the X-Anthropic-User identity pin was removed
|
|
314
|
+
// (task 1039 / idea 258), so it is no longer an auth boundary.
|
|
315
|
+
//
|
|
316
|
+
// rank: any-builder — own identity attestation; same posture as /me/disciplines.
|
|
317
|
+
// A builder can only ever write their OWN row (req.builder.id), so there is no
|
|
318
|
+
// cross-builder attribution risk. 422 if email/id are missing or malformed.
|
|
319
|
+
router.post('/me/anthropic-link', auth.requireBuilder, async (req, res) => {
|
|
320
|
+
if (validateOrRespond(req, res, {
|
|
321
|
+
anthropic_email: { required: true, type: 'string', minLength: 3, maxLength: 320 },
|
|
322
|
+
anthropic_user_id: { required: true, type: 'string', minLength: 1, maxLength: 128 },
|
|
323
|
+
})) return;
|
|
324
|
+
const email = String(req.body.anthropic_email).trim();
|
|
325
|
+
const userId = String(req.body.anthropic_user_id).trim();
|
|
326
|
+
if (!email.includes('@')) {
|
|
327
|
+
return res.fail('invalid_email', 422);
|
|
328
|
+
}
|
|
329
|
+
try {
|
|
330
|
+
const linked = await db.linkAnthropicAccount(req.builder.id, { email, userId });
|
|
331
|
+
res.json({ linked });
|
|
332
|
+
} catch (err) {
|
|
333
|
+
console.error('[gds] POST /me/anthropic-link', err);
|
|
334
|
+
res.fail('link_failed', { status: 500, message: 'internal error' });
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
// The builder's unlocked achievements (joined to achievement metadata).
|
|
339
|
+
// K1 (achievement evaluator) is shipped; rows here are real unlock events.
|
|
340
|
+
// rank: any-builder — own unlocked achievements.
|
|
341
|
+
router.get('/me/achievements', auth.requireBuilder, async (req, res) => {
|
|
342
|
+
const unlocked = await seams.resolveOptional('reward').getBuilderAchievements(req.builder.id);
|
|
343
|
+
res.json({ unlocked });
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
// Tasks this builder has shipped, most recent first.
|
|
347
|
+
// ?limit=all returns every shipped task for this builder (the /builders UI
|
|
348
|
+
// uses this to render the full "Works Wrought by Thy Hand" ledger). Numeric
|
|
349
|
+
// limits are clamped to 1..500.
|
|
350
|
+
// rank: any-builder — own shipped-task ledger.
|
|
351
|
+
router.get('/me/recent-ships', auth.requireBuilder, async (req, res) => {
|
|
352
|
+
const raw = req.query.limit;
|
|
353
|
+
const limit = String(raw).toLowerCase() === 'all'
|
|
354
|
+
? 100000
|
|
355
|
+
: Math.min(Math.max(Number(raw) || 10, 1), 500);
|
|
356
|
+
const ships = await lc().recentShippedTasksByBuilder(req.builder.id, limit);
|
|
357
|
+
res.json({ ships });
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
// All seeded achievements — lets /builders render locked + unlocked side by side.
|
|
361
|
+
// rank: any-builder — global achievement catalog (locked + unlocked rendering).
|
|
362
|
+
router.get('/achievements', auth.requireBuilder, async (_req, res) => {
|
|
363
|
+
const achievements = await seams.resolveOptional('reward').listAchievements();
|
|
364
|
+
res.json({ achievements });
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
// The five per-builder PREFERENCE routes — /me/skill-prefs, /me/sound-prefs,
|
|
368
|
+
// /me/event-sound-prefs, /me/wandering, /me/render (GET + PATCH each) — moved to
|
|
369
|
+
// modules/builder-settings/routes/settings.js (BV1.R80 / ADR 0093 §1). They keep
|
|
370
|
+
// their exact /me/* paths (the loader mounts that router on this same /api/gds
|
|
371
|
+
// router, before the public catch-all), so the API is byte-identical. The GET
|
|
372
|
+
// /me aggregator above stays here as a thin facade resolving the
|
|
373
|
+
// `builder-settings` port for its wandering/render/needs slices (02-module-map §2).
|
|
374
|
+
|
|
375
|
+
// Art-key routes (GET/PUT/DELETE /me/art-key, GET /me/art-key/own,
|
|
376
|
+
// POST /me/art-key/storage-init) moved to modules/art-pipeline/routes/art-key.js
|
|
377
|
+
// (task 1417 / BV1.R48). Mounted by the loader when art-pipeline is enabled.
|
|
378
|
+
|
|
379
|
+
return router;
|
|
380
|
+
};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
// src/gds/routes/modules.js — the hall "Modules" tab backend (ADR 0107 §9,
|
|
2
|
+
// task 1776). Three jobs, matching the ADR:
|
|
3
|
+
//
|
|
4
|
+
// GET /modules list every on-disk module: enabled state,
|
|
5
|
+
// attribution (author/origin/license/maintainer),
|
|
6
|
+
// and provenance (own-built vs core-loaded —
|
|
7
|
+
// src/module-loader/provenance.js).
|
|
8
|
+
// POST /modules/:key/enable toggle config/modules.json's instance overlay
|
|
9
|
+
// and reload the live process (§6: default-off
|
|
10
|
+
// respected — this only ever flips an existing
|
|
11
|
+
// module's flag, never invents a new key).
|
|
12
|
+
// POST /modules/:key/submit the "submit for review" front door (§1). The
|
|
13
|
+
// submit pipeline (task 1770) hasn't landed yet,
|
|
14
|
+
// so this is a clear 501 stub, not a fake queue —
|
|
15
|
+
// the button lights up for real once 1770 ships.
|
|
16
|
+
//
|
|
17
|
+
// Read is open to any signed-in builder (same gate as the atlas/primer pages);
|
|
18
|
+
// the write (enable/disable) is metic+archon, same rank as /backup/trigger —
|
|
19
|
+
// it changes running behavior for the whole instance, not just the caller.
|
|
20
|
+
//
|
|
21
|
+
// Persistence note: this writes config/modules.json on disk and reloads the
|
|
22
|
+
// in-process cache, so the effect is immediate on this box. Like any other
|
|
23
|
+
// hand-edit of that file, surviving the next `git reset --hard` deploy needs
|
|
24
|
+
// the change committed — this route does not auto-commit (an HTTP handler
|
|
25
|
+
// auto-pushing to main bypasses the ship/grade/deploy pipeline, which the
|
|
26
|
+
// project's trust boundary treats as a bigger risk than a toggle that needs a
|
|
27
|
+
// human/agent to land it properly). Captured as a follow-up idea: durable
|
|
28
|
+
// (DB-backed) module enablement that survives a deploy with no extra step.
|
|
29
|
+
|
|
30
|
+
const express = require('express');
|
|
31
|
+
const fs = require('node:fs');
|
|
32
|
+
const path = require('node:path');
|
|
33
|
+
const auth = require('../auth');
|
|
34
|
+
const { asyncHandler, validateOrRespond } = require('./_helpers');
|
|
35
|
+
const loader = require('../../module-loader/loader');
|
|
36
|
+
const { deriveProvenance } = require('../../module-loader/provenance');
|
|
37
|
+
const modulesLib = require('../../modules');
|
|
38
|
+
|
|
39
|
+
function ownProjectName() {
|
|
40
|
+
try { return require('../../branding').branding().identity.productName; } catch { return null; }
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function readInstanceConfig() {
|
|
44
|
+
try { return JSON.parse(fs.readFileSync(modulesLib.INSTANCE_PATH, 'utf8')); }
|
|
45
|
+
catch (e) { if (e.code === 'ENOENT') return { modules: {} }; throw e; }
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function listModules() {
|
|
49
|
+
const { loaded } = loader.discoverModules();
|
|
50
|
+
const enabledSet = modulesLib.modules();
|
|
51
|
+
const own = ownProjectName();
|
|
52
|
+
return loaded.map(({ key, manifest }) => {
|
|
53
|
+
const provenance = deriveProvenance(manifest.origin, own);
|
|
54
|
+
return {
|
|
55
|
+
key,
|
|
56
|
+
title: manifest.title,
|
|
57
|
+
description: manifest.description,
|
|
58
|
+
default: manifest.default === true,
|
|
59
|
+
enabled: enabledSet[key] === true,
|
|
60
|
+
coreVersion: manifest.coreVersion,
|
|
61
|
+
contributes: manifest.contributes || {},
|
|
62
|
+
provenance,
|
|
63
|
+
author: manifest.author || null,
|
|
64
|
+
origin: manifest.origin || null,
|
|
65
|
+
license: manifest.license || null,
|
|
66
|
+
maintainer: manifest.maintainer || null,
|
|
67
|
+
};
|
|
68
|
+
}).sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
module.exports = function buildModulesRouter() {
|
|
72
|
+
const router = express.Router();
|
|
73
|
+
|
|
74
|
+
// rank: any-builder — list every on-disk module with attribution + provenance (same read gate as the atlas/primer pages).
|
|
75
|
+
router.get('/modules', auth.requireBuilder, asyncHandler('GET /modules', async (_req, res) => {
|
|
76
|
+
const all = listModules();
|
|
77
|
+
res.json({
|
|
78
|
+
modules: all,
|
|
79
|
+
own_built: all.filter((m) => m.provenance === 'own').length,
|
|
80
|
+
core_loaded: all.filter((m) => m.provenance === 'core').length,
|
|
81
|
+
submit_pipeline_live: false, // flips true once task 1770 ships
|
|
82
|
+
});
|
|
83
|
+
}));
|
|
84
|
+
|
|
85
|
+
// rank: metic+archon — toggling a module changes running behavior for the whole instance, not just the caller.
|
|
86
|
+
router.post('/modules/:key/enable', auth.requireBuilder, auth.requireRank('metic', 'archon'),
|
|
87
|
+
asyncHandler('POST /modules/:key/enable', async (req, res) => {
|
|
88
|
+
const { key } = req.params;
|
|
89
|
+
if (validateOrRespond(req, res, { enabled: {} })) return; // boolean; enforced by the handler check below (preserves invalid_body)
|
|
90
|
+
const { enabled } = req.body || {};
|
|
91
|
+
if (typeof enabled !== 'boolean') {
|
|
92
|
+
return res.fail('invalid_body', { status: 400, message: '"enabled" must be a boolean.' });
|
|
93
|
+
}
|
|
94
|
+
const known = listModules();
|
|
95
|
+
const target = known.find((m) => m.key === key);
|
|
96
|
+
if (!target) {
|
|
97
|
+
return res.fail('not_found', { status: 404, message: `No on-disk module "${key}" — only a real modules/<key>/ can be toggled.` });
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const cfg = readInstanceConfig();
|
|
101
|
+
if (!cfg.modules || typeof cfg.modules !== 'object') cfg.modules = {};
|
|
102
|
+
cfg.modules[key] = enabled;
|
|
103
|
+
fs.mkdirSync(path.dirname(modulesLib.INSTANCE_PATH), { recursive: true });
|
|
104
|
+
fs.writeFileSync(modulesLib.INSTANCE_PATH, JSON.stringify(cfg, null, 2) + '\n');
|
|
105
|
+
modulesLib.reload();
|
|
106
|
+
|
|
107
|
+
console.log(`[gds] module "${key}" ${enabled ? 'enabled' : 'disabled'} by builder ${req.builder && req.builder.id}`);
|
|
108
|
+
res.json({ ok: true, key, enabled, note: 'Live on this box now. Persisting past the next deploy needs config/modules.json committed.' });
|
|
109
|
+
}));
|
|
110
|
+
|
|
111
|
+
// rank: metic+archon — the "submit this module for review" front door (501 until the submit pipeline, task 1770, ships).
|
|
112
|
+
router.post('/modules/:key/submit', auth.requireBuilder, auth.requireRank('metic', 'archon'),
|
|
113
|
+
asyncHandler('POST /modules/:key/submit', async (req, res) => {
|
|
114
|
+
const { key } = req.params;
|
|
115
|
+
const known = listModules();
|
|
116
|
+
if (!known.find((m) => m.key === key)) {
|
|
117
|
+
return res.fail('not_found', { status: 404, message: `No on-disk module "${key}".` });
|
|
118
|
+
}
|
|
119
|
+
res.fail('not_yet_available', {
|
|
120
|
+
status: 501,
|
|
121
|
+
message: 'The module-submit pipeline (bongos module submit → core review queue) is not live yet — tracked by task 1770 (ADR 0107 §8/§9). This front door will call straight through once it ships.',
|
|
122
|
+
});
|
|
123
|
+
}));
|
|
124
|
+
|
|
125
|
+
return router;
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
// Exposed for tests (tests/module_provenance.mjs) — pure-ish (fs + the loader's
|
|
129
|
+
// own disk scan, no DB), so it's safe to require directly outside an Express
|
|
130
|
+
// request cycle, the same way tests/atlas.mjs requires gen-atlas.js's builders.
|
|
131
|
+
module.exports.listModules = listModules;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
const express = require('express');
|
|
2
|
+
const auth = require('../auth');
|
|
3
|
+
const optimizer = require('../optimizer');
|
|
4
|
+
const { validateOrRespond } = require('./_helpers');
|
|
5
|
+
|
|
6
|
+
module.exports = function buildOptimizerRouter() {
|
|
7
|
+
const router = express.Router();
|
|
8
|
+
|
|
9
|
+
// rank: any-builder — pick own next work; the optimizer reads/recommends only.
|
|
10
|
+
router.post('/session/optimize', auth.requireBuilder, async (req, res) => {
|
|
11
|
+
if (validateOrRespond(req, res, {
|
|
12
|
+
mode: { type: 'string', maxLength: 64 },
|
|
13
|
+
// time_budget_min / max_parallel can come in as number OR string from
|
|
14
|
+
// the web UI — leave Number() coercion inline; just enforce sane shape.
|
|
15
|
+
// Declared untyped so strict-mode (R11/#1998) accepts either form.
|
|
16
|
+
time_budget_min: {},
|
|
17
|
+
max_parallel: {},
|
|
18
|
+
})) return;
|
|
19
|
+
const body = req.body || {};
|
|
20
|
+
const mode = body.mode;
|
|
21
|
+
const timeBudgetMin = Number(body.time_budget_min);
|
|
22
|
+
const maxParallel = body.max_parallel != null ? Number(body.max_parallel) : optimizer.DEFAULT_MAX_PARALLEL;
|
|
23
|
+
|
|
24
|
+
if (!optimizer.VALID_MODES.includes(mode)) {
|
|
25
|
+
return res.fail('bad_mode', 400, { valid_modes: optimizer.VALID_MODES });
|
|
26
|
+
}
|
|
27
|
+
if (!Number.isFinite(timeBudgetMin) || timeBudgetMin <= 0) {
|
|
28
|
+
return res.fail('bad_time_budget_min', 400);
|
|
29
|
+
}
|
|
30
|
+
if (!Number.isFinite(maxParallel) || maxParallel <= 0) {
|
|
31
|
+
return res.fail('bad_max_parallel', 400);
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const result = await optimizer.optimizeSession({
|
|
35
|
+
builderId: req.builder.id,
|
|
36
|
+
mode,
|
|
37
|
+
timeBudgetMin,
|
|
38
|
+
maxParallel,
|
|
39
|
+
});
|
|
40
|
+
res.json(result);
|
|
41
|
+
} catch (err) {
|
|
42
|
+
if (err && err.code === 'BAD_MODE') {
|
|
43
|
+
return res.fail('bad_mode', 400, { valid_modes: err.validModes });
|
|
44
|
+
}
|
|
45
|
+
if (err && err.code === 'BAD_TIME_BUDGET') {
|
|
46
|
+
return res.fail('bad_time_budget_min', 400);
|
|
47
|
+
}
|
|
48
|
+
console.error('[gds] POST /session/optimize', err);
|
|
49
|
+
res.fail('optimize_failed', { status: 500, message: 'internal error' });
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
return router;
|
|
54
|
+
};
|