voidforge-build 23.9.1
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/dist/.claude/agents/adolin-brand.md +40 -0
- package/dist/.claude/agents/ahsoka-access-control.md +56 -0
- package/dist/.claude/agents/alfred-dependencies.md +43 -0
- package/dist/.claude/agents/alia-threat-detect.md +40 -0
- package/dist/.claude/agents/anakin-dark-side.md +41 -0
- package/dist/.claude/agents/aquaman-deep-dive.md +43 -0
- package/dist/.claude/agents/aragorn-orchestration.md +39 -0
- package/dist/.claude/agents/archer-greenfield.md +48 -0
- package/dist/.claude/agents/armin-clever.md +39 -0
- package/dist/.claude/agents/arwen-ui-polish.md +42 -0
- package/dist/.claude/agents/ashitaka-tech-debt.md +39 -0
- package/dist/.claude/agents/asuka-performance.md +39 -0
- package/dist/.claude/agents/bail-organa-governance.md +37 -0
- package/dist/.claude/agents/banner-database.md +44 -0
- package/dist/.claude/agents/barton-smoke-test.md +59 -0
- package/dist/.claude/agents/bashir-field-medic.md +63 -0
- package/dist/.claude/agents/batgirl-detail.md +43 -0
- package/dist/.claude/agents/batman-qa.md +73 -0
- package/dist/.claude/agents/bayta-evals.md +41 -0
- package/dist/.claude/agents/beast-boy-cross-env.md +43 -0
- package/dist/.claude/agents/beerus-destroyer.md +39 -0
- package/dist/.claude/agents/bel-riose-orchestration.md +40 -0
- package/dist/.claude/agents/beru-subprocess.md +37 -0
- package/dist/.claude/agents/bilbo-microcopy.md +43 -0
- package/dist/.claude/agents/black-canary-monitoring.md +43 -0
- package/dist/.claude/agents/bliss-ai-safety.md +40 -0
- package/dist/.claude/agents/bo-katan-perimeter.md +40 -0
- package/dist/.claude/agents/bombadil-forge-sync.md +62 -0
- package/dist/.claude/agents/boromir-hubris.md +40 -0
- package/dist/.claude/agents/breeze-platform-relations.md +40 -0
- package/dist/.claude/agents/bucky-legacy.md +43 -0
- package/dist/.claude/agents/bulma-engineering.md +40 -0
- package/dist/.claude/agents/calcifer-daemon.md +39 -0
- package/dist/.claude/agents/cara-dune-enforcement.md +37 -0
- package/dist/.claude/agents/cassian-recon.md +37 -0
- package/dist/.claude/agents/cc-persistent-process.md +39 -0
- package/dist/.claude/agents/celeborn-design-system.md +40 -0
- package/dist/.claude/agents/celebrimbor-forge-artist.md +62 -0
- package/dist/.claude/agents/chakotay-bridge.md +47 -0
- package/dist/.claude/agents/chani-worm-rider.md +61 -0
- package/dist/.claude/agents/chewie-dependency-audit.md +41 -0
- package/dist/.claude/agents/chrome-discovery.md +37 -0
- package/dist/.claude/agents/constantine-cursed-code.md +59 -0
- package/dist/.claude/agents/coulson-release.md +64 -0
- package/dist/.claude/agents/crusher-diagnostics.md +48 -0
- package/dist/.claude/agents/cyborg-system-integration.md +43 -0
- package/dist/.claude/agents/dalinar-positioning.md +40 -0
- package/dist/.claude/agents/daneel-model-migration.md +40 -0
- package/dist/.claude/agents/data-tech-debt.md +48 -0
- package/dist/.claude/agents/dax-legacy-wisdom.md +48 -0
- package/dist/.claude/agents/deathstroke-adversarial.md +59 -0
- package/dist/.claude/agents/denji-determination.md +39 -0
- package/dist/.claude/agents/din-djarin-bounty.md +42 -0
- package/dist/.claude/agents/dockson-treasury.md +67 -0
- package/dist/.claude/agents/dori-integration-check.md +37 -0
- package/dist/.claude/agents/dors-observability.md +40 -0
- package/dist/.claude/agents/drax-exact-match.md +42 -0
- package/dist/.claude/agents/ducem-token-economics.md +41 -0
- package/dist/.claude/agents/duncan-relay.md +40 -0
- package/dist/.claude/agents/duo-teardown.md +38 -0
- package/dist/.claude/agents/ed-network-scan.md +38 -0
- package/dist/.claude/agents/elrond-ux-strategy.md +39 -0
- package/dist/.claude/agents/eowyn-delight.md +56 -0
- package/dist/.claude/agents/erwin-strategy.md +39 -0
- package/dist/.claude/agents/ezra-catches-missed.md +40 -0
- package/dist/.claude/agents/ezri-session-analyst.md +45 -0
- package/dist/.claude/agents/falcon-migration.md +43 -0
- package/dist/.claude/agents/faramir-judgment.md +40 -0
- package/dist/.claude/agents/faye-resourceful.md +39 -0
- package/dist/.claude/agents/fenring-passive-monitor.md +37 -0
- package/dist/.claude/agents/fern-protocol.md +37 -0
- package/dist/.claude/agents/feyd-adversarial.md +41 -0
- package/dist/.claude/agents/flash-rapid-test.md +43 -0
- package/dist/.claude/agents/friday-automation.md +42 -0
- package/dist/.claude/agents/frieren-long-term.md +39 -0
- package/dist/.claude/agents/frodo-critical-path.md +40 -0
- package/dist/.claude/agents/fury-initiative.md +65 -0
- package/dist/.claude/agents/gaal-prompt-arch.md +41 -0
- package/dist/.claude/agents/galadriel-frontend.md +69 -0
- package/dist/.claude/agents/gamora-perf-assassin.md +43 -0
- package/dist/.claude/agents/gandalf-setup-wizard.md +63 -0
- package/dist/.claude/agents/gen-docs.md +37 -0
- package/dist/.claude/agents/ghanima-paired-monitor.md +37 -0
- package/dist/.claude/agents/gimli-performance.md +41 -0
- package/dist/.claude/agents/giyu-silent-guard.md +39 -0
- package/dist/.claude/agents/glorfindel-rendering.md +40 -0
- package/dist/.claude/agents/gohan-hidden-power.md +39 -0
- package/dist/.claude/agents/gojo-infinite-scale.md +39 -0
- package/dist/.claude/agents/goku-scaling.md +39 -0
- package/dist/.claude/agents/goldberry-change-detect.md +37 -0
- package/dist/.claude/agents/gordon-escalation.md +42 -0
- package/dist/.claude/agents/green-arrow-precision.md +43 -0
- package/dist/.claude/agents/green-lantern-scenarios.md +43 -0
- package/dist/.claude/agents/grogu-tiny-vulns.md +38 -0
- package/dist/.claude/agents/groot-caching.md +43 -0
- package/dist/.claude/agents/gurney-delivery.md +40 -0
- package/dist/.claude/agents/haku-deploy-wizard.md +65 -0
- package/dist/.claude/agents/haldir-boundaries.md +40 -0
- package/dist/.claude/agents/han-vuln-hunter.md +40 -0
- package/dist/.claude/agents/hange-experimentation.md +39 -0
- package/dist/.claude/agents/harah-protocol.md +38 -0
- package/dist/.claude/agents/hawkgirl-regression-sweep.md +43 -0
- package/dist/.claude/agents/heero-mission-deploy.md +39 -0
- package/dist/.claude/agents/hera-navigation.md +41 -0
- package/dist/.claude/agents/hill-mission-control.md +43 -0
- package/dist/.claude/agents/himmel-legacy.md +37 -0
- package/dist/.claude/agents/hober-tool-schema.md +40 -0
- package/dist/.claude/agents/hoid-copywriting.md +40 -0
- package/dist/.claude/agents/howl-migration.md +39 -0
- package/dist/.claude/agents/hughes-observability.md +37 -0
- package/dist/.claude/agents/huntress-flaky-bugs.md +42 -0
- package/dist/.claude/agents/irulan-historian.md +37 -0
- package/dist/.claude/agents/jake-reporter.md +45 -0
- package/dist/.claude/agents/janeway-novel-arch.md +48 -0
- package/dist/.claude/agents/janov-context-eng.md +40 -0
- package/dist/.claude/agents/jarvis-status.md +42 -0
- package/dist/.claude/agents/jean-pragmatic.md +39 -0
- package/dist/.claude/agents/jessica-voice.md +40 -0
- package/dist/.claude/agents/jet-maintenance.md +39 -0
- package/dist/.claude/agents/jin-disciplined-adv.md +39 -0
- package/dist/.claude/agents/kaji-intelligence.md +39 -0
- package/dist/.claude/agents/kaladin-organic-growth.md +40 -0
- package/dist/.claude/agents/kallen-hard-deploy.md +39 -0
- package/dist/.claude/agents/kanan-intuitive.md +41 -0
- package/dist/.claude/agents/kaoru-harmony.md +37 -0
- package/dist/.claude/agents/kaworu-solver.md +39 -0
- package/dist/.claude/agents/kelsier-growth.md +64 -0
- package/dist/.claude/agents/kenobi-security.md +70 -0
- package/dist/.claude/agents/kim-api-design.md +49 -0
- package/dist/.claude/agents/kira-pragmatic.md +48 -0
- package/dist/.claude/agents/kishibe-hardening.md +39 -0
- package/dist/.claude/agents/kohaku-rapid-response.md +36 -0
- package/dist/.claude/agents/krillin-support.md +36 -0
- package/dist/.claude/agents/kusanagi-devops.md +70 -0
- package/dist/.claude/agents/la-forge-reliability.md +63 -0
- package/dist/.claude/agents/lang-micro-changes.md +43 -0
- package/dist/.claude/agents/legolas-precision.md +42 -0
- package/dist/.claude/agents/leia-secrets.md +41 -0
- package/dist/.claude/agents/lelouch-orchestration.md +39 -0
- package/dist/.claude/agents/leto-ii-persistence.md +40 -0
- package/dist/.claude/agents/leto-protection.md +40 -0
- package/dist/.claude/agents/levi-deploy.md +40 -0
- package/dist/.claude/agents/liet-kynes-deep-system.md +40 -0
- package/dist/.claude/agents/lift-social-media.md +40 -0
- package/dist/.claude/agents/loki-chaos.md +58 -0
- package/dist/.claude/agents/lucius-config.md +43 -0
- package/dist/.claude/agents/luke-audit-journey.md +41 -0
- package/dist/.claude/agents/manhunter-shapeshifting.md +43 -0
- package/dist/.claude/agents/marsh-competitive-intel.md +41 -0
- package/dist/.claude/agents/maul-red-team.md +57 -0
- package/dist/.claude/agents/merry-pair-review.md +40 -0
- package/dist/.claude/agents/mikasa-protection.md +39 -0
- package/dist/.claude/agents/miles-teg-perf.md +40 -0
- package/dist/.claude/agents/milim-load-test.md +39 -0
- package/dist/.claude/agents/misato-operations.md +39 -0
- package/dist/.claude/agents/mob-capacity.md +39 -0
- package/dist/.claude/agents/mohiam-authentication.md +40 -0
- package/dist/.claude/agents/mon-mothma-security-mgmt.md +41 -0
- package/dist/.claude/agents/mugen-chaos.md +39 -0
- package/dist/.claude/agents/mule-adversarial-ai.md +41 -0
- package/dist/.claude/agents/mustang-cleanup.md +39 -0
- package/dist/.claude/agents/nanami-structured-ops.md +39 -0
- package/dist/.claude/agents/nausicaa-resources.md +39 -0
- package/dist/.claude/agents/navani-technical-seo.md +40 -0
- package/dist/.claude/agents/nebula-optimization.md +43 -0
- package/dist/.claude/agents/nightwing-regression.md +59 -0
- package/dist/.claude/agents/nobara-direct-fix.md +39 -0
- package/dist/.claude/agents/nog-solutions.md +48 -0
- package/dist/.claude/agents/nori-asset-scanner.md +37 -0
- package/dist/.claude/agents/obrien-root-cause.md +48 -0
- package/dist/.claude/agents/odo-structural-anomaly.md +48 -0
- package/dist/.claude/agents/okoye-data-integrity.md +43 -0
- package/dist/.claude/agents/olivier-hardening.md +39 -0
- package/dist/.claude/agents/oracle-static-analysis.md +59 -0
- package/dist/.claude/agents/ori-prompt-crafter.md +37 -0
- package/dist/.claude/agents/padme-data-protection.md +42 -0
- package/dist/.claude/agents/paris-route-planner.md +47 -0
- package/dist/.claude/agents/parker-connections.md +43 -0
- package/dist/.claude/agents/paul-orchestration.md +40 -0
- package/dist/.claude/agents/picard-architecture.md +64 -0
- package/dist/.claude/agents/piccolo-tactics.md +39 -0
- package/dist/.claude/agents/pike-bold-decisions.md +48 -0
- package/dist/.claude/agents/pippin-discovery.md +40 -0
- package/dist/.claude/agents/plo-koon-edge-cases.md +37 -0
- package/dist/.claude/agents/power-chaotic.md +39 -0
- package/dist/.claude/agents/qui-gon-subtle-vulns.md +40 -0
- package/dist/.claude/agents/radagast-edge-cases.md +41 -0
- package/dist/.claude/agents/raoden-conversion.md +41 -0
- package/dist/.claude/agents/raven-deep-analysis.md +43 -0
- package/dist/.claude/agents/red-hood-aggressive.md +47 -0
- package/dist/.claude/agents/rei-dangerous-tasks.md +39 -0
- package/dist/.claude/agents/reigen-debugger.md +39 -0
- package/dist/.claude/agents/rengoku-intense-monitor.md +39 -0
- package/dist/.claude/agents/rex-infrastructure.md +41 -0
- package/dist/.claude/agents/rhodes-production.md +43 -0
- package/dist/.claude/agents/riker-review.md +62 -0
- package/dist/.claude/agents/rimuru-adapter.md +39 -0
- package/dist/.claude/agents/riza-backup.md +39 -0
- package/dist/.claude/agents/robin-apprentice.md +42 -0
- package/dist/.claude/agents/rocket-scrappy.md +43 -0
- package/dist/.claude/agents/rogers-api-design.md +43 -0
- package/dist/.claude/agents/romanoff-integrations.md +44 -0
- package/dist/.claude/agents/sabine-unconventional.md +40 -0
- package/dist/.claude/agents/salvor-model-selection.md +42 -0
- package/dist/.claude/agents/samwise-accessibility.md +43 -0
- package/dist/.claude/agents/sarene-outreach.md +40 -0
- package/dist/.claude/agents/sasha-resources.md +37 -0
- package/dist/.claude/agents/scotty-infrastructure.md +48 -0
- package/dist/.claude/agents/seldon-ai.md +67 -0
- package/dist/.claude/agents/senku-provisioning.md +40 -0
- package/dist/.claude/agents/sentaro-scheduling.md +37 -0
- package/dist/.claude/agents/seven-optimization.md +48 -0
- package/dist/.claude/agents/shallan-creative.md +40 -0
- package/dist/.claude/agents/sheeana-transport.md +40 -0
- package/dist/.claude/agents/shuri-innovation.md +43 -0
- package/dist/.claude/agents/silver-surfer-herald.md +90 -0
- package/dist/.claude/agents/siona-evasion.md +41 -0
- package/dist/.claude/agents/sisko-campaign.md +68 -0
- package/dist/.claude/agents/spike-routing.md +40 -0
- package/dist/.claude/agents/spock-schema.md +62 -0
- package/dist/.claude/agents/starfire-brute-force.md +43 -0
- package/dist/.claude/agents/stark-backend.md +71 -0
- package/dist/.claude/agents/steris-budget.md +41 -0
- package/dist/.claude/agents/stilgar-channel-security.md +40 -0
- package/dist/.claude/agents/strange-service-arch.md +44 -0
- package/dist/.claude/agents/sung-workers.md +39 -0
- package/dist/.claude/agents/superman-strength-test.md +43 -0
- package/dist/.claude/agents/suzaku-execution.md +39 -0
- package/dist/.claude/agents/szeth-compliance.md +40 -0
- package/dist/.claude/agents/tanjiro-persistent.md +39 -0
- package/dist/.claude/agents/tchalla-quality.md +43 -0
- package/dist/.claude/agents/thanos-gauntlet.md +68 -0
- package/dist/.claude/agents/theoden-rally.md +40 -0
- package/dist/.claude/agents/thor-queues.md +44 -0
- package/dist/.claude/agents/thufir-protocol-parsing.md +40 -0
- package/dist/.claude/agents/todo-brute-force.md +39 -0
- package/dist/.claude/agents/torres-site-scanner.md +47 -0
- package/dist/.claude/agents/totoro-guardian.md +39 -0
- package/dist/.claude/agents/tpol-disciplined.md +48 -0
- package/dist/.claude/agents/treebeard-deliberation.md +41 -0
- package/dist/.claude/agents/troi-prd-compliance.md +64 -0
- package/dist/.claude/agents/trunks-rollback.md +39 -0
- package/dist/.claude/agents/tuvok-deep-current.md +63 -0
- package/dist/.claude/agents/uhura-integration.md +47 -0
- package/dist/.claude/agents/valkyrie-recovery.md +43 -0
- package/dist/.claude/agents/vegeta-monitoring.md +39 -0
- package/dist/.claude/agents/veldora-dormant.md +37 -0
- package/dist/.claude/agents/vin-analytics.md +41 -0
- package/dist/.claude/agents/vision-data-analysis.md +43 -0
- package/dist/.claude/agents/wanda-seldon-validation.md +38 -0
- package/dist/.claude/agents/wanda-state.md +43 -0
- package/dist/.claude/agents/wax-paid-ads.md +40 -0
- package/dist/.claude/agents/wayne-ab-testing.md +40 -0
- package/dist/.claude/agents/whis-precision.md +39 -0
- package/dist/.claude/agents/windu-input-validation.md +41 -0
- package/dist/.claude/agents/winry-maintenance.md +39 -0
- package/dist/.claude/agents/wonder-woman-truth.md +43 -0
- package/dist/.claude/agents/wong-documentation.md +58 -0
- package/dist/.claude/agents/worf-security-arch.md +49 -0
- package/dist/.claude/agents/yoda-auth.md +57 -0
- package/dist/.claude/agents/yueh-trust-verify.md +40 -0
- package/dist/.claude/agents/zatanna-impossible.md +43 -0
- package/dist/.claude/agents/zechs-rival.md +39 -0
- package/dist/.claude/agents/zenitsu-alerts.md +37 -0
- package/dist/.claude/commands/ai.md +84 -0
- package/dist/.claude/commands/architect.md +107 -0
- package/dist/.claude/commands/assemble.md +223 -0
- package/dist/.claude/commands/assess.md +86 -0
- package/dist/.claude/commands/blueprint.md +135 -0
- package/dist/.claude/commands/build.md +138 -0
- package/dist/.claude/commands/campaign.md +224 -0
- package/dist/.claude/commands/cultivation.md +184 -0
- package/dist/.claude/commands/current.md +128 -0
- package/dist/.claude/commands/dangerroom.md +74 -0
- package/dist/.claude/commands/debrief.md +180 -0
- package/dist/.claude/commands/deploy.md +108 -0
- package/dist/.claude/commands/devops.md +160 -0
- package/dist/.claude/commands/engage.md +135 -0
- package/dist/.claude/commands/gauntlet.md +179 -0
- package/dist/.claude/commands/git.md +104 -0
- package/dist/.claude/commands/grow.md +160 -0
- package/dist/.claude/commands/imagine.md +126 -0
- package/dist/.claude/commands/portfolio.md +51 -0
- package/dist/.claude/commands/prd.md +113 -0
- package/dist/.claude/commands/qa.md +130 -0
- package/dist/.claude/commands/review.md +9 -0
- package/dist/.claude/commands/security.md +9 -0
- package/dist/.claude/commands/sentinel.md +90 -0
- package/dist/.claude/commands/test.md +114 -0
- package/dist/.claude/commands/thumper.md +116 -0
- package/dist/.claude/commands/treasury.md +117 -0
- package/dist/.claude/commands/ux.md +132 -0
- package/dist/.claude/commands/vault.md +198 -0
- package/dist/.claude/commands/void.md +148 -0
- package/dist/CHANGELOG.md +2621 -0
- package/dist/CLAUDE.md +292 -0
- package/dist/HOLOCRON.md +859 -0
- package/dist/VERSION.md +149 -0
- package/dist/docs/NAMING_REGISTRY.md +479 -0
- package/dist/docs/methods/AI_INTELLIGENCE.md +276 -0
- package/dist/docs/methods/ASSEMBLER.md +142 -0
- package/dist/docs/methods/BACKEND_ENGINEER.md +165 -0
- package/dist/docs/methods/BUILD_JOURNAL.md +214 -0
- package/dist/docs/methods/BUILD_PROTOCOL.md +436 -0
- package/dist/docs/methods/CAMPAIGN.md +569 -0
- package/dist/docs/methods/CONTEXT_MANAGEMENT.md +189 -0
- package/dist/docs/methods/DEEP_CURRENT.md +184 -0
- package/dist/docs/methods/DEVOPS_ENGINEER.md +297 -0
- package/dist/docs/methods/FIELD_MEDIC.md +265 -0
- package/dist/docs/methods/FORGE_ARTIST.md +108 -0
- package/dist/docs/methods/FORGE_KEEPER.md +270 -0
- package/dist/docs/methods/GAUNTLET.md +364 -0
- package/dist/docs/methods/GROWTH_STRATEGIST.md +466 -0
- package/dist/docs/methods/HEARTBEAT.md +168 -0
- package/dist/docs/methods/MCP_INTEGRATION.md +139 -0
- package/dist/docs/methods/MUSTER.md +152 -0
- package/dist/docs/methods/PRD_GENERATOR.md +186 -0
- package/dist/docs/methods/PRODUCT_DESIGN_FRONTEND.md +252 -0
- package/dist/docs/methods/QA_ENGINEER.md +360 -0
- package/dist/docs/methods/RELEASE_MANAGER.md +145 -0
- package/dist/docs/methods/SECURITY_AUDITOR.md +328 -0
- package/dist/docs/methods/SUB_AGENTS.md +375 -0
- package/dist/docs/methods/SYSTEMS_ARCHITECT.md +180 -0
- package/dist/docs/methods/TESTING.md +359 -0
- package/dist/docs/methods/THUMPER.md +175 -0
- package/dist/docs/methods/TIME_VAULT.md +120 -0
- package/dist/docs/methods/TREASURY.md +184 -0
- package/dist/docs/methods/TROUBLESHOOTING.md +265 -0
- package/dist/docs/patterns/README.md +52 -0
- package/dist/docs/patterns/ad-billing-adapter.ts +537 -0
- package/dist/docs/patterns/ad-platform-adapter.ts +421 -0
- package/dist/docs/patterns/ai-classifier.ts +195 -0
- package/dist/docs/patterns/ai-eval.ts +272 -0
- package/dist/docs/patterns/ai-orchestrator.ts +341 -0
- package/dist/docs/patterns/ai-router.ts +194 -0
- package/dist/docs/patterns/ai-tool-schema.ts +237 -0
- package/dist/docs/patterns/api-route.ts +241 -0
- package/dist/docs/patterns/backtest-engine.ts +499 -0
- package/dist/docs/patterns/browser-review.ts +292 -0
- package/dist/docs/patterns/combobox.tsx +300 -0
- package/dist/docs/patterns/component.tsx +262 -0
- package/dist/docs/patterns/daemon-process.ts +338 -0
- package/dist/docs/patterns/data-pipeline.ts +297 -0
- package/dist/docs/patterns/database-migration.ts +466 -0
- package/dist/docs/patterns/e2e-test.ts +629 -0
- package/dist/docs/patterns/error-handling.ts +312 -0
- package/dist/docs/patterns/execution-safety.ts +601 -0
- package/dist/docs/patterns/financial-transaction.ts +366 -0
- package/dist/docs/patterns/funding-plan.ts +462 -0
- package/dist/docs/patterns/game-entity.ts +137 -0
- package/dist/docs/patterns/game-loop.ts +113 -0
- package/dist/docs/patterns/game-state.ts +143 -0
- package/dist/docs/patterns/job-queue.ts +225 -0
- package/dist/docs/patterns/kongo-integration.ts +164 -0
- package/dist/docs/patterns/middleware.ts +363 -0
- package/dist/docs/patterns/mobile-screen.tsx +139 -0
- package/dist/docs/patterns/mobile-service.ts +167 -0
- package/dist/docs/patterns/multi-tenant.ts +382 -0
- package/dist/docs/patterns/oauth-token-lifecycle.ts +223 -0
- package/dist/docs/patterns/outbound-rate-limiter.ts +260 -0
- package/dist/docs/patterns/prompt-template.ts +195 -0
- package/dist/docs/patterns/revenue-source-adapter.ts +311 -0
- package/dist/docs/patterns/service.ts +224 -0
- package/dist/docs/patterns/sse-endpoint.ts +118 -0
- package/dist/docs/patterns/stablecoin-adapter.ts +511 -0
- package/dist/docs/patterns/third-party-script.ts +68 -0
- package/dist/scripts/thumper/gom-jabbar.sh +241 -0
- package/dist/scripts/thumper/relay.sh +610 -0
- package/dist/scripts/thumper/scan.sh +359 -0
- package/dist/scripts/thumper/thumper.sh +190 -0
- package/dist/scripts/thumper/water-rings.sh +76 -0
- package/dist/scripts/vault-read.d.ts +11 -0
- package/dist/scripts/vault-read.js +89 -0
- package/dist/scripts/voidforge.d.ts +21 -0
- package/dist/scripts/voidforge.js +614 -0
- package/dist/wizard/api/auth.d.ts +5 -0
- package/dist/wizard/api/auth.js +139 -0
- package/dist/wizard/api/blueprint.d.ts +34 -0
- package/dist/wizard/api/blueprint.js +161 -0
- package/dist/wizard/api/cloud-providers.d.ts +16 -0
- package/dist/wizard/api/cloud-providers.js +363 -0
- package/dist/wizard/api/credentials.d.ts +1 -0
- package/dist/wizard/api/credentials.js +265 -0
- package/dist/wizard/api/danger-room.d.ts +24 -0
- package/dist/wizard/api/danger-room.js +274 -0
- package/dist/wizard/api/deploy.d.ts +4 -0
- package/dist/wizard/api/deploy.js +164 -0
- package/dist/wizard/api/prd.d.ts +1 -0
- package/dist/wizard/api/prd.js +363 -0
- package/dist/wizard/api/project.d.ts +1 -0
- package/dist/wizard/api/project.js +241 -0
- package/dist/wizard/api/projects-data.d.ts +5 -0
- package/dist/wizard/api/projects-data.js +234 -0
- package/dist/wizard/api/projects-list.d.ts +5 -0
- package/dist/wizard/api/projects-list.js +227 -0
- package/dist/wizard/api/projects.d.ts +7 -0
- package/dist/wizard/api/projects.js +273 -0
- package/dist/wizard/api/provision-status.d.ts +5 -0
- package/dist/wizard/api/provision-status.js +47 -0
- package/dist/wizard/api/provision-steps.d.ts +21 -0
- package/dist/wizard/api/provision-steps.js +44 -0
- package/dist/wizard/api/provision-validate.d.ts +22 -0
- package/dist/wizard/api/provision-validate.js +164 -0
- package/dist/wizard/api/provision.d.ts +2 -0
- package/dist/wizard/api/provision.js +239 -0
- package/dist/wizard/api/terminal.d.ts +25 -0
- package/dist/wizard/api/terminal.js +246 -0
- package/dist/wizard/api/users.d.ts +6 -0
- package/dist/wizard/api/users.js +244 -0
- package/dist/wizard/api/war-room.d.ts +16 -0
- package/dist/wizard/api/war-room.js +70 -0
- package/dist/wizard/danger-room.config.json +5 -0
- package/dist/wizard/lib/ad-platform-core.d.ts +6 -0
- package/dist/wizard/lib/ad-platform-core.js +1 -0
- package/dist/wizard/lib/adapters/index.d.ts +52 -0
- package/dist/wizard/lib/adapters/index.js +38 -0
- package/dist/wizard/lib/adapters/sandbox-bank.d.ts +17 -0
- package/dist/wizard/lib/adapters/sandbox-bank.js +77 -0
- package/dist/wizard/lib/adapters/sandbox.d.ts +39 -0
- package/dist/wizard/lib/adapters/sandbox.js +174 -0
- package/dist/wizard/lib/adapters/stripe.d.ts +19 -0
- package/dist/wizard/lib/adapters/stripe.js +143 -0
- package/dist/wizard/lib/adapters/types.d.ts +9 -0
- package/dist/wizard/lib/adapters/types.js +10 -0
- package/dist/wizard/lib/agent-memory.d.ts +36 -0
- package/dist/wizard/lib/agent-memory.js +114 -0
- package/dist/wizard/lib/agent-registry.d.ts +21 -0
- package/dist/wizard/lib/agent-registry.js +105 -0
- package/dist/wizard/lib/anomaly-detection.d.ts +59 -0
- package/dist/wizard/lib/anomaly-detection.js +122 -0
- package/dist/wizard/lib/anthropic.d.ts +21 -0
- package/dist/wizard/lib/anthropic.js +105 -0
- package/dist/wizard/lib/asset-scanner.d.ts +23 -0
- package/dist/wizard/lib/asset-scanner.js +107 -0
- package/dist/wizard/lib/audit-log.d.ts +23 -0
- package/dist/wizard/lib/audit-log.js +70 -0
- package/dist/wizard/lib/autonomy-controller.d.ts +76 -0
- package/dist/wizard/lib/autonomy-controller.js +184 -0
- package/dist/wizard/lib/body-parser.d.ts +2 -0
- package/dist/wizard/lib/body-parser.js +36 -0
- package/dist/wizard/lib/build-analytics.d.ts +39 -0
- package/dist/wizard/lib/build-analytics.js +91 -0
- package/dist/wizard/lib/build-step.d.ts +21 -0
- package/dist/wizard/lib/build-step.js +104 -0
- package/dist/wizard/lib/campaign-proposer.d.ts +39 -0
- package/dist/wizard/lib/campaign-proposer.js +181 -0
- package/dist/wizard/lib/campaign-state-machine.d.ts +63 -0
- package/dist/wizard/lib/campaign-state-machine.js +114 -0
- package/dist/wizard/lib/ci-generator.d.ts +14 -0
- package/dist/wizard/lib/ci-generator.js +187 -0
- package/dist/wizard/lib/claude-merge.d.ts +38 -0
- package/dist/wizard/lib/claude-merge.js +115 -0
- package/dist/wizard/lib/codegen/erd-gen.d.ts +16 -0
- package/dist/wizard/lib/codegen/erd-gen.js +98 -0
- package/dist/wizard/lib/codegen/integrations.d.ts +18 -0
- package/dist/wizard/lib/codegen/integrations.js +189 -0
- package/dist/wizard/lib/codegen/openapi-gen.d.ts +15 -0
- package/dist/wizard/lib/codegen/openapi-gen.js +79 -0
- package/dist/wizard/lib/codegen/prisma-types.d.ts +15 -0
- package/dist/wizard/lib/codegen/prisma-types.js +44 -0
- package/dist/wizard/lib/codegen/seed-gen.d.ts +16 -0
- package/dist/wizard/lib/codegen/seed-gen.js +128 -0
- package/dist/wizard/lib/compliance.d.ts +51 -0
- package/dist/wizard/lib/compliance.js +112 -0
- package/dist/wizard/lib/correlation-engine.d.ts +59 -0
- package/dist/wizard/lib/correlation-engine.js +152 -0
- package/dist/wizard/lib/cost-estimator.d.ts +22 -0
- package/dist/wizard/lib/cost-estimator.js +72 -0
- package/dist/wizard/lib/cost-tracker.d.ts +27 -0
- package/dist/wizard/lib/cost-tracker.js +37 -0
- package/dist/wizard/lib/daemon-aggregator.d.ts +76 -0
- package/dist/wizard/lib/daemon-aggregator.js +241 -0
- package/dist/wizard/lib/daemon-core.d.ts +16 -0
- package/dist/wizard/lib/daemon-core.js +39 -0
- package/dist/wizard/lib/dashboard-data.d.ts +123 -0
- package/dist/wizard/lib/dashboard-data.js +314 -0
- package/dist/wizard/lib/dashboard-ws.d.ts +28 -0
- package/dist/wizard/lib/dashboard-ws.js +117 -0
- package/dist/wizard/lib/deep-current.d.ts +77 -0
- package/dist/wizard/lib/deep-current.js +247 -0
- package/dist/wizard/lib/deploy-coordinator.d.ts +40 -0
- package/dist/wizard/lib/deploy-coordinator.js +86 -0
- package/dist/wizard/lib/deploy-log.d.ts +28 -0
- package/dist/wizard/lib/deploy-log.js +52 -0
- package/dist/wizard/lib/desktop-notify.d.ts +27 -0
- package/dist/wizard/lib/desktop-notify.js +98 -0
- package/dist/wizard/lib/dns/cloudflare-dns.d.ts +35 -0
- package/dist/wizard/lib/dns/cloudflare-dns.js +216 -0
- package/dist/wizard/lib/dns/cloudflare-registrar.d.ts +31 -0
- package/dist/wizard/lib/dns/cloudflare-registrar.js +148 -0
- package/dist/wizard/lib/dns/types.d.ts +22 -0
- package/dist/wizard/lib/dns/types.js +4 -0
- package/dist/wizard/lib/document-discovery.d.ts +33 -0
- package/dist/wizard/lib/document-discovery.js +145 -0
- package/dist/wizard/lib/env-validator.d.ts +14 -0
- package/dist/wizard/lib/env-validator.js +205 -0
- package/dist/wizard/lib/env-writer.d.ts +13 -0
- package/dist/wizard/lib/env-writer.js +26 -0
- package/dist/wizard/lib/exec.d.ts +30 -0
- package/dist/wizard/lib/exec.js +52 -0
- package/dist/wizard/lib/experiment.d.ts +70 -0
- package/dist/wizard/lib/experiment.js +169 -0
- package/dist/wizard/lib/extensions.d.ts +20 -0
- package/dist/wizard/lib/extensions.js +183 -0
- package/dist/wizard/lib/financial/adapter-factory.d.ts +47 -0
- package/dist/wizard/lib/financial/adapter-factory.js +225 -0
- package/dist/wizard/lib/financial/billing/base.d.ts +6 -0
- package/dist/wizard/lib/financial/billing/base.js +1 -0
- package/dist/wizard/lib/financial/billing/google-billing.d.ts +56 -0
- package/dist/wizard/lib/financial/billing/google-billing.js +298 -0
- package/dist/wizard/lib/financial/billing/meta-billing.d.ts +54 -0
- package/dist/wizard/lib/financial/billing/meta-billing.js +243 -0
- package/dist/wizard/lib/financial/billing/tiktok-billing.d.ts +54 -0
- package/dist/wizard/lib/financial/billing/tiktok-billing.js +260 -0
- package/dist/wizard/lib/financial/campaign/base.d.ts +13 -0
- package/dist/wizard/lib/financial/campaign/base.js +1 -0
- package/dist/wizard/lib/financial/campaign/campaign-common.d.ts +21 -0
- package/dist/wizard/lib/financial/campaign/campaign-common.js +58 -0
- package/dist/wizard/lib/financial/campaign/google-api.d.ts +35 -0
- package/dist/wizard/lib/financial/campaign/google-api.js +118 -0
- package/dist/wizard/lib/financial/campaign/google-campaign.d.ts +38 -0
- package/dist/wizard/lib/financial/campaign/google-campaign.js +186 -0
- package/dist/wizard/lib/financial/campaign/meta-api.d.ts +28 -0
- package/dist/wizard/lib/financial/campaign/meta-api.js +93 -0
- package/dist/wizard/lib/financial/campaign/meta-campaign.d.ts +32 -0
- package/dist/wizard/lib/financial/campaign/meta-campaign.js +189 -0
- package/dist/wizard/lib/financial/campaign/sandbox-campaign.d.ts +45 -0
- package/dist/wizard/lib/financial/campaign/sandbox-campaign.js +261 -0
- package/dist/wizard/lib/financial/campaign/tiktok-api.d.ts +25 -0
- package/dist/wizard/lib/financial/campaign/tiktok-api.js +81 -0
- package/dist/wizard/lib/financial/campaign/tiktok-campaign.d.ts +37 -0
- package/dist/wizard/lib/financial/campaign/tiktok-campaign.js +155 -0
- package/dist/wizard/lib/financial/funding-auto.d.ts +44 -0
- package/dist/wizard/lib/financial/funding-auto.js +52 -0
- package/dist/wizard/lib/financial/funding-policy.d.ts +60 -0
- package/dist/wizard/lib/financial/funding-policy.js +179 -0
- package/dist/wizard/lib/financial/platform-planner.d.ts +47 -0
- package/dist/wizard/lib/financial/platform-planner.js +134 -0
- package/dist/wizard/lib/financial/reconciliation-engine.d.ts +78 -0
- package/dist/wizard/lib/financial/reconciliation-engine.js +193 -0
- package/dist/wizard/lib/financial/registry.d.ts +22 -0
- package/dist/wizard/lib/financial/registry.js +26 -0
- package/dist/wizard/lib/financial/reporting.d.ts +96 -0
- package/dist/wizard/lib/financial/reporting.js +198 -0
- package/dist/wizard/lib/financial/stablecoin/base.d.ts +6 -0
- package/dist/wizard/lib/financial/stablecoin/base.js +1 -0
- package/dist/wizard/lib/financial/stablecoin/circle.d.ts +54 -0
- package/dist/wizard/lib/financial/stablecoin/circle.js +367 -0
- package/dist/wizard/lib/financial/stablecoin/mercury.d.ts +24 -0
- package/dist/wizard/lib/financial/stablecoin/mercury.js +171 -0
- package/dist/wizard/lib/financial/stablecoin/sandbox-stablecoin.d.ts +47 -0
- package/dist/wizard/lib/financial/stablecoin/sandbox-stablecoin.js +202 -0
- package/dist/wizard/lib/financial/treasury-planner.d.ts +52 -0
- package/dist/wizard/lib/financial/treasury-planner.js +128 -0
- package/dist/wizard/lib/financial-core.d.ts +6 -0
- package/dist/wizard/lib/financial-core.js +5 -0
- package/dist/wizard/lib/financial-vault.d.ts +34 -0
- package/dist/wizard/lib/financial-vault.js +200 -0
- package/dist/wizard/lib/frontmatter.d.ts +30 -0
- package/dist/wizard/lib/frontmatter.js +99 -0
- package/dist/wizard/lib/gap-analysis.d.ts +37 -0
- package/dist/wizard/lib/gap-analysis.js +218 -0
- package/dist/wizard/lib/github.d.ts +22 -0
- package/dist/wizard/lib/github.js +261 -0
- package/dist/wizard/lib/headless-deploy.d.ts +14 -0
- package/dist/wizard/lib/headless-deploy.js +452 -0
- package/dist/wizard/lib/health-monitor.d.ts +15 -0
- package/dist/wizard/lib/health-monitor.js +91 -0
- package/dist/wizard/lib/health-poller.d.ts +9 -0
- package/dist/wizard/lib/health-poller.js +123 -0
- package/dist/wizard/lib/heartbeat-lifecycle.d.ts +71 -0
- package/dist/wizard/lib/heartbeat-lifecycle.js +107 -0
- package/dist/wizard/lib/heartbeat-scheduler.d.ts +26 -0
- package/dist/wizard/lib/heartbeat-scheduler.js +155 -0
- package/dist/wizard/lib/heartbeat.d.ts +22 -0
- package/dist/wizard/lib/heartbeat.js +538 -0
- package/dist/wizard/lib/herald.d.ts +28 -0
- package/dist/wizard/lib/herald.js +167 -0
- package/dist/wizard/lib/http-helpers.d.ts +9 -0
- package/dist/wizard/lib/http-helpers.js +24 -0
- package/dist/wizard/lib/image-gen.d.ts +56 -0
- package/dist/wizard/lib/image-gen.js +159 -0
- package/dist/wizard/lib/instance-sizing.d.ts +26 -0
- package/dist/wizard/lib/instance-sizing.js +51 -0
- package/dist/wizard/lib/kongo/analytics.d.ts +29 -0
- package/dist/wizard/lib/kongo/analytics.js +179 -0
- package/dist/wizard/lib/kongo/campaigns.d.ts +52 -0
- package/dist/wizard/lib/kongo/campaigns.js +91 -0
- package/dist/wizard/lib/kongo/client.d.ts +58 -0
- package/dist/wizard/lib/kongo/client.js +221 -0
- package/dist/wizard/lib/kongo/jobs.d.ts +57 -0
- package/dist/wizard/lib/kongo/jobs.js +122 -0
- package/dist/wizard/lib/kongo/pages.d.ts +60 -0
- package/dist/wizard/lib/kongo/pages.js +150 -0
- package/dist/wizard/lib/kongo/provisioner.d.ts +64 -0
- package/dist/wizard/lib/kongo/provisioner.js +116 -0
- package/dist/wizard/lib/kongo/seed.d.ts +49 -0
- package/dist/wizard/lib/kongo/seed.js +237 -0
- package/dist/wizard/lib/kongo/types.d.ts +323 -0
- package/dist/wizard/lib/kongo/types.js +11 -0
- package/dist/wizard/lib/kongo/variants.d.ts +57 -0
- package/dist/wizard/lib/kongo/variants.js +88 -0
- package/dist/wizard/lib/kongo/webhooks.d.ts +41 -0
- package/dist/wizard/lib/kongo/webhooks.js +112 -0
- package/dist/wizard/lib/marker.d.ts +28 -0
- package/dist/wizard/lib/marker.js +79 -0
- package/dist/wizard/lib/migrator.d.ts +35 -0
- package/dist/wizard/lib/migrator.js +190 -0
- package/dist/wizard/lib/natural-language-deploy.d.ts +30 -0
- package/dist/wizard/lib/natural-language-deploy.js +186 -0
- package/dist/wizard/lib/network.d.ts +22 -0
- package/dist/wizard/lib/network.js +72 -0
- package/dist/wizard/lib/oauth-core.d.ts +6 -0
- package/dist/wizard/lib/oauth-core.js +5 -0
- package/dist/wizard/lib/open-browser.d.ts +1 -0
- package/dist/wizard/lib/open-browser.js +26 -0
- package/dist/wizard/lib/patterns/ad-billing-adapter.d.ts +209 -0
- package/dist/wizard/lib/patterns/ad-billing-adapter.js +269 -0
- package/dist/wizard/lib/patterns/ad-platform-adapter.d.ts +200 -0
- package/dist/wizard/lib/patterns/ad-platform-adapter.js +212 -0
- package/dist/wizard/lib/patterns/daemon-process.d.ts +88 -0
- package/dist/wizard/lib/patterns/daemon-process.js +271 -0
- package/dist/wizard/lib/patterns/financial-transaction.d.ts +171 -0
- package/dist/wizard/lib/patterns/financial-transaction.js +154 -0
- package/dist/wizard/lib/patterns/funding-plan.d.ts +136 -0
- package/dist/wizard/lib/patterns/funding-plan.js +200 -0
- package/dist/wizard/lib/patterns/oauth-token-lifecycle.d.ts +94 -0
- package/dist/wizard/lib/patterns/oauth-token-lifecycle.js +139 -0
- package/dist/wizard/lib/patterns/outbound-rate-limiter.d.ts +67 -0
- package/dist/wizard/lib/patterns/outbound-rate-limiter.js +216 -0
- package/dist/wizard/lib/patterns/revenue-source-adapter.d.ts +96 -0
- package/dist/wizard/lib/patterns/revenue-source-adapter.js +182 -0
- package/dist/wizard/lib/patterns/stablecoin-adapter.d.ts +218 -0
- package/dist/wizard/lib/patterns/stablecoin-adapter.js +264 -0
- package/dist/wizard/lib/prd-validator.d.ts +39 -0
- package/dist/wizard/lib/prd-validator.js +137 -0
- package/dist/wizard/lib/project-init.d.ts +24 -0
- package/dist/wizard/lib/project-init.js +228 -0
- package/dist/wizard/lib/project-registry.d.ts +86 -0
- package/dist/wizard/lib/project-registry.js +359 -0
- package/dist/wizard/lib/project-scope.d.ts +64 -0
- package/dist/wizard/lib/project-scope.js +96 -0
- package/dist/wizard/lib/project-vault.d.ts +47 -0
- package/dist/wizard/lib/project-vault.js +221 -0
- package/dist/wizard/lib/provision-manifest.d.ts +44 -0
- package/dist/wizard/lib/provision-manifest.js +164 -0
- package/dist/wizard/lib/provisioner-registry.d.ts +15 -0
- package/dist/wizard/lib/provisioner-registry.js +34 -0
- package/dist/wizard/lib/provisioners/aws-config.d.ts +36 -0
- package/dist/wizard/lib/provisioners/aws-config.js +56 -0
- package/dist/wizard/lib/provisioners/aws-ec2.d.ts +19 -0
- package/dist/wizard/lib/provisioners/aws-ec2.js +241 -0
- package/dist/wizard/lib/provisioners/aws-rds.d.ts +10 -0
- package/dist/wizard/lib/provisioners/aws-rds.js +199 -0
- package/dist/wizard/lib/provisioners/aws-vps.d.ts +6 -0
- package/dist/wizard/lib/provisioners/aws-vps.js +231 -0
- package/dist/wizard/lib/provisioners/cloudflare.d.ts +6 -0
- package/dist/wizard/lib/provisioners/cloudflare.js +300 -0
- package/dist/wizard/lib/provisioners/docker.d.ts +6 -0
- package/dist/wizard/lib/provisioners/docker.js +75 -0
- package/dist/wizard/lib/provisioners/http-client.d.ts +20 -0
- package/dist/wizard/lib/provisioners/http-client.js +79 -0
- package/dist/wizard/lib/provisioners/railway-config.d.ts +24 -0
- package/dist/wizard/lib/provisioners/railway-config.js +220 -0
- package/dist/wizard/lib/provisioners/railway-deploy.d.ts +19 -0
- package/dist/wizard/lib/provisioners/railway-deploy.js +205 -0
- package/dist/wizard/lib/provisioners/railway.d.ts +6 -0
- package/dist/wizard/lib/provisioners/railway.js +45 -0
- package/dist/wizard/lib/provisioners/scripts/caddyfile.d.ts +10 -0
- package/dist/wizard/lib/provisioners/scripts/caddyfile.js +54 -0
- package/dist/wizard/lib/provisioners/scripts/deploy-vps.d.ts +10 -0
- package/dist/wizard/lib/provisioners/scripts/deploy-vps.js +112 -0
- package/dist/wizard/lib/provisioners/scripts/docker-compose.d.ts +11 -0
- package/dist/wizard/lib/provisioners/scripts/docker-compose.js +91 -0
- package/dist/wizard/lib/provisioners/scripts/dockerfile.d.ts +5 -0
- package/dist/wizard/lib/provisioners/scripts/dockerfile.js +185 -0
- package/dist/wizard/lib/provisioners/scripts/ecosystem-config.d.ts +10 -0
- package/dist/wizard/lib/provisioners/scripts/ecosystem-config.js +36 -0
- package/dist/wizard/lib/provisioners/scripts/provision-vps.d.ts +14 -0
- package/dist/wizard/lib/provisioners/scripts/provision-vps.js +202 -0
- package/dist/wizard/lib/provisioners/scripts/rollback-vps.d.ts +10 -0
- package/dist/wizard/lib/provisioners/scripts/rollback-vps.js +67 -0
- package/dist/wizard/lib/provisioners/self-deploy.d.ts +41 -0
- package/dist/wizard/lib/provisioners/self-deploy.js +185 -0
- package/dist/wizard/lib/provisioners/static-s3.d.ts +6 -0
- package/dist/wizard/lib/provisioners/static-s3.js +235 -0
- package/dist/wizard/lib/provisioners/types.d.ts +40 -0
- package/dist/wizard/lib/provisioners/types.js +4 -0
- package/dist/wizard/lib/provisioners/vercel.d.ts +6 -0
- package/dist/wizard/lib/provisioners/vercel.js +287 -0
- package/dist/wizard/lib/pty-manager.d.ts +42 -0
- package/dist/wizard/lib/pty-manager.js +244 -0
- package/dist/wizard/lib/rate-limiter-core.d.ts +5 -0
- package/dist/wizard/lib/rate-limiter-core.js +5 -0
- package/dist/wizard/lib/reconciliation.d.ts +43 -0
- package/dist/wizard/lib/reconciliation.js +173 -0
- package/dist/wizard/lib/revenue-types.d.ts +5 -0
- package/dist/wizard/lib/revenue-types.js +1 -0
- package/dist/wizard/lib/route-optimizer.d.ts +28 -0
- package/dist/wizard/lib/route-optimizer.js +93 -0
- package/dist/wizard/lib/s3-deploy.d.ts +19 -0
- package/dist/wizard/lib/s3-deploy.js +156 -0
- package/dist/wizard/lib/safety-tiers.d.ts +76 -0
- package/dist/wizard/lib/safety-tiers.js +134 -0
- package/dist/wizard/lib/sentry-generator.d.ts +15 -0
- package/dist/wizard/lib/sentry-generator.js +116 -0
- package/dist/wizard/lib/server-config.d.ts +13 -0
- package/dist/wizard/lib/server-config.js +23 -0
- package/dist/wizard/lib/service-install.d.ts +18 -0
- package/dist/wizard/lib/service-install.js +182 -0
- package/dist/wizard/lib/site-scanner.d.ts +80 -0
- package/dist/wizard/lib/site-scanner.js +262 -0
- package/dist/wizard/lib/ssh-deploy.d.ts +25 -0
- package/dist/wizard/lib/ssh-deploy.js +225 -0
- package/dist/wizard/lib/templates.d.ts +24 -0
- package/dist/wizard/lib/templates.js +219 -0
- package/dist/wizard/lib/totp.d.ts +35 -0
- package/dist/wizard/lib/totp.js +277 -0
- package/dist/wizard/lib/tower-auth.d.ts +43 -0
- package/dist/wizard/lib/tower-auth.js +352 -0
- package/dist/wizard/lib/tower-rate-limit.d.ts +14 -0
- package/dist/wizard/lib/tower-rate-limit.js +61 -0
- package/dist/wizard/lib/tower-session.d.ts +28 -0
- package/dist/wizard/lib/tower-session.js +119 -0
- package/dist/wizard/lib/treasury-backup.d.ts +23 -0
- package/dist/wizard/lib/treasury-backup.js +127 -0
- package/dist/wizard/lib/treasury-circuit-breakers.d.ts +28 -0
- package/dist/wizard/lib/treasury-circuit-breakers.js +74 -0
- package/dist/wizard/lib/treasury-handlers.d.ts +21 -0
- package/dist/wizard/lib/treasury-handlers.js +281 -0
- package/dist/wizard/lib/treasury-heartbeat.d.ts +18 -0
- package/dist/wizard/lib/treasury-heartbeat.js +20 -0
- package/dist/wizard/lib/treasury-io.d.ts +107 -0
- package/dist/wizard/lib/treasury-io.js +254 -0
- package/dist/wizard/lib/treasury-jobs.d.ts +14 -0
- package/dist/wizard/lib/treasury-jobs.js +589 -0
- package/dist/wizard/lib/treasury-migrator.d.ts +59 -0
- package/dist/wizard/lib/treasury-migrator.js +227 -0
- package/dist/wizard/lib/treasury-reader.d.ts +52 -0
- package/dist/wizard/lib/treasury-reader.js +235 -0
- package/dist/wizard/lib/updater.d.ts +29 -0
- package/dist/wizard/lib/updater.js +203 -0
- package/dist/wizard/lib/user-manager.d.ts +39 -0
- package/dist/wizard/lib/user-manager.js +182 -0
- package/dist/wizard/lib/vault.d.ts +26 -0
- package/dist/wizard/lib/vault.js +161 -0
- package/dist/wizard/router.d.ts +12 -0
- package/dist/wizard/router.js +58 -0
- package/dist/wizard/server.d.ts +18 -0
- package/dist/wizard/server.js +427 -0
- package/dist/wizard/ui/app.js +1357 -0
- package/dist/wizard/ui/danger-room-prophecy.js +217 -0
- package/dist/wizard/ui/danger-room.html +27 -0
- package/dist/wizard/ui/danger-room.js +29 -0
- package/dist/wizard/ui/deploy.html +181 -0
- package/dist/wizard/ui/deploy.js +616 -0
- package/dist/wizard/ui/favicon.svg +11 -0
- package/dist/wizard/ui/index.html +407 -0
- package/dist/wizard/ui/lobby.html +235 -0
- package/dist/wizard/ui/lobby.js +843 -0
- package/dist/wizard/ui/login.html +111 -0
- package/dist/wizard/ui/login.js +199 -0
- package/dist/wizard/ui/project.html +285 -0
- package/dist/wizard/ui/project.js +324 -0
- package/dist/wizard/ui/rollback.js +107 -0
- package/dist/wizard/ui/styles.css +1040 -0
- package/dist/wizard/ui/tower.html +177 -0
- package/dist/wizard/ui/tower.js +445 -0
- package/dist/wizard/ui/war-room-prophecy.js +217 -0
- package/dist/wizard/ui/war-room.html +27 -0
- package/dist/wizard/ui/war-room.js +29 -0
- package/package.json +60 -0
|
@@ -0,0 +1,589 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Treasury Jobs — scheduled heartbeat job definitions and auto-funding executor.
|
|
3
|
+
*
|
|
4
|
+
* Contains the 9 scheduled jobs registered with the daemon's JobScheduler
|
|
5
|
+
* and the executeApprovedPlans function that initiates off-ramp transfers
|
|
6
|
+
* for approved funding plans.
|
|
7
|
+
*
|
|
8
|
+
* PRD Reference: S10.4, S12, S15
|
|
9
|
+
*/
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { existsSync } from 'node:fs';
|
|
12
|
+
import { readFile, appendFile, mkdir } from 'node:fs/promises';
|
|
13
|
+
import { randomUUID } from 'node:crypto';
|
|
14
|
+
import { TREASURY_DIR } from './financial-core.js';
|
|
15
|
+
import { forecastRunway } from './financial/treasury-planner.js';
|
|
16
|
+
import { evaluateAutoFunding } from './financial/funding-auto.js';
|
|
17
|
+
import { reconcileThreeWay, shouldFreeze } from './financial/reconciliation-engine.js';
|
|
18
|
+
import { createDailyBackup } from './treasury-backup.js';
|
|
19
|
+
import { planGoogleInvoiceSettlement, planMetaDebitProtection, } from './financial/platform-planner.js';
|
|
20
|
+
import { getTreasuryState, saveTreasuryState, loadTreasuryState, recoverPendingOps, isStablecoinConfigured, readPendingTransfers, writePendingTransfers, readFundingPlans, writeFundingPlans, writeWalEntry, FUNDING_PLANS_LOG, TRANSFERS_LOG, RECONCILIATION_LOG, } from './treasury-io.js';
|
|
21
|
+
import { evaluateCircuitBreakers, evaluateTransferSlaBreaker, evaluateBillingBreakers, } from './treasury-circuit-breakers.js';
|
|
22
|
+
// ── Auto-Funding Plan Executor ───────────────────────
|
|
23
|
+
/** Execute approved funding plans: initiate offramp, track pending, write WAL. */
|
|
24
|
+
export async function executeApprovedPlans(vaultKey, logger, triggerFreeze) {
|
|
25
|
+
const plans = await readFundingPlans();
|
|
26
|
+
const approvedPlans = plans.filter(p => p.status === 'APPROVED');
|
|
27
|
+
if (approvedPlans.length === 0)
|
|
28
|
+
return;
|
|
29
|
+
logger.log(`Executing ${approvedPlans.length} approved funding plan(s)`);
|
|
30
|
+
const { getStablecoinAdapter } = await import('./financial/adapter-factory.js');
|
|
31
|
+
const adapter = await getStablecoinAdapter(vaultKey, logger);
|
|
32
|
+
const treasuryState = getTreasuryState();
|
|
33
|
+
for (const plan of approvedPlans) {
|
|
34
|
+
const intentId = randomUUID();
|
|
35
|
+
// Write WAL entry before execution (ADR-3)
|
|
36
|
+
await writeWalEntry({
|
|
37
|
+
intentId,
|
|
38
|
+
operation: 'auto-funding-execute',
|
|
39
|
+
params: { planId: plan.id, requiredCents: plan.requiredCents },
|
|
40
|
+
status: 'pending',
|
|
41
|
+
createdAt: new Date().toISOString(),
|
|
42
|
+
});
|
|
43
|
+
try {
|
|
44
|
+
const planRef = {
|
|
45
|
+
id: plan.id ?? randomUUID(),
|
|
46
|
+
sourceFundingId: plan.sourceFundingId ?? 'default-source',
|
|
47
|
+
destinationBankId: plan.destinationBankId ?? 'default-bank',
|
|
48
|
+
requiredCents: (plan.requiredCents ?? 0),
|
|
49
|
+
idempotencyKey: plan.idempotencyKey ?? randomUUID(),
|
|
50
|
+
};
|
|
51
|
+
const transfer = await adapter.initiateOfframp(planRef, plan.hash ?? '');
|
|
52
|
+
// Transition plan to PENDING_SETTLEMENT
|
|
53
|
+
plan.status = 'PENDING_SETTLEMENT';
|
|
54
|
+
plan.updatedAt = new Date().toISOString();
|
|
55
|
+
await writeFundingPlans(plans);
|
|
56
|
+
// Log the transfer
|
|
57
|
+
await mkdir(TREASURY_DIR, { recursive: true });
|
|
58
|
+
await appendFile(TRANSFERS_LOG, JSON.stringify(transfer) + '\n', 'utf-8');
|
|
59
|
+
// Track pending transfer
|
|
60
|
+
const pending = await readPendingTransfers();
|
|
61
|
+
pending.push({
|
|
62
|
+
id: transfer.id,
|
|
63
|
+
fundingPlanId: plan.id,
|
|
64
|
+
providerTransferId: transfer.providerTransferId,
|
|
65
|
+
amountCents: transfer.amountCents,
|
|
66
|
+
status: 'pending',
|
|
67
|
+
initiatedAt: transfer.initiatedAt,
|
|
68
|
+
lastPolledAt: transfer.initiatedAt,
|
|
69
|
+
});
|
|
70
|
+
await writePendingTransfers(pending);
|
|
71
|
+
// Update treasury state
|
|
72
|
+
treasuryState.pendingTransferCount += 1;
|
|
73
|
+
treasuryState.lastOfframpAt = new Date().toISOString();
|
|
74
|
+
// Track daily movement for CB-6
|
|
75
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
76
|
+
if (treasuryState.dailyMovementDate !== today) {
|
|
77
|
+
treasuryState.dailyMovementCents = 0;
|
|
78
|
+
treasuryState.dailyMovementDate = today;
|
|
79
|
+
}
|
|
80
|
+
treasuryState.dailyMovementCents += (plan.requiredCents ?? 0);
|
|
81
|
+
// Complete WAL
|
|
82
|
+
await writeWalEntry({
|
|
83
|
+
intentId,
|
|
84
|
+
operation: 'auto-funding-execute',
|
|
85
|
+
params: { planId: plan.id, transferId: transfer.id, providerTransferId: transfer.providerTransferId },
|
|
86
|
+
status: 'completed',
|
|
87
|
+
createdAt: new Date().toISOString(),
|
|
88
|
+
completedAt: new Date().toISOString(),
|
|
89
|
+
});
|
|
90
|
+
logger.log(`Auto-funding executed: plan ${plan.id}, ` +
|
|
91
|
+
`$${((plan.requiredCents ?? 0) / 100).toFixed(2)} ` +
|
|
92
|
+
`via ${transfer.provider} (transfer ${transfer.id})`);
|
|
93
|
+
// CB-6: Check daily movement limits
|
|
94
|
+
const cb = evaluateCircuitBreakers(treasuryState);
|
|
95
|
+
if (cb.shouldFreeze && !treasuryState.fundingFrozen) {
|
|
96
|
+
await triggerFreeze(cb.reasons.join('; '));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
101
|
+
logger.log(`Auto-funding execution failed for plan ${plan.id}: ${msg}`);
|
|
102
|
+
// Mark plan as FAILED
|
|
103
|
+
plan.status = 'FAILED';
|
|
104
|
+
plan.updatedAt = new Date().toISOString();
|
|
105
|
+
await writeFundingPlans(plans);
|
|
106
|
+
// Mark WAL as failed
|
|
107
|
+
await writeWalEntry({
|
|
108
|
+
intentId,
|
|
109
|
+
operation: 'auto-funding-execute',
|
|
110
|
+
params: { planId: plan.id },
|
|
111
|
+
status: 'failed',
|
|
112
|
+
createdAt: new Date().toISOString(),
|
|
113
|
+
error: msg,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
await saveTreasuryState();
|
|
118
|
+
}
|
|
119
|
+
// ── Treasury Heartbeat Jobs (PRD S10.4) ──────────────
|
|
120
|
+
export function registerTreasuryJobs(scheduler, logger, writeCurrentState, triggerFreeze, vaultKey) {
|
|
121
|
+
if (!isStablecoinConfigured()) {
|
|
122
|
+
logger.log('Treasury jobs skipped — stablecoin funding not configured');
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
// Load persisted treasury state on registration
|
|
126
|
+
void loadTreasuryState().catch(() => {
|
|
127
|
+
/* state will use defaults */
|
|
128
|
+
});
|
|
129
|
+
// WAL recovery: resolve pending operations from prior crash/restart
|
|
130
|
+
void recoverPendingOps(vaultKey, logger).catch((err) => {
|
|
131
|
+
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
132
|
+
logger.log(`WAL recovery failed: ${msg}`);
|
|
133
|
+
});
|
|
134
|
+
// Job 1: stablecoin-balance-check (hourly)
|
|
135
|
+
scheduler.add('stablecoin-balance-check', 3_600_000, async () => {
|
|
136
|
+
logger.log('Stablecoin balance check starting');
|
|
137
|
+
const treasuryState = getTreasuryState();
|
|
138
|
+
try {
|
|
139
|
+
const { getStablecoinAdapter } = await import('./financial/adapter-factory.js');
|
|
140
|
+
const adapter = await getStablecoinAdapter(vaultKey, logger);
|
|
141
|
+
const balances = await adapter.getBalances();
|
|
142
|
+
treasuryState.stablecoinBalanceCents = balances.totalStablecoinCents;
|
|
143
|
+
treasuryState.consecutiveProviderFailures = 0;
|
|
144
|
+
logger.log(`Stablecoin balance: $${(balances.totalStablecoinCents / 100).toFixed(2)} ` +
|
|
145
|
+
`(${balances.stablecoin.length} wallets)`);
|
|
146
|
+
await saveTreasuryState();
|
|
147
|
+
await writeCurrentState();
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
treasuryState.consecutiveProviderFailures += 1;
|
|
151
|
+
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
152
|
+
logger.log(`Stablecoin balance check failed (${treasuryState.consecutiveProviderFailures} consecutive): ${msg}`);
|
|
153
|
+
// CB-1: Provider unavailable for 3 consecutive polls
|
|
154
|
+
const cb = evaluateCircuitBreakers(treasuryState);
|
|
155
|
+
if (cb.shouldFreeze && !treasuryState.fundingFrozen) {
|
|
156
|
+
await triggerFreeze(cb.reasons.join('; '));
|
|
157
|
+
}
|
|
158
|
+
await saveTreasuryState();
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
// Job 2: offramp-status-poll (15 min)
|
|
162
|
+
scheduler.add('offramp-status-poll', 900_000, async () => {
|
|
163
|
+
const pending = await readPendingTransfers();
|
|
164
|
+
const activePending = pending.filter(t => t.status === 'pending' || t.status === 'processing');
|
|
165
|
+
if (activePending.length === 0)
|
|
166
|
+
return;
|
|
167
|
+
logger.log(`Polling ${activePending.length} pending off-ramp transfers`);
|
|
168
|
+
const treasuryState = getTreasuryState();
|
|
169
|
+
try {
|
|
170
|
+
const { getStablecoinAdapter } = await import('./financial/adapter-factory.js');
|
|
171
|
+
const adapter = await getStablecoinAdapter(vaultKey, logger);
|
|
172
|
+
let updated = false;
|
|
173
|
+
for (const transfer of activePending) {
|
|
174
|
+
try {
|
|
175
|
+
const status = await adapter.getTransferStatus(transfer.providerTransferId);
|
|
176
|
+
if (status.status !== transfer.status) {
|
|
177
|
+
transfer.status = status.status;
|
|
178
|
+
transfer.lastPolledAt = new Date().toISOString();
|
|
179
|
+
updated = true;
|
|
180
|
+
logger.log(`Transfer ${transfer.id} status: ${status.status} ` +
|
|
181
|
+
`($${(status.amountCents / 100).toFixed(2)})`);
|
|
182
|
+
if (status.status === 'completed') {
|
|
183
|
+
treasuryState.pendingTransferCount = Math.max(0, treasuryState.pendingTransferCount - 1);
|
|
184
|
+
// Mark matching funding plan as SETTLED
|
|
185
|
+
if (transfer.fundingPlanId) {
|
|
186
|
+
try {
|
|
187
|
+
const plans = await readFundingPlans();
|
|
188
|
+
const plan = plans.find(p => p.id === transfer.fundingPlanId);
|
|
189
|
+
if (plan && (plan.status === 'PENDING_SETTLEMENT' || plan.status === 'APPROVED')) {
|
|
190
|
+
plan.status = 'SETTLED';
|
|
191
|
+
plan.updatedAt = new Date().toISOString();
|
|
192
|
+
await writeFundingPlans(plans);
|
|
193
|
+
logger.log(`Funding plan ${plan.id} marked SETTLED`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (planErr) {
|
|
197
|
+
const planMsg = planErr instanceof Error ? planErr.message : 'Unknown error';
|
|
198
|
+
logger.log(`Failed to update funding plan status: ${planMsg}`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
206
|
+
logger.log(`Transfer ${transfer.id} poll failed: ${msg}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (updated) {
|
|
210
|
+
await writePendingTransfers(pending);
|
|
211
|
+
await saveTreasuryState();
|
|
212
|
+
}
|
|
213
|
+
// CB-2: Check for SLA breach on pending transfers
|
|
214
|
+
const slaCheck = evaluateTransferSlaBreaker(pending);
|
|
215
|
+
if (slaCheck.shouldFreeze && !treasuryState.fundingFrozen) {
|
|
216
|
+
await triggerFreeze(slaCheck.reasons.join('; '));
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
221
|
+
logger.log(`Off-ramp status poll error: ${msg}`);
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
// Job 3: bank-settlement-monitor (hourly)
|
|
225
|
+
scheduler.add('bank-settlement-monitor', 3_600_000, async () => {
|
|
226
|
+
logger.log('Bank settlement monitor starting');
|
|
227
|
+
const treasuryState = getTreasuryState();
|
|
228
|
+
try {
|
|
229
|
+
const { getBankAdapter } = await import('./financial/adapter-factory.js');
|
|
230
|
+
const bankAdapter = await getBankAdapter(vaultKey, logger);
|
|
231
|
+
if (!bankAdapter.getBalance) {
|
|
232
|
+
logger.log('Bank adapter does not support getBalance — skipping');
|
|
233
|
+
await writeCurrentState();
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
const balance = await bankAdapter.getBalance();
|
|
237
|
+
treasuryState.bankBalanceCents = balance.available;
|
|
238
|
+
logger.log(`Bank balance: $${(balance.available / 100).toFixed(2)} available, ` +
|
|
239
|
+
`$${(balance.pending / 100).toFixed(2)} pending`);
|
|
240
|
+
// Check for newly settled transfers
|
|
241
|
+
const pending = await readPendingTransfers();
|
|
242
|
+
const recentlyCompleted = pending.filter(t => t.status === 'completed');
|
|
243
|
+
if (recentlyCompleted.length > 0) {
|
|
244
|
+
logger.log(`${recentlyCompleted.length} transfer(s) settled since last check`);
|
|
245
|
+
}
|
|
246
|
+
await saveTreasuryState();
|
|
247
|
+
await writeCurrentState();
|
|
248
|
+
}
|
|
249
|
+
catch (err) {
|
|
250
|
+
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
251
|
+
logger.log(`Bank settlement monitor error: ${msg}`);
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
// Job 4: google-invoice-scan (daily)
|
|
255
|
+
scheduler.add('google-invoice-scan', 86_400_000, async () => {
|
|
256
|
+
logger.log('Google invoice scan starting');
|
|
257
|
+
const treasuryState = getTreasuryState();
|
|
258
|
+
try {
|
|
259
|
+
const { getBillingAdapter } = await import('./financial/adapter-factory.js');
|
|
260
|
+
const billingAdapter = await getBillingAdapter('google', vaultKey, logger);
|
|
261
|
+
if (!billingAdapter) {
|
|
262
|
+
logger.log('Google invoice scan: no billing adapter available — skipping');
|
|
263
|
+
await writeCurrentState();
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
const now = new Date();
|
|
267
|
+
const thirtyDaysAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);
|
|
268
|
+
const today = now.toISOString().slice(0, 10);
|
|
269
|
+
const start = thirtyDaysAgo.toISOString().slice(0, 10);
|
|
270
|
+
const invoices = await billingAdapter.readInvoices('google', { start, end: today });
|
|
271
|
+
// Identify pending/overdue invoices for obligation tracking
|
|
272
|
+
const pendingInvoices = invoices.filter(i => i.status === 'pending' || i.status === 'overdue');
|
|
273
|
+
const totalInvoiceCents = pendingInvoices.reduce((sum, i) => sum + i.amountCents, 0);
|
|
274
|
+
// Check for invoices due within 7 days
|
|
275
|
+
const sevenDaysFromNow = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);
|
|
276
|
+
const dueSoon = pendingInvoices.some(i => {
|
|
277
|
+
const dueDate = new Date(i.dueDate);
|
|
278
|
+
return dueDate.getTime() <= sevenDaysFromNow.getTime();
|
|
279
|
+
});
|
|
280
|
+
// Update treasury state with invoice data
|
|
281
|
+
treasuryState.googleInvoiceDueSoon = dueSoon;
|
|
282
|
+
treasuryState.googleInvoiceCents = totalInvoiceCents;
|
|
283
|
+
// Update pending obligations (add google invoices portion)
|
|
284
|
+
// Recalculate: google invoices + meta debits
|
|
285
|
+
treasuryState.pendingObligationsCents =
|
|
286
|
+
totalInvoiceCents + treasuryState.metaForecast7DayCents;
|
|
287
|
+
logger.log(`Google invoice scan: ${invoices.length} invoice(s), ` +
|
|
288
|
+
`${pendingInvoices.length} pending/overdue ` +
|
|
289
|
+
`($${(totalInvoiceCents / 100).toFixed(2)}), ` +
|
|
290
|
+
`due soon: ${dueSoon}`);
|
|
291
|
+
// Settlement planning: prioritize overdue invoices, then nearest due date
|
|
292
|
+
if (pendingInvoices.length > 0) {
|
|
293
|
+
const plans = planGoogleInvoiceSettlement(pendingInvoices.map(i => ({
|
|
294
|
+
invoiceId: i.id,
|
|
295
|
+
amountCents: i.amountCents,
|
|
296
|
+
dueDate: i.dueDate,
|
|
297
|
+
status: i.status,
|
|
298
|
+
})), treasuryState.bankBalanceCents, 50_000);
|
|
299
|
+
logger.log(`Settlement plans: ${plans.length} invoices prioritized for payment`);
|
|
300
|
+
}
|
|
301
|
+
// CB-4: Evaluate billing breakers with invoice data
|
|
302
|
+
const cbResult = evaluateBillingBreakers({
|
|
303
|
+
googleInvoiceDueSoon: dueSoon,
|
|
304
|
+
googleInvoiceCents: totalInvoiceCents,
|
|
305
|
+
bankBalanceCents: treasuryState.bankBalanceCents,
|
|
306
|
+
minimumBufferCents: 50_000, // $500 minimum buffer
|
|
307
|
+
metaDebitFailed: treasuryState.metaDebitFailed,
|
|
308
|
+
metaPaymentRisk: treasuryState.metaPaymentRisk,
|
|
309
|
+
});
|
|
310
|
+
if (cbResult.shouldFreeze && !treasuryState.fundingFrozen) {
|
|
311
|
+
await triggerFreeze(cbResult.reasons.join('; '));
|
|
312
|
+
}
|
|
313
|
+
await saveTreasuryState();
|
|
314
|
+
await writeCurrentState();
|
|
315
|
+
}
|
|
316
|
+
catch (err) {
|
|
317
|
+
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
318
|
+
logger.log(`Google invoice scan error: ${msg}`);
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
// Job 5: meta-debit-monitor (daily)
|
|
322
|
+
scheduler.add('meta-debit-monitor', 86_400_000, async () => {
|
|
323
|
+
logger.log('Meta debit monitor starting');
|
|
324
|
+
const treasuryState = getTreasuryState();
|
|
325
|
+
try {
|
|
326
|
+
const { getBillingAdapter } = await import('./financial/adapter-factory.js');
|
|
327
|
+
const billingAdapter = await getBillingAdapter('meta', vaultKey, logger);
|
|
328
|
+
if (!billingAdapter) {
|
|
329
|
+
logger.log('Meta debit monitor: no billing adapter available — skipping');
|
|
330
|
+
await writeCurrentState();
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
const now = new Date();
|
|
334
|
+
const today = now.toISOString().slice(0, 10);
|
|
335
|
+
const sevenDaysFromNow = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);
|
|
336
|
+
const end = sevenDaysFromNow.toISOString().slice(0, 10);
|
|
337
|
+
let debits = [];
|
|
338
|
+
let metaDebitFailed = false;
|
|
339
|
+
try {
|
|
340
|
+
debits = await billingAdapter.readExpectedDebits('meta', { start: today, end });
|
|
341
|
+
}
|
|
342
|
+
catch (debitErr) {
|
|
343
|
+
// If we can't read debits, Meta may be in a bad state
|
|
344
|
+
metaDebitFailed = true;
|
|
345
|
+
const msg = debitErr instanceof Error ? debitErr.message : 'Unknown error';
|
|
346
|
+
logger.log(`Meta debit read failed: ${msg}`);
|
|
347
|
+
debits = [];
|
|
348
|
+
}
|
|
349
|
+
// Sum expected debits for obligation tracking
|
|
350
|
+
const totalDebitCents = debits.reduce((sum, d) => sum + d.estimatedAmountCents, 0);
|
|
351
|
+
// Check for failed or risky debits
|
|
352
|
+
const hasFailedDebit = debits.some(d => d.status === 'failed');
|
|
353
|
+
// Meta "payment risk" = debit failed or adapter call failed
|
|
354
|
+
const paymentRisk = metaDebitFailed || hasFailedDebit;
|
|
355
|
+
// Update treasury state with debit data
|
|
356
|
+
treasuryState.metaDebitFailed = metaDebitFailed || hasFailedDebit;
|
|
357
|
+
treasuryState.metaPaymentRisk = paymentRisk;
|
|
358
|
+
treasuryState.metaForecast7DayCents = totalDebitCents;
|
|
359
|
+
// Update pending obligations (google invoices + meta debits)
|
|
360
|
+
treasuryState.pendingObligationsCents =
|
|
361
|
+
treasuryState.googleInvoiceCents + totalDebitCents;
|
|
362
|
+
logger.log(`Meta debit monitor: ${debits.length} expected debit(s) ` +
|
|
363
|
+
`($${(totalDebitCents / 100).toFixed(2)} next 7 days), ` +
|
|
364
|
+
`failed: ${hasFailedDebit}, risk: ${paymentRisk}`);
|
|
365
|
+
// Debit protection: calculate additional buffer needed for upcoming Meta debits
|
|
366
|
+
if (debits.length > 0) {
|
|
367
|
+
const additionalBuffer = planMetaDebitProtection(debits.map(d => ({
|
|
368
|
+
date: d.expectedDate,
|
|
369
|
+
amountCents: d.estimatedAmountCents,
|
|
370
|
+
})), treasuryState.bankBalanceCents, 50_000);
|
|
371
|
+
if (additionalBuffer > 0) {
|
|
372
|
+
logger.log(`Meta debit protection: additional buffer needed $${(additionalBuffer / 100).toFixed(2)}`);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
// CB-5: Evaluate billing breakers with debit data
|
|
376
|
+
const cbResult = evaluateBillingBreakers({
|
|
377
|
+
googleInvoiceDueSoon: treasuryState.googleInvoiceDueSoon,
|
|
378
|
+
googleInvoiceCents: treasuryState.googleInvoiceCents,
|
|
379
|
+
bankBalanceCents: treasuryState.bankBalanceCents,
|
|
380
|
+
minimumBufferCents: 50_000, // $500 minimum buffer
|
|
381
|
+
metaDebitFailed: treasuryState.metaDebitFailed,
|
|
382
|
+
metaPaymentRisk: paymentRisk,
|
|
383
|
+
});
|
|
384
|
+
if (cbResult.shouldFreeze && !treasuryState.fundingFrozen) {
|
|
385
|
+
await triggerFreeze(cbResult.reasons.join('; '));
|
|
386
|
+
}
|
|
387
|
+
await saveTreasuryState();
|
|
388
|
+
await writeCurrentState();
|
|
389
|
+
}
|
|
390
|
+
catch (err) {
|
|
391
|
+
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
392
|
+
logger.log(`Meta debit monitor error: ${msg}`);
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
// Job 6: runway-forecast (every 6 hours)
|
|
396
|
+
scheduler.add('runway-forecast', 21_600_000, async () => {
|
|
397
|
+
logger.log('Runway forecast starting');
|
|
398
|
+
const treasuryState = getTreasuryState();
|
|
399
|
+
try {
|
|
400
|
+
// Read campaign data for spend projection
|
|
401
|
+
const campaignsDir = join(TREASURY_DIR, 'campaigns');
|
|
402
|
+
const campaigns = [];
|
|
403
|
+
if (existsSync(campaignsDir)) {
|
|
404
|
+
const { readdir } = await import('node:fs/promises');
|
|
405
|
+
const files = await readdir(campaignsDir);
|
|
406
|
+
for (const file of files) {
|
|
407
|
+
if (!file.endsWith('.json'))
|
|
408
|
+
continue;
|
|
409
|
+
try {
|
|
410
|
+
const content = await readFile(join(campaignsDir, file), 'utf-8');
|
|
411
|
+
const c = JSON.parse(content);
|
|
412
|
+
campaigns.push({
|
|
413
|
+
campaignId: c.id ?? file,
|
|
414
|
+
platform: c.platform ?? 'google',
|
|
415
|
+
dailyBudgetCents: c.dailyBudgetCents ?? 0,
|
|
416
|
+
status: c.status ?? 'paused',
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
catch { /* skip malformed */ }
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
const bankBalance = treasuryState.bankBalanceCents;
|
|
423
|
+
const pendingObligations = treasuryState.pendingObligationsCents;
|
|
424
|
+
const forecast = forecastRunway(bankBalance, campaigns, pendingObligations);
|
|
425
|
+
treasuryState.runwayDays = forecast.runwayDays;
|
|
426
|
+
logger.log(`Runway forecast: ${forecast.runwayDays} days ` +
|
|
427
|
+
`(bank $${(bankBalance / 100).toFixed(2)}, ` +
|
|
428
|
+
`daily spend $${(forecast.dailySpendCents / 100).toFixed(2)})`);
|
|
429
|
+
// Auto-funding evaluation: if runway is low, check if we should auto-off-ramp
|
|
430
|
+
if (!treasuryState.fundingFrozen) {
|
|
431
|
+
const autoConfig = {
|
|
432
|
+
source: {
|
|
433
|
+
id: 'default-source',
|
|
434
|
+
provider: 'circle',
|
|
435
|
+
asset: 'USDC',
|
|
436
|
+
network: 'ETH',
|
|
437
|
+
sourceAccountId: 'default',
|
|
438
|
+
whitelistedDestinationBankId: 'default-bank',
|
|
439
|
+
status: 'active',
|
|
440
|
+
},
|
|
441
|
+
bank: {
|
|
442
|
+
id: 'default-bank',
|
|
443
|
+
provider: 'mercury',
|
|
444
|
+
accountId: 'default',
|
|
445
|
+
currency: 'USD',
|
|
446
|
+
availableBalanceCents: bankBalance,
|
|
447
|
+
reservedBalanceCents: 0,
|
|
448
|
+
minimumBufferCents: 50_000, // $500
|
|
449
|
+
},
|
|
450
|
+
planConfig: {
|
|
451
|
+
minimumOfframpCents: 10_000, // $100
|
|
452
|
+
bufferTargetCents: 100_000, // $1,000
|
|
453
|
+
maxDailyOfframpCents: 5_000_000, // $50,000
|
|
454
|
+
targetRunwayDays: 30,
|
|
455
|
+
},
|
|
456
|
+
pendingSpendCents: pendingObligations,
|
|
457
|
+
obligations: [],
|
|
458
|
+
googleInvoiceDueSoon: treasuryState.googleInvoiceDueSoon,
|
|
459
|
+
googleInvoiceCents: treasuryState.googleInvoiceCents,
|
|
460
|
+
metaUsesDirectDebit: treasuryState.metaForecast7DayCents > 0,
|
|
461
|
+
metaForecast7DayCents: treasuryState.metaForecast7DayCents,
|
|
462
|
+
debitProtectionBufferCents: 0,
|
|
463
|
+
discrepancyExists: treasuryState.consecutiveMismatches > 0,
|
|
464
|
+
previousHash: '',
|
|
465
|
+
};
|
|
466
|
+
const autoResult = evaluateAutoFunding(autoConfig);
|
|
467
|
+
if (autoResult) {
|
|
468
|
+
logger.log(`Auto-funding approved: $${(autoResult.plan.requiredCents / 100).toFixed(2)} ` +
|
|
469
|
+
`(reason: ${autoResult.plan.reason}) — queuing for execution`);
|
|
470
|
+
// Log the approved plan
|
|
471
|
+
await mkdir(TREASURY_DIR, { recursive: true });
|
|
472
|
+
await appendFile(FUNDING_PLANS_LOG, JSON.stringify(autoResult.plan) + '\n', 'utf-8');
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
logger.log('Auto-funding: no action needed or policy blocked');
|
|
476
|
+
}
|
|
477
|
+
// Execute approved funding plans
|
|
478
|
+
await executeApprovedPlans(vaultKey, logger, triggerFreeze);
|
|
479
|
+
}
|
|
480
|
+
await saveTreasuryState();
|
|
481
|
+
await writeCurrentState();
|
|
482
|
+
}
|
|
483
|
+
catch (err) {
|
|
484
|
+
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
485
|
+
logger.log(`Runway forecast error: ${msg}`);
|
|
486
|
+
}
|
|
487
|
+
});
|
|
488
|
+
// Job 7: funding-reconciliation (extends existing reconciliation at midnight+06:00)
|
|
489
|
+
scheduler.add('funding-reconciliation', 3_600_000, async () => {
|
|
490
|
+
const hour = new Date().getUTCHours();
|
|
491
|
+
if (hour !== 0 && hour !== 6)
|
|
492
|
+
return;
|
|
493
|
+
logger.log(`Funding reconciliation (${hour === 0 ? 'preliminary' : 'authoritative'}) starting`);
|
|
494
|
+
const treasuryState = getTreasuryState();
|
|
495
|
+
try {
|
|
496
|
+
// Read provider transfers from transfers log
|
|
497
|
+
const providerTransfers = [];
|
|
498
|
+
if (existsSync(TRANSFERS_LOG)) {
|
|
499
|
+
const content = await readFile(TRANSFERS_LOG, 'utf-8');
|
|
500
|
+
const lines = content.trim().split('\n').filter(Boolean);
|
|
501
|
+
for (const line of lines) {
|
|
502
|
+
try {
|
|
503
|
+
const t = JSON.parse(line);
|
|
504
|
+
providerTransfers.push(t);
|
|
505
|
+
}
|
|
506
|
+
catch { /* skip malformed */ }
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
// Bank transactions and platform spend are empty until bank adapter
|
|
510
|
+
// is wired with real credentials
|
|
511
|
+
const bankTransactions = [];
|
|
512
|
+
const platformSpend = [];
|
|
513
|
+
const report = reconcileThreeWay(providerTransfers, bankTransactions, platformSpend);
|
|
514
|
+
// Write report to reconciliation log
|
|
515
|
+
await mkdir(TREASURY_DIR, { recursive: true });
|
|
516
|
+
await appendFile(RECONCILIATION_LOG, JSON.stringify({ ...report, type: hour === 0 ? 'preliminary' : 'authoritative' }) + '\n', 'utf-8');
|
|
517
|
+
treasuryState.lastReconciliationAt = new Date().toISOString();
|
|
518
|
+
// Track consecutive mismatches for CB-3
|
|
519
|
+
if (report.mismatchCount > 0) {
|
|
520
|
+
treasuryState.consecutiveMismatches += 1;
|
|
521
|
+
logger.log(`Reconciliation: ${report.mismatchCount} mismatch(es), ` +
|
|
522
|
+
`${treasuryState.consecutiveMismatches} consecutive`);
|
|
523
|
+
}
|
|
524
|
+
else {
|
|
525
|
+
treasuryState.consecutiveMismatches = 0;
|
|
526
|
+
logger.log(`Reconciliation: clean — ${report.transferMatches.length} transfers matched, ` +
|
|
527
|
+
`variance $${(report.overallVarianceCents / 100).toFixed(2)}`);
|
|
528
|
+
}
|
|
529
|
+
// CB-3: Reconciliation mismatch for 2 consecutive closes
|
|
530
|
+
if (shouldFreeze(report.mismatchCount, treasuryState.consecutiveMismatches, 2)) {
|
|
531
|
+
if (!treasuryState.fundingFrozen) {
|
|
532
|
+
await triggerFreeze(`Reconciliation mismatch for ${treasuryState.consecutiveMismatches} consecutive closes`);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
await saveTreasuryState();
|
|
536
|
+
await writeCurrentState();
|
|
537
|
+
}
|
|
538
|
+
catch (err) {
|
|
539
|
+
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
540
|
+
logger.log(`Funding reconciliation error: ${msg}`);
|
|
541
|
+
}
|
|
542
|
+
});
|
|
543
|
+
// Job 8: stale-plan-detector (hourly)
|
|
544
|
+
scheduler.add('stale-plan-detector', 3_600_000, async () => {
|
|
545
|
+
try {
|
|
546
|
+
if (!existsSync(FUNDING_PLANS_LOG))
|
|
547
|
+
return;
|
|
548
|
+
const content = await readFile(FUNDING_PLANS_LOG, 'utf-8');
|
|
549
|
+
const lines = content.trim().split('\n').filter(Boolean);
|
|
550
|
+
const STALE_THRESHOLD_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
551
|
+
const now = Date.now();
|
|
552
|
+
let staleCount = 0;
|
|
553
|
+
for (const line of lines) {
|
|
554
|
+
try {
|
|
555
|
+
const plan = JSON.parse(line);
|
|
556
|
+
if (plan.status !== 'DRAFT' && plan.status !== 'APPROVED')
|
|
557
|
+
continue;
|
|
558
|
+
const age = now - new Date(plan.createdAt ?? '').getTime();
|
|
559
|
+
if (age > STALE_THRESHOLD_MS) {
|
|
560
|
+
staleCount += 1;
|
|
561
|
+
logger.log(`Stale funding plan: ${plan.id} (${plan.status}, ${Math.round(age / (60 * 60 * 1000))}h old)`);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
catch { /* skip malformed */ }
|
|
565
|
+
}
|
|
566
|
+
if (staleCount > 0) {
|
|
567
|
+
logger.log(`${staleCount} stale funding plan(s) detected — plans stuck in PENDING >24h`);
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
catch (err) {
|
|
571
|
+
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
572
|
+
logger.log(`Stale plan detector error: ${msg}`);
|
|
573
|
+
}
|
|
574
|
+
});
|
|
575
|
+
// Job 9: treasury-backup (daily — encrypted AES-256-GCM snapshots, 30-day retention)
|
|
576
|
+
scheduler.add('treasury-backup', 86_400_000, async () => {
|
|
577
|
+
logger.log('Treasury backup starting');
|
|
578
|
+
try {
|
|
579
|
+
const result = await createDailyBackup(vaultKey ?? '');
|
|
580
|
+
logger.log(`Treasury backup: ${result.files} files backed up to ${result.path}`);
|
|
581
|
+
await writeCurrentState();
|
|
582
|
+
}
|
|
583
|
+
catch (err) {
|
|
584
|
+
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
585
|
+
logger.log(`Treasury backup error: ${msg}`);
|
|
586
|
+
}
|
|
587
|
+
});
|
|
588
|
+
logger.log('Treasury heartbeat jobs registered (9 jobs, WAL recovery active)');
|
|
589
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Treasury Migrator — Migrate global treasury data to per-project paths.
|
|
3
|
+
*
|
|
4
|
+
* v22.0 moved financial paths per-project ({project}/cultivation/treasury/)
|
|
5
|
+
* but left no migration tooling. Existing users with global treasury data
|
|
6
|
+
* at ~/.voidforge/treasury/ see empty dashboards after upgrading.
|
|
7
|
+
*
|
|
8
|
+
* Strategy: Clean break. Global data is archived, not copied. Per-project
|
|
9
|
+
* logs start with genesis hash ('0'). Copying would create false provenance
|
|
10
|
+
* (Riker/Spock dissent, ADR-041 decision).
|
|
11
|
+
*
|
|
12
|
+
* v22.1 Mission 1 — Campaign 30
|
|
13
|
+
*/
|
|
14
|
+
import { type Project } from './project-registry.js';
|
|
15
|
+
import { type ProjectContext } from './project-scope.js';
|
|
16
|
+
export interface MigrationPreFlight {
|
|
17
|
+
projectId: string;
|
|
18
|
+
project: Project | null;
|
|
19
|
+
context: ProjectContext | null;
|
|
20
|
+
globalTreasuryDir: string;
|
|
21
|
+
globalTreasuryExists: boolean;
|
|
22
|
+
globalFileCount: number;
|
|
23
|
+
cultivationInstalled: boolean;
|
|
24
|
+
daemonRunning: boolean;
|
|
25
|
+
errors: string[];
|
|
26
|
+
warnings: string[];
|
|
27
|
+
}
|
|
28
|
+
export interface MigrationManifest {
|
|
29
|
+
version: '22.1';
|
|
30
|
+
migratedAt: string;
|
|
31
|
+
projectId: string;
|
|
32
|
+
projectName: string;
|
|
33
|
+
projectDir: string;
|
|
34
|
+
sourceDir: string;
|
|
35
|
+
archiveDir: string;
|
|
36
|
+
sourceFileCount: number;
|
|
37
|
+
spendLogEntries: number;
|
|
38
|
+
revenueLogEntries: number;
|
|
39
|
+
spendLogHashValid: boolean;
|
|
40
|
+
revenueLogHashValid: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface MigrationResult {
|
|
43
|
+
success: boolean;
|
|
44
|
+
manifest: MigrationManifest;
|
|
45
|
+
archiveDir: string;
|
|
46
|
+
treasuryDir: string;
|
|
47
|
+
}
|
|
48
|
+
export declare function preFlightCheck(projectId: string): Promise<MigrationPreFlight>;
|
|
49
|
+
/**
|
|
50
|
+
* Execute treasury migration for a project.
|
|
51
|
+
*
|
|
52
|
+
* Steps:
|
|
53
|
+
* 1. Archive global treasury to ~/.voidforge/treasury-pre-v22/
|
|
54
|
+
* 2. Create per-project cultivation/treasury/ with genesis files
|
|
55
|
+
* 3. Write migration manifest
|
|
56
|
+
* 4. Set 0700 permissions on treasury directory
|
|
57
|
+
* 5. Validate hash chains in archived logs
|
|
58
|
+
*/
|
|
59
|
+
export declare function migrateTreasury(context: ProjectContext): Promise<MigrationResult>;
|