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,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern: Ad Billing Adapter (Split Interface)
|
|
3
|
+
*
|
|
4
|
+
* Key principles:
|
|
5
|
+
* - Billing is SEPARATE from campaign CRUD. This adapter handles how ad platforms
|
|
6
|
+
* get paid (invoices, direct debits, settlements), not how campaigns are managed.
|
|
7
|
+
* Campaign operations live in ad-platform-adapter.ts.
|
|
8
|
+
* - Three capability states determine what Treasury can automate:
|
|
9
|
+
* FULLY_FUNDABLE — Treasury manages settlement lifecycle end-to-end
|
|
10
|
+
* MONITORED_ONLY — spend and billing are observed, but funding is not automated
|
|
11
|
+
* UNSUPPORTED — billing configuration blocks any automation
|
|
12
|
+
* - Split interface: AdBillingSetup (interactive) + AdBillingAdapter (runtime)
|
|
13
|
+
* - Single-writer: only Heartbeat daemon calls the runtime adapter
|
|
14
|
+
* - All amounts in branded integer cents (Cents type from financial-transaction.ts)
|
|
15
|
+
*
|
|
16
|
+
* Agents: Dockson (treasury), Wax (paid ads), Heartbeat daemon
|
|
17
|
+
*
|
|
18
|
+
* PRD Reference: §10.2, §11.1B, §12.3
|
|
19
|
+
*
|
|
20
|
+
* Google Ads Billing API reference:
|
|
21
|
+
* Billing setup: managed via Google Ads UI — no API for enabling monthly invoicing.
|
|
22
|
+
* Read-only API paths (Ads API v16+):
|
|
23
|
+
* BillingSetup resource → billingSetup.status, paymentsAccount, paymentsProfile
|
|
24
|
+
* Invoice resource → GET /customers/{id}/invoices (monthly invoicing accounts only)
|
|
25
|
+
* Fields: invoice.id, invoice.type, invoice.due_date, invoice.total_amount_micros
|
|
26
|
+
* Note: amounts in micros (1/1,000,000 of currency unit). Divide by 10,000 for cents.
|
|
27
|
+
* payments_account_id identifies the payments profile linked to billing.
|
|
28
|
+
* monthly_invoicing must be enabled by Google — not programmatically toggleable.
|
|
29
|
+
*
|
|
30
|
+
* Meta Ads Billing reference:
|
|
31
|
+
* No first-party invoice API. Billing is managed via:
|
|
32
|
+
* GET /act_{id}?fields=funding_source,funding_source_details → funding method classification
|
|
33
|
+
* funding_source_details.type: 1=credit_card, 2=debit_card, 4=direct_debit,
|
|
34
|
+
* 5=paypal, 8=extended_credit, 11=invoice
|
|
35
|
+
* Direct debit: Meta pulls from linked bank. No settlement instruction needed.
|
|
36
|
+
* Extended credit / invoicing: available to qualifying business accounts.
|
|
37
|
+
* For direct debit accounts, Treasury maintains a buffer; for invoiced accounts,
|
|
38
|
+
* Treasury tracks due dates and settlement instructions.
|
|
39
|
+
*/
|
|
40
|
+
function toCents(dollars) {
|
|
41
|
+
return Math.round(dollars * 100);
|
|
42
|
+
}
|
|
43
|
+
// ── Reference Implementation: Google Billing ─────────
|
|
44
|
+
// Production implementation would live in wizard/lib/financial/billing/google-billing.ts
|
|
45
|
+
class GoogleBillingAdapter {
|
|
46
|
+
adsApiUrl = 'https://googleads.googleapis.com/v16';
|
|
47
|
+
profiles = new Map();
|
|
48
|
+
// ── Setup (interactive) ──────────
|
|
49
|
+
async verifyBillingCapability(_platform, externalAccountId, tokens) {
|
|
50
|
+
const mode = await this.detectBillingMode('google', externalAccountId, tokens);
|
|
51
|
+
if (mode === 'monthly_invoicing')
|
|
52
|
+
return 'FULLY_FUNDABLE';
|
|
53
|
+
if (mode === 'manual_bank_transfer')
|
|
54
|
+
return 'MONITORED_ONLY';
|
|
55
|
+
if (mode === 'unknown' || mode === 'card_only')
|
|
56
|
+
return 'UNSUPPORTED';
|
|
57
|
+
return 'MONITORED_ONLY';
|
|
58
|
+
}
|
|
59
|
+
async readBillingConfiguration(_platform, externalAccountId, tokens) {
|
|
60
|
+
// Google Ads API: query billing_setup resource
|
|
61
|
+
// SELECT billing_setup.id, billing_setup.status, billing_setup.payments_account,
|
|
62
|
+
// billing_setup.payments_profile
|
|
63
|
+
// FROM billing_setup
|
|
64
|
+
const billingSetup = await this.queryBillingSetup(externalAccountId, tokens);
|
|
65
|
+
const mode = this.classifyGoogleBillingMode(billingSetup);
|
|
66
|
+
return {
|
|
67
|
+
billingMode: mode,
|
|
68
|
+
accountIds: {
|
|
69
|
+
externalAccountId,
|
|
70
|
+
billingSetupId: billingSetup.id,
|
|
71
|
+
paymentProfileId: billingSetup.paymentsProfile,
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
async detectBillingMode(_platform, externalAccountId, tokens) {
|
|
76
|
+
const billingSetup = await this.queryBillingSetup(externalAccountId, tokens);
|
|
77
|
+
return this.classifyGoogleBillingMode(billingSetup);
|
|
78
|
+
}
|
|
79
|
+
// ── Runtime (daemon) ──────────
|
|
80
|
+
async getCapabilityState(_platform) {
|
|
81
|
+
// Re-verify from cached profile — full re-check happens on scheduled interval
|
|
82
|
+
const profile = this.profiles.get('google');
|
|
83
|
+
return profile?.capabilityState ?? 'UNSUPPORTED';
|
|
84
|
+
}
|
|
85
|
+
async readInvoices(_platform, dateRange) {
|
|
86
|
+
// Google Ads API: query invoice resource
|
|
87
|
+
// SELECT invoice.id, invoice.type, invoice.due_date,
|
|
88
|
+
// invoice.service_date_range, invoice.total_amount_micros,
|
|
89
|
+
// invoice.payments_account_id
|
|
90
|
+
// FROM invoice
|
|
91
|
+
// WHERE invoice.issue_date >= '{dateRange.start}'
|
|
92
|
+
// AND invoice.issue_date <= '{dateRange.end}'
|
|
93
|
+
//
|
|
94
|
+
// Amounts are in micros: divide by 10,000 to get cents
|
|
95
|
+
// e.g., 1,500,000,000 micros = $1,500.00 = 150,000 cents
|
|
96
|
+
throw new Error('HTTP implementation — use node:https with Google Ads REST API');
|
|
97
|
+
}
|
|
98
|
+
async readExpectedDebits(_platform, _dateRange) {
|
|
99
|
+
// Google does not use direct debit in the monthly invoicing flow.
|
|
100
|
+
// This method returns empty for Google — debits are a Meta concept.
|
|
101
|
+
return [];
|
|
102
|
+
}
|
|
103
|
+
async generateSettlementInstructions(invoice) {
|
|
104
|
+
// Google monthly invoicing: payment via wire/ACH to Google's bank account
|
|
105
|
+
// Payment instructions are on the invoice itself.
|
|
106
|
+
// Reference number must be included for matching.
|
|
107
|
+
return {
|
|
108
|
+
invoiceId: invoice.id,
|
|
109
|
+
platform: 'google',
|
|
110
|
+
payeeName: 'Google Ads',
|
|
111
|
+
paymentMethod: 'wire',
|
|
112
|
+
amountCents: invoice.amountCents,
|
|
113
|
+
currency: 'USD',
|
|
114
|
+
dueDate: invoice.dueDate,
|
|
115
|
+
bankReference: invoice.paymentReference,
|
|
116
|
+
notes: `Google monthly invoice ${invoice.id} — wire payment with reference ${invoice.paymentReference ?? 'see invoice'}`,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
async confirmSettlement(invoiceId, bankTransactionId) {
|
|
120
|
+
// Match bank transaction amount against invoice amount.
|
|
121
|
+
// In production: read from bank adapter + invoice store.
|
|
122
|
+
// Variance threshold: configurable, default 0 cents for exact match.
|
|
123
|
+
throw new Error('Implementation requires invoice store + bank adapter integration');
|
|
124
|
+
}
|
|
125
|
+
async normalizeFundingState() {
|
|
126
|
+
const profile = this.profiles.get('google');
|
|
127
|
+
if (!profile)
|
|
128
|
+
return [];
|
|
129
|
+
const invoices = await this.readInvoices('google', {
|
|
130
|
+
start: new Date(Date.now() - 90 * 24 * 60 * 60 * 1000).toISOString(),
|
|
131
|
+
end: new Date().toISOString(),
|
|
132
|
+
});
|
|
133
|
+
const pending = invoices.filter(i => i.status === 'pending' || i.status === 'overdue');
|
|
134
|
+
const outstandingCents = pending.reduce((sum, i) => (sum + i.amountCents), 0);
|
|
135
|
+
const overdue = pending.some(i => i.status === 'overdue');
|
|
136
|
+
return [{
|
|
137
|
+
platform: 'google',
|
|
138
|
+
capabilityState: profile.capabilityState,
|
|
139
|
+
billingMode: profile.billingMode,
|
|
140
|
+
outstandingCents,
|
|
141
|
+
nextPaymentDueDate: profile.nextDueDate,
|
|
142
|
+
daysUntilNextPayment: profile.nextDueDate
|
|
143
|
+
? Math.ceil((new Date(profile.nextDueDate).getTime() - Date.now()) / (24 * 60 * 60 * 1000))
|
|
144
|
+
: undefined,
|
|
145
|
+
fundingHealthy: !overdue && profile.status === 'active',
|
|
146
|
+
warnings: overdue ? ['Overdue Google Ads invoice — settlement required'] : [],
|
|
147
|
+
}];
|
|
148
|
+
}
|
|
149
|
+
// ── Private helpers ──────────
|
|
150
|
+
async queryBillingSetup(_externalAccountId, _tokens) {
|
|
151
|
+
// POST {adsApiUrl}/customers/{id}/googleAds:searchStream
|
|
152
|
+
// Body: { query: "SELECT billing_setup.id, ..." }
|
|
153
|
+
// Headers: Authorization: Bearer {accessToken}, developer-token: {devToken}
|
|
154
|
+
throw new Error('HTTP implementation — use node:https with Google Ads REST API');
|
|
155
|
+
}
|
|
156
|
+
classifyGoogleBillingMode(billingSetup) {
|
|
157
|
+
const status = billingSetup.status;
|
|
158
|
+
if (status === 'APPROVED')
|
|
159
|
+
return 'monthly_invoicing';
|
|
160
|
+
if (status === 'PENDING')
|
|
161
|
+
return 'unknown';
|
|
162
|
+
if (status === 'CANCELLED')
|
|
163
|
+
return 'unknown';
|
|
164
|
+
return 'unknown';
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// ── Reference Implementation: Meta Billing ───────────
|
|
168
|
+
// Production implementation would live in wizard/lib/financial/billing/meta-billing.ts
|
|
169
|
+
class MetaBillingAdapter {
|
|
170
|
+
baseUrl = 'https://graph.facebook.com/v19.0';
|
|
171
|
+
profiles = new Map();
|
|
172
|
+
// ── Setup (interactive) ──────────
|
|
173
|
+
async verifyBillingCapability(_platform, externalAccountId, tokens) {
|
|
174
|
+
const mode = await this.detectBillingMode('meta', externalAccountId, tokens);
|
|
175
|
+
if (mode === 'direct_debit' || mode === 'extended_credit')
|
|
176
|
+
return 'FULLY_FUNDABLE';
|
|
177
|
+
if (mode === 'card_only')
|
|
178
|
+
return 'UNSUPPORTED';
|
|
179
|
+
return 'MONITORED_ONLY';
|
|
180
|
+
}
|
|
181
|
+
async readBillingConfiguration(_platform, externalAccountId, tokens) {
|
|
182
|
+
const mode = await this.detectBillingMode('meta', externalAccountId, tokens);
|
|
183
|
+
return {
|
|
184
|
+
billingMode: mode,
|
|
185
|
+
accountIds: {
|
|
186
|
+
externalAccountId,
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
async detectBillingMode(_platform, externalAccountId, tokens) {
|
|
191
|
+
// GET /act_{id}?fields=funding_source_details&access_token={token}
|
|
192
|
+
// Response: { funding_source_details: { id, type, display_string } }
|
|
193
|
+
// type values: 1=credit_card, 2=debit_card, 4=direct_debit,
|
|
194
|
+
// 5=paypal, 8=extended_credit, 11=invoice
|
|
195
|
+
const res = await this.apiCall('GET', `/act_${externalAccountId}`, tokens.accessToken, { fields: 'funding_source_details' });
|
|
196
|
+
const details = res.funding_source_details;
|
|
197
|
+
const fundingType = details?.type;
|
|
198
|
+
switch (fundingType) {
|
|
199
|
+
case 4: return 'direct_debit';
|
|
200
|
+
case 8: return 'extended_credit';
|
|
201
|
+
case 11: return 'monthly_invoicing';
|
|
202
|
+
case 1:
|
|
203
|
+
case 2: return 'card_only';
|
|
204
|
+
default: return 'unknown';
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// ── Runtime (daemon) ──────────
|
|
208
|
+
async getCapabilityState(_platform) {
|
|
209
|
+
const profile = this.profiles.get('meta');
|
|
210
|
+
return profile?.capabilityState ?? 'UNSUPPORTED';
|
|
211
|
+
}
|
|
212
|
+
async readInvoices(_platform, _dateRange) {
|
|
213
|
+
// Meta does not expose a first-party invoice API for most account types.
|
|
214
|
+
// For extended_credit accounts: invoices may be available via Business Manager.
|
|
215
|
+
// In V1: return empty — Meta billing is tracked via expected debits.
|
|
216
|
+
return [];
|
|
217
|
+
}
|
|
218
|
+
async readExpectedDebits(_platform, dateRange) {
|
|
219
|
+
// For direct debit accounts: estimate upcoming debits from recent spend.
|
|
220
|
+
// Meta typically debits when spend threshold is reached or on billing date.
|
|
221
|
+
// This is a forecast based on spend velocity, not a platform API call.
|
|
222
|
+
// The actual debit is detected when it appears in the bank account.
|
|
223
|
+
throw new Error('Implementation requires spend history + bank transaction detection');
|
|
224
|
+
}
|
|
225
|
+
async generateSettlementInstructions(invoice) {
|
|
226
|
+
// Meta direct debit: no manual settlement needed — Meta pulls from bank.
|
|
227
|
+
// Meta extended credit / invoicing: payment instructions on invoice.
|
|
228
|
+
return {
|
|
229
|
+
invoiceId: invoice.id,
|
|
230
|
+
platform: 'meta',
|
|
231
|
+
payeeName: 'Meta Platforms Inc',
|
|
232
|
+
paymentMethod: 'direct_debit',
|
|
233
|
+
amountCents: invoice.amountCents,
|
|
234
|
+
currency: 'USD',
|
|
235
|
+
dueDate: invoice.dueDate,
|
|
236
|
+
notes: 'Meta direct debit — ensure sufficient bank balance before debit date',
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
async confirmSettlement(invoiceId, bankTransactionId) {
|
|
240
|
+
throw new Error('Implementation requires invoice store + bank adapter integration');
|
|
241
|
+
}
|
|
242
|
+
async normalizeFundingState() {
|
|
243
|
+
const profile = this.profiles.get('meta');
|
|
244
|
+
if (!profile)
|
|
245
|
+
return [];
|
|
246
|
+
return [{
|
|
247
|
+
platform: 'meta',
|
|
248
|
+
capabilityState: profile.capabilityState,
|
|
249
|
+
billingMode: profile.billingMode,
|
|
250
|
+
outstandingCents: 0, // Meta direct debit is pulled, not pushed
|
|
251
|
+
nextPaymentDueDate: profile.nextDueDate,
|
|
252
|
+
daysUntilNextPayment: profile.nextDueDate
|
|
253
|
+
? Math.ceil((new Date(profile.nextDueDate).getTime() - Date.now()) / (24 * 60 * 60 * 1000))
|
|
254
|
+
: undefined,
|
|
255
|
+
fundingHealthy: profile.status === 'active',
|
|
256
|
+
warnings: profile.status === 'degraded'
|
|
257
|
+
? ['Meta billing degraded — check funding source status']
|
|
258
|
+
: [],
|
|
259
|
+
}];
|
|
260
|
+
}
|
|
261
|
+
// ── Private helpers ──────────
|
|
262
|
+
async apiCall(method, path, accessToken, params) {
|
|
263
|
+
// Implementation: raw HTTPS (no SDK — zero dependency principle)
|
|
264
|
+
// Headers: Authorization: Bearer {accessToken}
|
|
265
|
+
// Sanitize response strings per §9.19.16 before returning
|
|
266
|
+
throw new Error('HTTP implementation — use node:https, no SDK dependencies');
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
export { toCents, GoogleBillingAdapter, MetaBillingAdapter };
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern: Ad Platform Adapter (Split Interface)
|
|
3
|
+
*
|
|
4
|
+
* Key principles:
|
|
5
|
+
* - Separate interactive setup (browser OAuth) from runtime operations (daemon)
|
|
6
|
+
* - AdPlatformSetup runs in CLI/Danger Room (interactive, user-present)
|
|
7
|
+
* - AdPlatformAdapter runs in heartbeat daemon (non-interactive, autonomous)
|
|
8
|
+
* - All amounts in integer cents (Cents branded type) — never float
|
|
9
|
+
* - Rate limiting per-platform with token bucket
|
|
10
|
+
* - Errors normalized to common PlatformError format
|
|
11
|
+
* - Idempotency keys on all write operations (WAL pattern per ADR-3)
|
|
12
|
+
*
|
|
13
|
+
* Agents: Breeze (platform relations), Wax (paid ads), Dockson (treasury)
|
|
14
|
+
*
|
|
15
|
+
* PRD Reference: §9.5, §9.19.10, §9.20.4
|
|
16
|
+
*
|
|
17
|
+
* Authorization Guard (§9.20.4):
|
|
18
|
+
* Daemon Tier 1 jobs receive ReadOnlyAdapter (pause, read operations only).
|
|
19
|
+
* Authenticated external commands receive full AdPlatformAdapter.
|
|
20
|
+
* See financial-transaction.ts for the Cents branded type.
|
|
21
|
+
*/
|
|
22
|
+
type Cents = number & {
|
|
23
|
+
readonly __brand: 'Cents';
|
|
24
|
+
};
|
|
25
|
+
type Percentage = number & {
|
|
26
|
+
readonly __brand: 'Percentage';
|
|
27
|
+
};
|
|
28
|
+
type Ratio = number & {
|
|
29
|
+
readonly __brand: 'Ratio';
|
|
30
|
+
};
|
|
31
|
+
declare function toCents(dollars: number): Cents;
|
|
32
|
+
declare function toDollars(cents: Cents): number;
|
|
33
|
+
type AdPlatform = 'meta' | 'google' | 'tiktok' | 'linkedin' | 'twitter' | 'reddit' | 'snap';
|
|
34
|
+
interface OAuthTokens {
|
|
35
|
+
accessToken: string;
|
|
36
|
+
refreshToken: string;
|
|
37
|
+
expiresAt: string;
|
|
38
|
+
platform: AdPlatform;
|
|
39
|
+
scopes: string[];
|
|
40
|
+
}
|
|
41
|
+
interface ConnectionStatus {
|
|
42
|
+
connected: boolean;
|
|
43
|
+
accountId?: string;
|
|
44
|
+
accountName?: string;
|
|
45
|
+
currency?: string;
|
|
46
|
+
error?: string;
|
|
47
|
+
}
|
|
48
|
+
interface PlatformError {
|
|
49
|
+
platform: AdPlatform;
|
|
50
|
+
code: 'RATE_LIMITED' | 'AUTH_EXPIRED' | 'BUDGET_EXCEEDED' | 'CREATIVE_REJECTED' | 'UNKNOWN';
|
|
51
|
+
originalCode: number;
|
|
52
|
+
message: string;
|
|
53
|
+
retryable: boolean;
|
|
54
|
+
retryAfter?: number;
|
|
55
|
+
}
|
|
56
|
+
interface CampaignConfig {
|
|
57
|
+
name: string;
|
|
58
|
+
platform: AdPlatform;
|
|
59
|
+
objective: 'awareness' | 'traffic' | 'conversions';
|
|
60
|
+
dailyBudget: Cents;
|
|
61
|
+
targeting: {
|
|
62
|
+
audiences: string[];
|
|
63
|
+
locations: string[];
|
|
64
|
+
ageRange?: [number, number];
|
|
65
|
+
interests?: string[];
|
|
66
|
+
};
|
|
67
|
+
creative: {
|
|
68
|
+
headlines: string[];
|
|
69
|
+
descriptions: string[];
|
|
70
|
+
callToAction: string;
|
|
71
|
+
landingUrl: string;
|
|
72
|
+
imageUrls?: string[];
|
|
73
|
+
};
|
|
74
|
+
testGroupId?: string;
|
|
75
|
+
testVariant?: string;
|
|
76
|
+
schedule?: {
|
|
77
|
+
startDate?: string;
|
|
78
|
+
endDate?: string;
|
|
79
|
+
};
|
|
80
|
+
idempotencyKey: string;
|
|
81
|
+
complianceStatus: 'passed' | 'pending';
|
|
82
|
+
}
|
|
83
|
+
interface CampaignResult {
|
|
84
|
+
externalId: string;
|
|
85
|
+
platform: AdPlatform;
|
|
86
|
+
status: 'created' | 'pending_review';
|
|
87
|
+
dashboardUrl: string;
|
|
88
|
+
}
|
|
89
|
+
interface CampaignUpdate {
|
|
90
|
+
name?: string;
|
|
91
|
+
dailyBudget?: Cents;
|
|
92
|
+
targeting?: Partial<CampaignConfig['targeting']>;
|
|
93
|
+
schedule?: CampaignConfig['schedule'];
|
|
94
|
+
}
|
|
95
|
+
interface CreativeConfig {
|
|
96
|
+
headlines?: string[];
|
|
97
|
+
descriptions?: string[];
|
|
98
|
+
callToAction?: string;
|
|
99
|
+
landingUrl?: string;
|
|
100
|
+
imageUrls?: string[];
|
|
101
|
+
}
|
|
102
|
+
interface SpendReport {
|
|
103
|
+
platform: AdPlatform;
|
|
104
|
+
dateRange: {
|
|
105
|
+
start: string;
|
|
106
|
+
end: string;
|
|
107
|
+
};
|
|
108
|
+
totalSpend: Cents;
|
|
109
|
+
campaigns: Array<{
|
|
110
|
+
externalId: string;
|
|
111
|
+
spend: Cents;
|
|
112
|
+
impressions: number;
|
|
113
|
+
clicks: number;
|
|
114
|
+
conversions: number;
|
|
115
|
+
}>;
|
|
116
|
+
}
|
|
117
|
+
interface PerformanceMetrics {
|
|
118
|
+
campaignId: string;
|
|
119
|
+
impressions: number;
|
|
120
|
+
clicks: number;
|
|
121
|
+
conversions: number;
|
|
122
|
+
spend: Cents;
|
|
123
|
+
ctr: Percentage;
|
|
124
|
+
cpc: Cents;
|
|
125
|
+
roas: Ratio;
|
|
126
|
+
}
|
|
127
|
+
interface InsightData {
|
|
128
|
+
campaignId: string;
|
|
129
|
+
metrics: Record<string, number>;
|
|
130
|
+
recommendations?: string[];
|
|
131
|
+
}
|
|
132
|
+
interface AdPlatformSetup {
|
|
133
|
+
/** Interactive OAuth flow — opens browser for authorization */
|
|
134
|
+
authenticate(): Promise<OAuthTokens>;
|
|
135
|
+
/** Verify the connection works and return account info */
|
|
136
|
+
verifyConnection(tokens: OAuthTokens): Promise<ConnectionStatus>;
|
|
137
|
+
/** Detect account currency for ADR-6 enforcement */
|
|
138
|
+
detectCurrency(tokens: OAuthTokens): Promise<string>;
|
|
139
|
+
}
|
|
140
|
+
interface AdPlatformAdapter {
|
|
141
|
+
refreshToken(token: OAuthTokens): Promise<OAuthTokens>;
|
|
142
|
+
createCampaign(config: CampaignConfig): Promise<CampaignResult>;
|
|
143
|
+
updateCampaign(id: string, changes: CampaignUpdate): Promise<void>;
|
|
144
|
+
pauseCampaign(id: string): Promise<void>;
|
|
145
|
+
resumeCampaign(id: string): Promise<void>;
|
|
146
|
+
deleteCampaign(id: string): Promise<void>;
|
|
147
|
+
updateBudget(id: string, dailyBudget: Cents): Promise<void>;
|
|
148
|
+
updateCreative(id: string, creative: CreativeConfig): Promise<void>;
|
|
149
|
+
getSpend(dateRange: {
|
|
150
|
+
start: string;
|
|
151
|
+
end: string;
|
|
152
|
+
}): Promise<SpendReport>;
|
|
153
|
+
getPerformance(campaignId: string): Promise<PerformanceMetrics>;
|
|
154
|
+
getInsights(campaignId: string, metrics: string[]): Promise<InsightData>;
|
|
155
|
+
handleWebhook?(payload: unknown): Promise<{
|
|
156
|
+
processed: boolean;
|
|
157
|
+
}>;
|
|
158
|
+
verifyWebhookSignature?(payload: Buffer, signature: string): boolean;
|
|
159
|
+
}
|
|
160
|
+
type ReadOnlyAdapter = Pick<AdPlatformAdapter, 'pauseCampaign' | // Protective — stopping spend is always safe
|
|
161
|
+
'getSpend' | 'getPerformance' | 'getInsights' | 'refreshToken'>;
|
|
162
|
+
declare class MetaAdapter implements AdPlatformSetup, AdPlatformAdapter {
|
|
163
|
+
private adAccountId;
|
|
164
|
+
private readonly baseUrl;
|
|
165
|
+
private rateLimiter;
|
|
166
|
+
constructor(adAccountId: string);
|
|
167
|
+
authenticate(): Promise<OAuthTokens>;
|
|
168
|
+
verifyConnection(tokens: OAuthTokens): Promise<ConnectionStatus>;
|
|
169
|
+
detectCurrency(tokens: OAuthTokens): Promise<string>;
|
|
170
|
+
refreshToken(token: OAuthTokens): Promise<OAuthTokens>;
|
|
171
|
+
createCampaign(config: CampaignConfig): Promise<CampaignResult>;
|
|
172
|
+
pauseCampaign(id: string): Promise<void>;
|
|
173
|
+
resumeCampaign(id: string): Promise<void>;
|
|
174
|
+
deleteCampaign(id: string): Promise<void>;
|
|
175
|
+
updateCampaign(id: string, changes: CampaignUpdate): Promise<void>;
|
|
176
|
+
updateBudget(id: string, dailyBudget: Cents): Promise<void>;
|
|
177
|
+
updateCreative(id: string, creative: CreativeConfig): Promise<void>;
|
|
178
|
+
getSpend(dateRange: {
|
|
179
|
+
start: string;
|
|
180
|
+
end: string;
|
|
181
|
+
}): Promise<SpendReport>;
|
|
182
|
+
getPerformance(campaignId: string): Promise<PerformanceMetrics>;
|
|
183
|
+
getInsights(campaignId: string, metrics: string[]): Promise<InsightData>;
|
|
184
|
+
private mapObjective;
|
|
185
|
+
private apiCall;
|
|
186
|
+
}
|
|
187
|
+
declare class TokenBucketLimiter {
|
|
188
|
+
private tokens;
|
|
189
|
+
private lastRefill;
|
|
190
|
+
private readonly capacity;
|
|
191
|
+
private readonly refillRate;
|
|
192
|
+
constructor(opts: {
|
|
193
|
+
capacity: number;
|
|
194
|
+
refillRate: number;
|
|
195
|
+
});
|
|
196
|
+
acquire(): Promise<void>;
|
|
197
|
+
private refill;
|
|
198
|
+
}
|
|
199
|
+
export type { AdPlatformSetup, AdPlatformAdapter, ReadOnlyAdapter, CampaignConfig, CampaignResult, CampaignUpdate, CreativeConfig, SpendReport, PerformanceMetrics, InsightData, OAuthTokens, ConnectionStatus, PlatformError, Cents, Percentage, Ratio, AdPlatform, };
|
|
200
|
+
export { toCents, toDollars, MetaAdapter, TokenBucketLimiter };
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern: Ad Platform Adapter (Split Interface)
|
|
3
|
+
*
|
|
4
|
+
* Key principles:
|
|
5
|
+
* - Separate interactive setup (browser OAuth) from runtime operations (daemon)
|
|
6
|
+
* - AdPlatformSetup runs in CLI/Danger Room (interactive, user-present)
|
|
7
|
+
* - AdPlatformAdapter runs in heartbeat daemon (non-interactive, autonomous)
|
|
8
|
+
* - All amounts in integer cents (Cents branded type) — never float
|
|
9
|
+
* - Rate limiting per-platform with token bucket
|
|
10
|
+
* - Errors normalized to common PlatformError format
|
|
11
|
+
* - Idempotency keys on all write operations (WAL pattern per ADR-3)
|
|
12
|
+
*
|
|
13
|
+
* Agents: Breeze (platform relations), Wax (paid ads), Dockson (treasury)
|
|
14
|
+
*
|
|
15
|
+
* PRD Reference: §9.5, §9.19.10, §9.20.4
|
|
16
|
+
*
|
|
17
|
+
* Authorization Guard (§9.20.4):
|
|
18
|
+
* Daemon Tier 1 jobs receive ReadOnlyAdapter (pause, read operations only).
|
|
19
|
+
* Authenticated external commands receive full AdPlatformAdapter.
|
|
20
|
+
* See financial-transaction.ts for the Cents branded type.
|
|
21
|
+
*/
|
|
22
|
+
function toCents(dollars) {
|
|
23
|
+
return Math.round(dollars * 100);
|
|
24
|
+
}
|
|
25
|
+
function toDollars(cents) {
|
|
26
|
+
return cents / 100;
|
|
27
|
+
}
|
|
28
|
+
// Authenticated external commands receive the full AdPlatformAdapter
|
|
29
|
+
//
|
|
30
|
+
// ── Adapter Caching Rule (field report #258) ────────────
|
|
31
|
+
// Stateful adapters (in-memory campaign store, e.g. sandbox) MUST be cached
|
|
32
|
+
// per platform — one instance per platform key. Creating a new instance per
|
|
33
|
+
// call loses state between operations (campaigns created become invisible).
|
|
34
|
+
// Stateless adapters (HTTP clients calling external APIs) can be created per
|
|
35
|
+
// call since they hold no local state. Use a module-level Map<string, Adapter>
|
|
36
|
+
// for caching when the adapter's constructor initializes mutable collections.
|
|
37
|
+
// ── Reference Implementation: Meta Marketing API ──────
|
|
38
|
+
class MetaAdapter {
|
|
39
|
+
adAccountId;
|
|
40
|
+
baseUrl = 'https://graph.facebook.com/v19.0';
|
|
41
|
+
rateLimiter;
|
|
42
|
+
constructor(adAccountId) {
|
|
43
|
+
this.adAccountId = adAccountId;
|
|
44
|
+
// Meta: 200 calls/hr/ad account (sliding window)
|
|
45
|
+
this.rateLimiter = new TokenBucketLimiter({ capacity: 200, refillRate: 200 / 3600 });
|
|
46
|
+
}
|
|
47
|
+
// ── Setup (interactive) ──────────
|
|
48
|
+
async authenticate() {
|
|
49
|
+
// 1. Open browser to Facebook Login
|
|
50
|
+
// 2. User authorizes → callback with short-lived token
|
|
51
|
+
// 3. Exchange for long-lived token (60 days)
|
|
52
|
+
// 4. Return OAuthTokens
|
|
53
|
+
throw new Error('Interactive OAuth — implement per platform');
|
|
54
|
+
}
|
|
55
|
+
async verifyConnection(tokens) {
|
|
56
|
+
const res = await this.apiCall('GET', `/act_${this.adAccountId}`, tokens, {
|
|
57
|
+
fields: 'name,currency,account_status'
|
|
58
|
+
});
|
|
59
|
+
return {
|
|
60
|
+
connected: true,
|
|
61
|
+
accountId: this.adAccountId,
|
|
62
|
+
accountName: res.name,
|
|
63
|
+
currency: res.currency,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
async detectCurrency(tokens) {
|
|
67
|
+
const status = await this.verifyConnection(tokens);
|
|
68
|
+
return status.currency ?? 'USD';
|
|
69
|
+
}
|
|
70
|
+
// ── Runtime (daemon) ─────────────
|
|
71
|
+
async refreshToken(token) {
|
|
72
|
+
// Meta long-lived tokens: exchange at 80% of 60-day TTL
|
|
73
|
+
const res = await this.apiCall('GET', '/oauth/access_token', token, {
|
|
74
|
+
grant_type: 'fb_exchange_token',
|
|
75
|
+
fb_exchange_token: token.accessToken,
|
|
76
|
+
});
|
|
77
|
+
return { ...token, accessToken: res.access_token, expiresAt: res.expires_at };
|
|
78
|
+
}
|
|
79
|
+
async createCampaign(config) {
|
|
80
|
+
await this.rateLimiter.acquire();
|
|
81
|
+
const res = await this.apiCall('POST', `/act_${this.adAccountId}/campaigns`, undefined, {
|
|
82
|
+
name: config.name,
|
|
83
|
+
objective: this.mapObjective(config.objective),
|
|
84
|
+
status: 'PAUSED', // Create paused, activate after ad set + ad creation
|
|
85
|
+
special_ad_categories: [],
|
|
86
|
+
});
|
|
87
|
+
return {
|
|
88
|
+
externalId: res.id,
|
|
89
|
+
platform: 'meta',
|
|
90
|
+
status: 'created',
|
|
91
|
+
dashboardUrl: `https://www.facebook.com/adsmanager/manage/campaigns?act=${this.adAccountId}&campaign_ids=${res.id}`,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
async pauseCampaign(id) {
|
|
95
|
+
await this.rateLimiter.acquire();
|
|
96
|
+
await this.apiCall('POST', `/${id}`, undefined, { status: 'PAUSED' });
|
|
97
|
+
}
|
|
98
|
+
async resumeCampaign(id) {
|
|
99
|
+
await this.rateLimiter.acquire();
|
|
100
|
+
await this.apiCall('POST', `/${id}`, undefined, { status: 'ACTIVE' });
|
|
101
|
+
}
|
|
102
|
+
async deleteCampaign(id) {
|
|
103
|
+
await this.rateLimiter.acquire();
|
|
104
|
+
await this.apiCall('DELETE', `/${id}`, undefined, {});
|
|
105
|
+
}
|
|
106
|
+
async updateCampaign(id, changes) {
|
|
107
|
+
await this.rateLimiter.acquire();
|
|
108
|
+
const params = {};
|
|
109
|
+
if (changes.name)
|
|
110
|
+
params.name = changes.name;
|
|
111
|
+
// Budget changes go through ad set, not campaign on Meta
|
|
112
|
+
await this.apiCall('POST', `/${id}`, undefined, params);
|
|
113
|
+
}
|
|
114
|
+
async updateBudget(id, dailyBudget) {
|
|
115
|
+
await this.rateLimiter.acquire();
|
|
116
|
+
// Meta budgets are in the account's currency smallest unit (cents for USD)
|
|
117
|
+
await this.apiCall('POST', `/${id}`, undefined, { daily_budget: dailyBudget });
|
|
118
|
+
}
|
|
119
|
+
async updateCreative(id, creative) {
|
|
120
|
+
await this.rateLimiter.acquire();
|
|
121
|
+
// Creative updates go through the ad object, not campaign
|
|
122
|
+
throw new Error('Creative update requires ad-level API call — implement per ad structure');
|
|
123
|
+
}
|
|
124
|
+
async getSpend(dateRange) {
|
|
125
|
+
await this.rateLimiter.acquire();
|
|
126
|
+
const res = await this.apiCall('GET', `/act_${this.adAccountId}/insights`, undefined, {
|
|
127
|
+
fields: 'campaign_id,spend,impressions,clicks,conversions',
|
|
128
|
+
time_range: JSON.stringify({ since: dateRange.start, until: dateRange.end }),
|
|
129
|
+
level: 'campaign',
|
|
130
|
+
});
|
|
131
|
+
const resData = res.data;
|
|
132
|
+
return {
|
|
133
|
+
platform: 'meta',
|
|
134
|
+
dateRange,
|
|
135
|
+
totalSpend: toCents(resData.reduce((sum, r) => sum + parseFloat(r.spend), 0)),
|
|
136
|
+
campaigns: resData.map((r) => ({
|
|
137
|
+
externalId: r.campaign_id,
|
|
138
|
+
spend: toCents(parseFloat(r.spend)),
|
|
139
|
+
impressions: parseInt(r.impressions),
|
|
140
|
+
clicks: parseInt(r.clicks),
|
|
141
|
+
conversions: parseInt(r.conversions || '0'),
|
|
142
|
+
})),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
async getPerformance(campaignId) {
|
|
146
|
+
await this.rateLimiter.acquire();
|
|
147
|
+
const res = await this.apiCall('GET', `/${campaignId}/insights`, undefined, {
|
|
148
|
+
fields: 'impressions,clicks,conversions,spend,ctr,cpc',
|
|
149
|
+
});
|
|
150
|
+
const d = res.data[0];
|
|
151
|
+
const spend = toCents(parseFloat(d.spend));
|
|
152
|
+
const conversions = parseInt(d.conversions || '0');
|
|
153
|
+
const revenue = 0; // Revenue comes from Stripe, not the ad platform
|
|
154
|
+
return {
|
|
155
|
+
campaignId,
|
|
156
|
+
impressions: parseInt(d.impressions),
|
|
157
|
+
clicks: parseInt(d.clicks),
|
|
158
|
+
conversions,
|
|
159
|
+
spend,
|
|
160
|
+
ctr: parseFloat(d.ctr),
|
|
161
|
+
cpc: toCents(parseFloat(d.cpc)),
|
|
162
|
+
roas: (revenue > 0 ? toDollars(revenue) / toDollars(spend) : 0),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
async getInsights(campaignId, metrics) {
|
|
166
|
+
await this.rateLimiter.acquire();
|
|
167
|
+
const res = await this.apiCall('GET', `/${campaignId}/insights`, undefined, {
|
|
168
|
+
fields: metrics.join(','),
|
|
169
|
+
});
|
|
170
|
+
return { campaignId, metrics: res.data[0] ?? {} };
|
|
171
|
+
}
|
|
172
|
+
// ── Helpers ──────────────────────
|
|
173
|
+
mapObjective(obj) {
|
|
174
|
+
const map = { awareness: 'OUTCOME_AWARENESS', traffic: 'OUTCOME_TRAFFIC', conversions: 'OUTCOME_SALES' };
|
|
175
|
+
return map[obj];
|
|
176
|
+
}
|
|
177
|
+
async apiCall(method, path, tokens, params) {
|
|
178
|
+
// Sanitize platform response data per §9.19.16
|
|
179
|
+
// All string fields: strip HTML tags, escape <>&"', truncate to 500 chars
|
|
180
|
+
// Use idempotency key for POST/DELETE per ADR-3
|
|
181
|
+
throw new Error('HTTP implementation — use node:https, no SDK dependencies');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// ── Token Bucket Rate Limiter ─────────────────────────
|
|
185
|
+
class TokenBucketLimiter {
|
|
186
|
+
tokens;
|
|
187
|
+
lastRefill;
|
|
188
|
+
capacity;
|
|
189
|
+
refillRate; // tokens per second
|
|
190
|
+
constructor(opts) {
|
|
191
|
+
this.capacity = opts.capacity;
|
|
192
|
+
this.refillRate = opts.refillRate;
|
|
193
|
+
this.tokens = opts.capacity;
|
|
194
|
+
this.lastRefill = Date.now();
|
|
195
|
+
}
|
|
196
|
+
async acquire() {
|
|
197
|
+
this.refill();
|
|
198
|
+
if (this.tokens < 1) {
|
|
199
|
+
const waitMs = (1 / this.refillRate) * 1000;
|
|
200
|
+
await new Promise(resolve => setTimeout(resolve, waitMs));
|
|
201
|
+
this.refill();
|
|
202
|
+
}
|
|
203
|
+
this.tokens -= 1;
|
|
204
|
+
}
|
|
205
|
+
refill() {
|
|
206
|
+
const now = Date.now();
|
|
207
|
+
const elapsed = (now - this.lastRefill) / 1000;
|
|
208
|
+
this.tokens = Math.min(this.capacity, this.tokens + elapsed * this.refillRate);
|
|
209
|
+
this.lastRefill = now;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
export { toCents, toDollars, MetaAdapter, TokenBucketLimiter };
|