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,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern: Funding Plan (Core Data Structure + Pure Logic)
|
|
3
|
+
*
|
|
4
|
+
* Key principles:
|
|
5
|
+
* - The FundingPlan is the central data structure connecting:
|
|
6
|
+
* stablecoin source → off-ramp → bank settlement → platform billing
|
|
7
|
+
* - Plans are IMMUTABLE once approved — state transitions only, no field edits
|
|
8
|
+
* - Hash-chained for tamper-evident audit trail (per financial-transaction.ts)
|
|
9
|
+
* - All monetary values use branded integer cents (Cents type)
|
|
10
|
+
* - Pure logic functions: no I/O, no side effects, fully testable
|
|
11
|
+
* - Single-writer: only Heartbeat daemon creates and transitions FundingPlans
|
|
12
|
+
*
|
|
13
|
+
* Agents: Dockson (treasury), Heartbeat daemon
|
|
14
|
+
*
|
|
15
|
+
* PRD Reference: §12.1, §12.2, §12.4, §12.5, §12.6, §13, §15
|
|
16
|
+
*/
|
|
17
|
+
type Cents = number & {
|
|
18
|
+
readonly __brand: 'Cents';
|
|
19
|
+
};
|
|
20
|
+
declare function toCents(dollars: number): Cents;
|
|
21
|
+
declare function toDollars(cents: Cents): number;
|
|
22
|
+
type StablecoinProviderType = 'circle' | 'bridge' | 'manual';
|
|
23
|
+
interface StablecoinFundingSource {
|
|
24
|
+
id: string;
|
|
25
|
+
provider: StablecoinProviderType;
|
|
26
|
+
asset: string;
|
|
27
|
+
network: string;
|
|
28
|
+
sourceAccountId: string;
|
|
29
|
+
whitelistedDestinationBankId: string;
|
|
30
|
+
status: 'active' | 'suspended' | 'unconfigured';
|
|
31
|
+
}
|
|
32
|
+
type BankProvider = 'mercury' | 'external';
|
|
33
|
+
interface OperatingBankAccount {
|
|
34
|
+
id: string;
|
|
35
|
+
provider: BankProvider;
|
|
36
|
+
accountId: string;
|
|
37
|
+
currency: 'USD';
|
|
38
|
+
availableBalanceCents: Cents;
|
|
39
|
+
reservedBalanceCents: Cents;
|
|
40
|
+
minimumBufferCents: Cents;
|
|
41
|
+
}
|
|
42
|
+
type CapabilityState = 'FULLY_FUNDABLE' | 'MONITORED_ONLY' | 'UNSUPPORTED';
|
|
43
|
+
type BillingMode = 'monthly_invoicing' | 'direct_debit' | 'extended_credit' | 'manual_bank_transfer' | 'card_only' | 'unknown';
|
|
44
|
+
type AdPlatform = 'google' | 'meta';
|
|
45
|
+
interface PlatformBillingProfile {
|
|
46
|
+
platform: AdPlatform;
|
|
47
|
+
capabilityState: CapabilityState;
|
|
48
|
+
billingMode: BillingMode;
|
|
49
|
+
externalAccountId: string;
|
|
50
|
+
billingSetupId?: string;
|
|
51
|
+
invoiceGroupId?: string;
|
|
52
|
+
paymentProfileId?: string;
|
|
53
|
+
fundingSourceId?: string;
|
|
54
|
+
currency: 'USD';
|
|
55
|
+
nextDueDate?: string;
|
|
56
|
+
status: 'active' | 'degraded' | 'suspended' | 'unconfigured';
|
|
57
|
+
}
|
|
58
|
+
type FundingPlanStatus = 'DRAFT' | 'APPROVED' | 'PENDING_SETTLEMENT' | 'SETTLED' | 'FAILED' | 'FROZEN';
|
|
59
|
+
type FundingPlanReason = 'LOW_BUFFER' | 'INVOICE_DUE' | 'RUNWAY_SHORTFALL' | 'MANUAL_REQUEST';
|
|
60
|
+
type ApprovalMode = 'policy_auto' | 'vault_manual' | 'totp_required';
|
|
61
|
+
type TargetPlatform = AdPlatform | 'shared_buffer';
|
|
62
|
+
interface FundingPlan {
|
|
63
|
+
id: string;
|
|
64
|
+
createdAt: string;
|
|
65
|
+
updatedAt: string;
|
|
66
|
+
reason: FundingPlanReason;
|
|
67
|
+
sourceFundingId: string;
|
|
68
|
+
destinationBankId: string;
|
|
69
|
+
targetPlatform: TargetPlatform;
|
|
70
|
+
requiredCents: Cents;
|
|
71
|
+
reservedCents: Cents;
|
|
72
|
+
status: FundingPlanStatus;
|
|
73
|
+
approvalMode: ApprovalMode;
|
|
74
|
+
approvedAt?: string;
|
|
75
|
+
approvedBy?: string;
|
|
76
|
+
settledAt?: string;
|
|
77
|
+
failureReason?: string;
|
|
78
|
+
idempotencyKey: string;
|
|
79
|
+
previousHash: string;
|
|
80
|
+
hash: string;
|
|
81
|
+
}
|
|
82
|
+
type TransferDirection = 'crypto_to_fiat' | 'bank_to_platform' | 'platform_debit';
|
|
83
|
+
type TransferStatus = 'pending' | 'processing' | 'completed' | 'failed' | 'cancelled';
|
|
84
|
+
interface TransferRecord {
|
|
85
|
+
id: string;
|
|
86
|
+
fundingPlanId: string;
|
|
87
|
+
providerTransferId: string;
|
|
88
|
+
bankTransactionId?: string;
|
|
89
|
+
direction: TransferDirection;
|
|
90
|
+
amountCents: Cents;
|
|
91
|
+
feesCents: Cents;
|
|
92
|
+
netAmountCents: Cents;
|
|
93
|
+
currency: 'USD';
|
|
94
|
+
reference: string;
|
|
95
|
+
status: TransferStatus;
|
|
96
|
+
initiatedAt: string;
|
|
97
|
+
completedAt?: string;
|
|
98
|
+
previousHash: string;
|
|
99
|
+
hash: string;
|
|
100
|
+
}
|
|
101
|
+
type ReconciliationResult = 'MATCHED' | 'WITHIN_THRESHOLD' | 'MISMATCH';
|
|
102
|
+
interface ReconciliationRecord {
|
|
103
|
+
id: string;
|
|
104
|
+
platform: AdPlatform;
|
|
105
|
+
date: string;
|
|
106
|
+
spendCents: Cents;
|
|
107
|
+
bankSettledCents: Cents;
|
|
108
|
+
invoiceCents: Cents;
|
|
109
|
+
varianceCents: Cents;
|
|
110
|
+
result: ReconciliationResult;
|
|
111
|
+
notes: string;
|
|
112
|
+
createdAt: string;
|
|
113
|
+
previousHash: string;
|
|
114
|
+
hash: string;
|
|
115
|
+
}
|
|
116
|
+
declare function computePlanHash(plan: Omit<FundingPlan, 'hash'>, previousHash: string): string;
|
|
117
|
+
declare function computeTransferHash(record: Omit<TransferRecord, 'hash'>, previousHash: string): string;
|
|
118
|
+
declare function computeReconciliationHash(record: Omit<ReconciliationRecord, 'hash'>, previousHash: string): string;
|
|
119
|
+
declare function createFundingPlan(reason: FundingPlanReason, sourceFundingId: string, destinationBankId: string, targetPlatform: TargetPlatform, requiredCents: Cents, previousHash: string): FundingPlan;
|
|
120
|
+
declare function approvePlan(plan: FundingPlan, approvalMode: ApprovalMode, approvedBy: string): FundingPlan;
|
|
121
|
+
declare function transitionPlan(plan: FundingPlan, newStatus: FundingPlanStatus, reason?: string): FundingPlan;
|
|
122
|
+
declare function calculateRunway(bankBalanceCents: Cents, dailySpendRateCents: Cents): number;
|
|
123
|
+
declare function shouldTriggerOfframp(bankBalanceCents: Cents, bufferThresholdCents: Cents, pendingSpendCents: Cents, pendingOfframpCents: Cents): boolean;
|
|
124
|
+
declare function calculateRequiredOfframp(bankBalanceCents: Cents, bufferThresholdCents: Cents, pendingSpendCents: Cents, pendingOfframpCents: Cents, minimumOfframpCents: Cents): Cents;
|
|
125
|
+
declare function reconcileTransfer(transferAmountCents: Cents, bankTransactionCents: Cents, platformSpendCents: Cents, thresholdBps: number, // basis points tolerance (e.g., 50 = 0.5%)
|
|
126
|
+
platform: AdPlatform, date: string, previousHash: string): ReconciliationRecord;
|
|
127
|
+
interface PendingObligation {
|
|
128
|
+
id: string;
|
|
129
|
+
platform: AdPlatform;
|
|
130
|
+
amountCents: Cents;
|
|
131
|
+
dueDate: string;
|
|
132
|
+
overdue: boolean;
|
|
133
|
+
}
|
|
134
|
+
declare function prioritizeObligations(obligations: PendingObligation[]): PendingObligation[];
|
|
135
|
+
export type { Cents, StablecoinProviderType, StablecoinFundingSource, BankProvider, OperatingBankAccount, CapabilityState, BillingMode, AdPlatform, PlatformBillingProfile, FundingPlanStatus, FundingPlanReason, ApprovalMode, TargetPlatform, FundingPlan, TransferDirection, TransferStatus, TransferRecord, ReconciliationResult, ReconciliationRecord, PendingObligation, };
|
|
136
|
+
export { toCents, toDollars, computePlanHash, computeTransferHash, computeReconciliationHash, createFundingPlan, approvePlan, transitionPlan, calculateRunway, shouldTriggerOfframp, calculateRequiredOfframp, reconcileTransfer, prioritizeObligations, };
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern: Funding Plan (Core Data Structure + Pure Logic)
|
|
3
|
+
*
|
|
4
|
+
* Key principles:
|
|
5
|
+
* - The FundingPlan is the central data structure connecting:
|
|
6
|
+
* stablecoin source → off-ramp → bank settlement → platform billing
|
|
7
|
+
* - Plans are IMMUTABLE once approved — state transitions only, no field edits
|
|
8
|
+
* - Hash-chained for tamper-evident audit trail (per financial-transaction.ts)
|
|
9
|
+
* - All monetary values use branded integer cents (Cents type)
|
|
10
|
+
* - Pure logic functions: no I/O, no side effects, fully testable
|
|
11
|
+
* - Single-writer: only Heartbeat daemon creates and transitions FundingPlans
|
|
12
|
+
*
|
|
13
|
+
* Agents: Dockson (treasury), Heartbeat daemon
|
|
14
|
+
*
|
|
15
|
+
* PRD Reference: §12.1, §12.2, §12.4, §12.5, §12.6, §13, §15
|
|
16
|
+
*/
|
|
17
|
+
import { createHash } from 'node:crypto';
|
|
18
|
+
function toCents(dollars) {
|
|
19
|
+
return Math.round(dollars * 100);
|
|
20
|
+
}
|
|
21
|
+
function toDollars(cents) {
|
|
22
|
+
return cents / 100;
|
|
23
|
+
}
|
|
24
|
+
// ── Hash Chain Helpers ──────────────────────────────
|
|
25
|
+
function computePlanHash(plan, previousHash) {
|
|
26
|
+
const payload = JSON.stringify({
|
|
27
|
+
id: plan.id,
|
|
28
|
+
reason: plan.reason,
|
|
29
|
+
sourceFundingId: plan.sourceFundingId,
|
|
30
|
+
destinationBankId: plan.destinationBankId,
|
|
31
|
+
requiredCents: plan.requiredCents,
|
|
32
|
+
status: plan.status,
|
|
33
|
+
createdAt: plan.createdAt,
|
|
34
|
+
idempotencyKey: plan.idempotencyKey,
|
|
35
|
+
}) + previousHash;
|
|
36
|
+
return createHash('sha256').update(payload).digest('hex');
|
|
37
|
+
}
|
|
38
|
+
function computeTransferHash(record, previousHash) {
|
|
39
|
+
const payload = JSON.stringify({
|
|
40
|
+
id: record.id,
|
|
41
|
+
fundingPlanId: record.fundingPlanId,
|
|
42
|
+
providerTransferId: record.providerTransferId,
|
|
43
|
+
amountCents: record.amountCents,
|
|
44
|
+
feesCents: record.feesCents,
|
|
45
|
+
status: record.status,
|
|
46
|
+
initiatedAt: record.initiatedAt,
|
|
47
|
+
}) + previousHash;
|
|
48
|
+
return createHash('sha256').update(payload).digest('hex');
|
|
49
|
+
}
|
|
50
|
+
function computeReconciliationHash(record, previousHash) {
|
|
51
|
+
const payload = JSON.stringify({
|
|
52
|
+
id: record.id,
|
|
53
|
+
platform: record.platform,
|
|
54
|
+
date: record.date,
|
|
55
|
+
spendCents: record.spendCents,
|
|
56
|
+
bankSettledCents: record.bankSettledCents,
|
|
57
|
+
invoiceCents: record.invoiceCents,
|
|
58
|
+
varianceCents: record.varianceCents,
|
|
59
|
+
result: record.result,
|
|
60
|
+
}) + previousHash;
|
|
61
|
+
return createHash('sha256').update(payload).digest('hex');
|
|
62
|
+
}
|
|
63
|
+
// ── Pure Logic: Funding Plan Creation ───────────────
|
|
64
|
+
function createFundingPlan(reason, sourceFundingId, destinationBankId, targetPlatform, requiredCents, previousHash) {
|
|
65
|
+
const now = new Date().toISOString();
|
|
66
|
+
const id = crypto.randomUUID();
|
|
67
|
+
const idempotencyKey = crypto.randomUUID();
|
|
68
|
+
const draft = {
|
|
69
|
+
id,
|
|
70
|
+
createdAt: now,
|
|
71
|
+
updatedAt: now,
|
|
72
|
+
reason,
|
|
73
|
+
sourceFundingId,
|
|
74
|
+
destinationBankId,
|
|
75
|
+
targetPlatform,
|
|
76
|
+
requiredCents,
|
|
77
|
+
reservedCents: 0,
|
|
78
|
+
status: 'DRAFT',
|
|
79
|
+
approvalMode: 'policy_auto', // default; upgraded by approval logic
|
|
80
|
+
idempotencyKey,
|
|
81
|
+
previousHash,
|
|
82
|
+
};
|
|
83
|
+
const hash = computePlanHash(draft, previousHash);
|
|
84
|
+
return { ...draft, hash };
|
|
85
|
+
}
|
|
86
|
+
// ── Pure Logic: Plan Approval ───────────────────────
|
|
87
|
+
function approvePlan(plan, approvalMode, approvedBy) {
|
|
88
|
+
if (plan.status !== 'DRAFT') {
|
|
89
|
+
throw new Error(`Cannot approve plan in status ${plan.status} — must be DRAFT`);
|
|
90
|
+
}
|
|
91
|
+
const now = new Date().toISOString();
|
|
92
|
+
const approved = {
|
|
93
|
+
...plan,
|
|
94
|
+
status: 'APPROVED',
|
|
95
|
+
approvalMode,
|
|
96
|
+
approvedBy,
|
|
97
|
+
approvedAt: now,
|
|
98
|
+
updatedAt: now,
|
|
99
|
+
previousHash: plan.hash,
|
|
100
|
+
};
|
|
101
|
+
const hash = computePlanHash(approved, plan.hash);
|
|
102
|
+
return { ...approved, hash };
|
|
103
|
+
}
|
|
104
|
+
// ── Pure Logic: Plan State Transitions ──────────────
|
|
105
|
+
function transitionPlan(plan, newStatus, reason) {
|
|
106
|
+
// Validate allowed transitions
|
|
107
|
+
const allowedTransitions = {
|
|
108
|
+
'DRAFT': ['APPROVED', 'FROZEN'],
|
|
109
|
+
'APPROVED': ['PENDING_SETTLEMENT', 'FROZEN', 'FAILED'],
|
|
110
|
+
'PENDING_SETTLEMENT': ['SETTLED', 'FAILED', 'FROZEN'],
|
|
111
|
+
'SETTLED': [], // terminal state
|
|
112
|
+
'FAILED': ['DRAFT'], // can retry by creating new draft
|
|
113
|
+
'FROZEN': ['DRAFT'], // can unfreeze to draft for re-approval
|
|
114
|
+
};
|
|
115
|
+
const allowed = allowedTransitions[plan.status];
|
|
116
|
+
if (!allowed.includes(newStatus)) {
|
|
117
|
+
throw new Error(`Invalid transition: ${plan.status} → ${newStatus}. Allowed: ${allowed.join(', ') || 'none (terminal)'}`);
|
|
118
|
+
}
|
|
119
|
+
const now = new Date().toISOString();
|
|
120
|
+
const transitioned = {
|
|
121
|
+
...plan,
|
|
122
|
+
status: newStatus,
|
|
123
|
+
updatedAt: now,
|
|
124
|
+
settledAt: newStatus === 'SETTLED' ? now : plan.settledAt,
|
|
125
|
+
failureReason: newStatus === 'FAILED' ? reason : plan.failureReason,
|
|
126
|
+
previousHash: plan.hash,
|
|
127
|
+
};
|
|
128
|
+
const hash = computePlanHash(transitioned, plan.hash);
|
|
129
|
+
return { ...transitioned, hash };
|
|
130
|
+
}
|
|
131
|
+
// ── Pure Logic: Runway Calculation ──────────────────
|
|
132
|
+
function calculateRunway(bankBalanceCents, dailySpendRateCents) {
|
|
133
|
+
if (dailySpendRateCents <= 0)
|
|
134
|
+
return Infinity;
|
|
135
|
+
return Math.floor(bankBalanceCents / dailySpendRateCents);
|
|
136
|
+
}
|
|
137
|
+
// ── Pure Logic: Off-ramp Trigger Decision ───────────
|
|
138
|
+
function shouldTriggerOfframp(bankBalanceCents, bufferThresholdCents, pendingSpendCents, pendingOfframpCents) {
|
|
139
|
+
// Available balance after accounting for pending obligations
|
|
140
|
+
const effectiveBalance = (bankBalanceCents - pendingSpendCents + pendingOfframpCents);
|
|
141
|
+
return effectiveBalance < bufferThresholdCents;
|
|
142
|
+
}
|
|
143
|
+
// ── Pure Logic: Required Off-ramp Amount ────────────
|
|
144
|
+
function calculateRequiredOfframp(bankBalanceCents, bufferThresholdCents, pendingSpendCents, pendingOfframpCents, minimumOfframpCents) {
|
|
145
|
+
const deficit = (bufferThresholdCents + pendingSpendCents - bankBalanceCents - pendingOfframpCents);
|
|
146
|
+
if (deficit <= 0)
|
|
147
|
+
return 0;
|
|
148
|
+
// Round up to minimum off-ramp amount if below provider minimum
|
|
149
|
+
return Math.max(deficit, minimumOfframpCents);
|
|
150
|
+
}
|
|
151
|
+
// ── Pure Logic: Reconciliation ──────────────────────
|
|
152
|
+
function reconcileTransfer(transferAmountCents, bankTransactionCents, platformSpendCents, thresholdBps, // basis points tolerance (e.g., 50 = 0.5%)
|
|
153
|
+
platform, date, previousHash) {
|
|
154
|
+
const invoiceCents = transferAmountCents; // what was transferred
|
|
155
|
+
const varianceCents = Math.abs(invoiceCents - bankTransactionCents);
|
|
156
|
+
// Determine result based on variance threshold
|
|
157
|
+
let result;
|
|
158
|
+
if (varianceCents === 0) {
|
|
159
|
+
result = 'MATCHED';
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
const varianceBps = invoiceCents > 0
|
|
163
|
+
? (varianceCents / invoiceCents) * 10_000
|
|
164
|
+
: 0;
|
|
165
|
+
result = varianceBps <= thresholdBps ? 'WITHIN_THRESHOLD' : 'MISMATCH';
|
|
166
|
+
}
|
|
167
|
+
const id = crypto.randomUUID();
|
|
168
|
+
const now = new Date().toISOString();
|
|
169
|
+
const record = {
|
|
170
|
+
id,
|
|
171
|
+
platform,
|
|
172
|
+
date,
|
|
173
|
+
spendCents: platformSpendCents,
|
|
174
|
+
bankSettledCents: bankTransactionCents,
|
|
175
|
+
invoiceCents,
|
|
176
|
+
varianceCents,
|
|
177
|
+
result,
|
|
178
|
+
notes: result === 'MISMATCH'
|
|
179
|
+
? `Variance ${varianceCents} cents exceeds ${thresholdBps}bps threshold`
|
|
180
|
+
: result === 'WITHIN_THRESHOLD'
|
|
181
|
+
? `Variance ${varianceCents} cents within ${thresholdBps}bps threshold`
|
|
182
|
+
: 'Exact match',
|
|
183
|
+
createdAt: now,
|
|
184
|
+
previousHash,
|
|
185
|
+
};
|
|
186
|
+
const hash = computeReconciliationHash(record, previousHash);
|
|
187
|
+
return { ...record, hash };
|
|
188
|
+
}
|
|
189
|
+
function prioritizeObligations(obligations) {
|
|
190
|
+
return [...obligations].sort((a, b) => {
|
|
191
|
+
// Overdue items first
|
|
192
|
+
if (a.overdue && !b.overdue)
|
|
193
|
+
return -1;
|
|
194
|
+
if (!a.overdue && b.overdue)
|
|
195
|
+
return 1;
|
|
196
|
+
// Then by due date (earliest first)
|
|
197
|
+
return new Date(a.dueDate).getTime() - new Date(b.dueDate).getTime();
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
export { toCents, toDollars, computePlanHash, computeTransferHash, computeReconciliationHash, createFundingPlan, approvePlan, transitionPlan, calculateRunway, shouldTriggerOfframp, calculateRequiredOfframp, reconcileTransfer, prioritizeObligations, };
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern: OAuth Token Lifecycle
|
|
3
|
+
*
|
|
4
|
+
* Key principles:
|
|
5
|
+
* - Refresh at 80% of TTL (not at expiry — prevents race conditions)
|
|
6
|
+
* - Multi-grant-type support (authorization_code, refresh_token)
|
|
7
|
+
* - Vault integration — tokens encrypted at rest in financial vault
|
|
8
|
+
* - Failure escalation: retry 3x → pause platform → alert → requires_reauth
|
|
9
|
+
* - Token stored as encrypted blob in vault, keyed by platform name
|
|
10
|
+
* - Session token (daemon) rotates every 24 hours (§9.19.15)
|
|
11
|
+
*
|
|
12
|
+
* Agents: Breeze (platform relations), Dockson (vault)
|
|
13
|
+
*
|
|
14
|
+
* PRD Reference: §9.5 (token refresh strategy), §9.18 (vault session), §9.19.15
|
|
15
|
+
*/
|
|
16
|
+
type AdPlatform = 'meta' | 'google' | 'tiktok' | 'linkedin' | 'twitter' | 'reddit';
|
|
17
|
+
interface OAuthTokenSet {
|
|
18
|
+
platform: AdPlatform;
|
|
19
|
+
accessToken: string;
|
|
20
|
+
refreshToken: string;
|
|
21
|
+
expiresAt: string;
|
|
22
|
+
tokenType: string;
|
|
23
|
+
scopes: string[];
|
|
24
|
+
grantedAt: string;
|
|
25
|
+
lastRefreshedAt: string;
|
|
26
|
+
}
|
|
27
|
+
type TokenHealth = 'healthy' | 'expiring_soon' | 'expired' | 'refresh_failed' | 'requires_reauth' | 'revoked';
|
|
28
|
+
interface TokenStatus {
|
|
29
|
+
platform: AdPlatform;
|
|
30
|
+
health: TokenHealth;
|
|
31
|
+
expiresAt: string;
|
|
32
|
+
lastRefresh: string;
|
|
33
|
+
consecutiveFailures: number;
|
|
34
|
+
error?: string;
|
|
35
|
+
}
|
|
36
|
+
interface PlatformTokenConfig {
|
|
37
|
+
platform: AdPlatform;
|
|
38
|
+
accessTokenTtlHours: number;
|
|
39
|
+
refreshTokenTtlDays: number;
|
|
40
|
+
refreshEndpoint: string;
|
|
41
|
+
revokeEndpoint?: string;
|
|
42
|
+
}
|
|
43
|
+
declare const PLATFORM_CONFIGS: PlatformTokenConfig[];
|
|
44
|
+
declare const REFRESH_AT_TTL_PERCENT = 0.8;
|
|
45
|
+
declare const MAX_CONSECUTIVE_FAILURES = 3;
|
|
46
|
+
/**
|
|
47
|
+
* Check if a token needs refresh.
|
|
48
|
+
* Returns true if the token is past 80% of its TTL.
|
|
49
|
+
*/
|
|
50
|
+
declare function needsRefresh(token: OAuthTokenSet): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Determine the health status of a token.
|
|
53
|
+
*/
|
|
54
|
+
declare function getTokenHealth(token: OAuthTokenSet, failures: number): TokenHealth;
|
|
55
|
+
interface RefreshResult {
|
|
56
|
+
success: boolean;
|
|
57
|
+
newTokens?: OAuthTokenSet;
|
|
58
|
+
error?: string;
|
|
59
|
+
requiresReauth?: boolean;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Handle a refresh failure. Implements the escalation:
|
|
63
|
+
* 1st failure: retry after 30s
|
|
64
|
+
* 2nd failure: retry after 60s
|
|
65
|
+
* 3rd failure: pause campaigns on this platform, set requires_reauth, alert
|
|
66
|
+
*
|
|
67
|
+
* The `invalid_grant` error means the refresh token itself is expired/revoked.
|
|
68
|
+
* This does NOT count toward the 3-failure pause trigger (§9.18) —
|
|
69
|
+
* it goes straight to requires_reauth.
|
|
70
|
+
*/
|
|
71
|
+
declare function handleRefreshFailure(platform: AdPlatform, error: string, consecutiveFailures: number): {
|
|
72
|
+
action: 'retry' | 'pause_and_alert' | 'reauth';
|
|
73
|
+
retryAfterMs?: number;
|
|
74
|
+
};
|
|
75
|
+
declare function tokenVaultKey(platform: AdPlatform): string;
|
|
76
|
+
/**
|
|
77
|
+
* Serialize tokens for vault storage.
|
|
78
|
+
* The vault stores strings — tokens are JSON-serialized.
|
|
79
|
+
*/
|
|
80
|
+
declare function serializeTokens(tokens: OAuthTokenSet): string;
|
|
81
|
+
declare function deserializeTokens(data: string): OAuthTokenSet;
|
|
82
|
+
declare const SESSION_TOKEN_TTL_MS: number;
|
|
83
|
+
declare const SESSION_TOKEN_GRACE_MS: number;
|
|
84
|
+
interface SessionTokenState {
|
|
85
|
+
current: string;
|
|
86
|
+
previous?: string;
|
|
87
|
+
rotatedAt: number;
|
|
88
|
+
previousExpiresAt?: number;
|
|
89
|
+
}
|
|
90
|
+
declare function shouldRotateSessionToken(state: SessionTokenState): boolean;
|
|
91
|
+
declare function rotateSessionToken(state: SessionTokenState, newToken: string): SessionTokenState;
|
|
92
|
+
declare function validateSessionToken(provided: string, state: SessionTokenState): boolean;
|
|
93
|
+
export type { OAuthTokenSet, TokenHealth, TokenStatus, PlatformTokenConfig, RefreshResult, SessionTokenState };
|
|
94
|
+
export { PLATFORM_CONFIGS, REFRESH_AT_TTL_PERCENT, MAX_CONSECUTIVE_FAILURES, needsRefresh, getTokenHealth, handleRefreshFailure, tokenVaultKey, serializeTokens, deserializeTokens, SESSION_TOKEN_TTL_MS, SESSION_TOKEN_GRACE_MS, shouldRotateSessionToken, rotateSessionToken, validateSessionToken, };
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern: OAuth Token Lifecycle
|
|
3
|
+
*
|
|
4
|
+
* Key principles:
|
|
5
|
+
* - Refresh at 80% of TTL (not at expiry — prevents race conditions)
|
|
6
|
+
* - Multi-grant-type support (authorization_code, refresh_token)
|
|
7
|
+
* - Vault integration — tokens encrypted at rest in financial vault
|
|
8
|
+
* - Failure escalation: retry 3x → pause platform → alert → requires_reauth
|
|
9
|
+
* - Token stored as encrypted blob in vault, keyed by platform name
|
|
10
|
+
* - Session token (daemon) rotates every 24 hours (§9.19.15)
|
|
11
|
+
*
|
|
12
|
+
* Agents: Breeze (platform relations), Dockson (vault)
|
|
13
|
+
*
|
|
14
|
+
* PRD Reference: §9.5 (token refresh strategy), §9.18 (vault session), §9.19.15
|
|
15
|
+
*/
|
|
16
|
+
const PLATFORM_CONFIGS = [
|
|
17
|
+
{ platform: 'meta', accessTokenTtlHours: 1440, refreshTokenTtlDays: 0, refreshEndpoint: 'https://graph.facebook.com/v19.0/oauth/access_token' },
|
|
18
|
+
{ platform: 'google', accessTokenTtlHours: 1, refreshTokenTtlDays: 0, refreshEndpoint: 'https://oauth2.googleapis.com/token' },
|
|
19
|
+
{ platform: 'tiktok', accessTokenTtlHours: 24, refreshTokenTtlDays: 365, refreshEndpoint: 'https://business-api.tiktok.com/open_api/v1.3/oauth2/access_token/' },
|
|
20
|
+
{ platform: 'linkedin', accessTokenTtlHours: 1440, refreshTokenTtlDays: 365, refreshEndpoint: 'https://www.linkedin.com/oauth/v2/accessToken' },
|
|
21
|
+
{ platform: 'twitter', accessTokenTtlHours: 0, refreshTokenTtlDays: 0, refreshEndpoint: '' }, // OAuth 1.0a — tokens don't expire
|
|
22
|
+
{ platform: 'reddit', accessTokenTtlHours: 1, refreshTokenTtlDays: 0, refreshEndpoint: 'https://www.reddit.com/api/v1/access_token' },
|
|
23
|
+
];
|
|
24
|
+
// ── Refresh Logic ─────────────────────────────────────
|
|
25
|
+
const REFRESH_AT_TTL_PERCENT = 0.80; // Refresh at 80% of TTL
|
|
26
|
+
const MAX_CONSECUTIVE_FAILURES = 3;
|
|
27
|
+
/**
|
|
28
|
+
* Check if a token needs refresh.
|
|
29
|
+
* Returns true if the token is past 80% of its TTL.
|
|
30
|
+
*/
|
|
31
|
+
function needsRefresh(token) {
|
|
32
|
+
const config = PLATFORM_CONFIGS.find(c => c.platform === token.platform);
|
|
33
|
+
if (!config || config.accessTokenTtlHours === 0)
|
|
34
|
+
return false; // Never expires (Twitter OAuth 1.0a)
|
|
35
|
+
const expiresAt = new Date(token.expiresAt).getTime();
|
|
36
|
+
const lastRefresh = new Date(token.lastRefreshedAt).getTime();
|
|
37
|
+
const ttlMs = config.accessTokenTtlHours * 60 * 60 * 1000;
|
|
38
|
+
const refreshAt = lastRefresh + (ttlMs * REFRESH_AT_TTL_PERCENT);
|
|
39
|
+
return Date.now() >= refreshAt;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Determine the health status of a token.
|
|
43
|
+
*/
|
|
44
|
+
function getTokenHealth(token, failures) {
|
|
45
|
+
if (failures >= MAX_CONSECUTIVE_FAILURES)
|
|
46
|
+
return 'requires_reauth';
|
|
47
|
+
const now = Date.now();
|
|
48
|
+
const expiresAt = new Date(token.expiresAt).getTime();
|
|
49
|
+
if (expiresAt < now)
|
|
50
|
+
return 'expired';
|
|
51
|
+
const config = PLATFORM_CONFIGS.find(c => c.platform === token.platform);
|
|
52
|
+
if (!config || config.accessTokenTtlHours === 0)
|
|
53
|
+
return 'healthy'; // Never expires
|
|
54
|
+
const ttlMs = config.accessTokenTtlHours * 60 * 60 * 1000;
|
|
55
|
+
const warningAt = expiresAt - (ttlMs * 0.2); // Warn at 80% consumed
|
|
56
|
+
if (now >= warningAt)
|
|
57
|
+
return 'expiring_soon';
|
|
58
|
+
if (failures > 0)
|
|
59
|
+
return 'refresh_failed';
|
|
60
|
+
return 'healthy';
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Handle a refresh failure. Implements the escalation:
|
|
64
|
+
* 1st failure: retry after 30s
|
|
65
|
+
* 2nd failure: retry after 60s
|
|
66
|
+
* 3rd failure: pause campaigns on this platform, set requires_reauth, alert
|
|
67
|
+
*
|
|
68
|
+
* The `invalid_grant` error means the refresh token itself is expired/revoked.
|
|
69
|
+
* This does NOT count toward the 3-failure pause trigger (§9.18) —
|
|
70
|
+
* it goes straight to requires_reauth.
|
|
71
|
+
*/
|
|
72
|
+
function handleRefreshFailure(platform, error, consecutiveFailures) {
|
|
73
|
+
// invalid_grant = refresh token revoked/expired — immediate reauth
|
|
74
|
+
if (error.includes('invalid_grant') || error.includes('revoked')) {
|
|
75
|
+
return { action: 'reauth' };
|
|
76
|
+
}
|
|
77
|
+
const newCount = consecutiveFailures + 1;
|
|
78
|
+
if (newCount >= MAX_CONSECUTIVE_FAILURES) {
|
|
79
|
+
return { action: 'pause_and_alert' };
|
|
80
|
+
}
|
|
81
|
+
// Exponential backoff: 30s, 60s
|
|
82
|
+
const retryAfterMs = 30000 * Math.pow(2, consecutiveFailures);
|
|
83
|
+
return { action: 'retry', retryAfterMs };
|
|
84
|
+
}
|
|
85
|
+
// ── Vault Integration ─────────────────────────────────
|
|
86
|
+
// Tokens are stored in the financial vault, keyed by platform name.
|
|
87
|
+
// The daemon reads them at startup and holds them in memory.
|
|
88
|
+
// On refresh, the daemon writes the updated token back to the vault.
|
|
89
|
+
const TOKEN_VAULT_KEY_PREFIX = 'growth/tokens/';
|
|
90
|
+
function tokenVaultKey(platform) {
|
|
91
|
+
return TOKEN_VAULT_KEY_PREFIX + platform;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Serialize tokens for vault storage.
|
|
95
|
+
* The vault stores strings — tokens are JSON-serialized.
|
|
96
|
+
*/
|
|
97
|
+
function serializeTokens(tokens) {
|
|
98
|
+
return JSON.stringify(tokens);
|
|
99
|
+
}
|
|
100
|
+
function deserializeTokens(data) {
|
|
101
|
+
return JSON.parse(data);
|
|
102
|
+
}
|
|
103
|
+
// ── Session Token Rotation (§9.19.15) ─────────────────
|
|
104
|
+
// The daemon session token (heartbeat.token) rotates every 24 hours.
|
|
105
|
+
// During rotation, accept both old and new tokens for 30-second grace period.
|
|
106
|
+
const SESSION_TOKEN_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
107
|
+
const SESSION_TOKEN_GRACE_MS = 30 * 1000; // 30 seconds
|
|
108
|
+
function shouldRotateSessionToken(state) {
|
|
109
|
+
return Date.now() - state.rotatedAt >= SESSION_TOKEN_TTL_MS;
|
|
110
|
+
}
|
|
111
|
+
function rotateSessionToken(state, newToken) {
|
|
112
|
+
return {
|
|
113
|
+
current: newToken,
|
|
114
|
+
previous: state.current,
|
|
115
|
+
rotatedAt: Date.now(),
|
|
116
|
+
previousExpiresAt: Date.now() + SESSION_TOKEN_GRACE_MS,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function validateSessionToken(provided, state) {
|
|
120
|
+
const { timingSafeEqual } = require('node:crypto');
|
|
121
|
+
// Check current token
|
|
122
|
+
if (provided.length === state.current.length) {
|
|
123
|
+
const a = Buffer.from(provided);
|
|
124
|
+
const b = Buffer.from(state.current);
|
|
125
|
+
if (timingSafeEqual(a, b))
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
// Check previous token during grace period
|
|
129
|
+
if (state.previous && state.previousExpiresAt && Date.now() < state.previousExpiresAt) {
|
|
130
|
+
if (provided.length === state.previous.length) {
|
|
131
|
+
const a = Buffer.from(provided);
|
|
132
|
+
const b = Buffer.from(state.previous);
|
|
133
|
+
if (timingSafeEqual(a, b))
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
export { PLATFORM_CONFIGS, REFRESH_AT_TTL_PERCENT, MAX_CONSECUTIVE_FAILURES, needsRefresh, getTokenHealth, handleRefreshFailure, tokenVaultKey, serializeTokens, deserializeTokens, SESSION_TOKEN_TTL_MS, SESSION_TOKEN_GRACE_MS, shouldRotateSessionToken, rotateSessionToken, validateSessionToken, };
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern: Outbound Rate Limiter
|
|
3
|
+
*
|
|
4
|
+
* Key principles:
|
|
5
|
+
* - Token bucket per-platform with configurable capacity and refill rate
|
|
6
|
+
* - Safety margin reservation: hold back 10% of capacity for health checks
|
|
7
|
+
* - Queue overflow handling: reject with RATE_LIMITED error, don't block forever
|
|
8
|
+
* - Per-platform configuration (Meta: 200/hr, Google: 15000/day, etc.)
|
|
9
|
+
* - Exponential backoff on 429 responses from platforms
|
|
10
|
+
* - Daily quota tracking for platforms with daily limits (Google, LinkedIn)
|
|
11
|
+
*
|
|
12
|
+
* Agents: Breeze (platform relations), Wax (paid ads)
|
|
13
|
+
*
|
|
14
|
+
* PRD Reference: §9.5 (rate limit strategy), §9.17 (outbound-rate-limiter.ts)
|
|
15
|
+
*/
|
|
16
|
+
type AdPlatform = 'meta' | 'google' | 'tiktok' | 'linkedin' | 'twitter' | 'reddit';
|
|
17
|
+
interface PlatformRateConfig {
|
|
18
|
+
platform: AdPlatform;
|
|
19
|
+
capacity: number;
|
|
20
|
+
refillRate: number;
|
|
21
|
+
dailyQuota?: number;
|
|
22
|
+
burstAllowed: boolean;
|
|
23
|
+
safetyMargin: number;
|
|
24
|
+
backoffBase: number;
|
|
25
|
+
maxRetries: number;
|
|
26
|
+
}
|
|
27
|
+
declare const PLATFORM_RATES: Record<AdPlatform, PlatformRateConfig>;
|
|
28
|
+
declare class OutboundRateLimiter {
|
|
29
|
+
private tokens;
|
|
30
|
+
private lastRefill;
|
|
31
|
+
private dailyUsed;
|
|
32
|
+
private dailyResetAt;
|
|
33
|
+
private readonly config;
|
|
34
|
+
private readonly effectiveCapacity;
|
|
35
|
+
constructor(platform: AdPlatform);
|
|
36
|
+
/**
|
|
37
|
+
* Acquire a token. Resolves when a token is available.
|
|
38
|
+
* Throws if the daily quota is exhausted.
|
|
39
|
+
*/
|
|
40
|
+
acquire(): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Execute a request with automatic retry on 429 responses.
|
|
43
|
+
* Uses exponential backoff with platform-specific base delay.
|
|
44
|
+
*/
|
|
45
|
+
executeWithRetry<T>(fn: () => Promise<T>): Promise<T>;
|
|
46
|
+
/** Get current rate limiter status for monitoring */
|
|
47
|
+
getStatus(): {
|
|
48
|
+
tokens: number;
|
|
49
|
+
capacity: number;
|
|
50
|
+
dailyUsed: number;
|
|
51
|
+
dailyQuota: number | undefined;
|
|
52
|
+
};
|
|
53
|
+
/** Reserve N tokens for a batch operation. Returns false if insufficient. */
|
|
54
|
+
canReserve(count: number): boolean;
|
|
55
|
+
private refill;
|
|
56
|
+
private checkDailyReset;
|
|
57
|
+
private nextMidnightUTC;
|
|
58
|
+
}
|
|
59
|
+
declare class RateLimitError extends Error {
|
|
60
|
+
readonly platform: string;
|
|
61
|
+
readonly retryAfterMs: number;
|
|
62
|
+
constructor(platform: string, message: string, retryAfterMs: number);
|
|
63
|
+
}
|
|
64
|
+
declare function isRateLimitResponse(err: unknown): boolean;
|
|
65
|
+
declare function getLimiter(platform: AdPlatform): OutboundRateLimiter;
|
|
66
|
+
export { OutboundRateLimiter, RateLimitError, PLATFORM_RATES, getLimiter, isRateLimitResponse };
|
|
67
|
+
export type { PlatformRateConfig };
|