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,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TikTok Ads Billing Adapter — real implementation via node:https (zero new dependencies).
|
|
3
|
+
*
|
|
4
|
+
* Implements AdBillingSetup (interactive CLI) + AdBillingAdapter (daemon runtime)
|
|
5
|
+
* for TikTok Marketing API v1.3.
|
|
6
|
+
*
|
|
7
|
+
* TikTok Marketing API v1.3:
|
|
8
|
+
* Base URL: https://business-api.tiktok.com/open_api/v1.3
|
|
9
|
+
* Auth: Access-Token header
|
|
10
|
+
*
|
|
11
|
+
* Billing model: TikTok uses prepaid (top-up wallet) or postpaid (auto-charge)
|
|
12
|
+
* billing. Neither supports programmatic settlement — all billing is managed
|
|
13
|
+
* through TikTok Ads Manager. Capability is always MONITORED_ONLY for
|
|
14
|
+
* prepaid/postpaid with auto-top-up, and UNSUPPORTED for unknown types.
|
|
15
|
+
*
|
|
16
|
+
* PRD Reference: $10.2, $11.1B, $12.3
|
|
17
|
+
* No Stubs Doctrine: every method makes a real API call or returns documented empty.
|
|
18
|
+
*/
|
|
19
|
+
import { request as httpsRequest } from 'node:https';
|
|
20
|
+
import { randomUUID } from 'node:crypto';
|
|
21
|
+
import { toCents } from './base.js';
|
|
22
|
+
const TIKTOK_HOST = 'business-api.tiktok.com';
|
|
23
|
+
// -- HTTP helpers -------------------------------------------------
|
|
24
|
+
async function tiktokGet(path, accessToken, params) {
|
|
25
|
+
const query = params
|
|
26
|
+
? '?' + new URLSearchParams(params).toString()
|
|
27
|
+
: '';
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
const req = httpsRequest({
|
|
30
|
+
hostname: TIKTOK_HOST,
|
|
31
|
+
path: `/open_api/v1.3${path}${query}`,
|
|
32
|
+
method: 'GET',
|
|
33
|
+
headers: {
|
|
34
|
+
'Access-Token': accessToken,
|
|
35
|
+
'Accept': 'application/json',
|
|
36
|
+
},
|
|
37
|
+
timeout: 15000,
|
|
38
|
+
}, (res) => {
|
|
39
|
+
let data = '';
|
|
40
|
+
res.on('data', (chunk) => { data += chunk.toString(); });
|
|
41
|
+
res.on('end', () => resolve({ status: res.statusCode ?? 500, body: data }));
|
|
42
|
+
});
|
|
43
|
+
req.on('error', reject);
|
|
44
|
+
req.on('timeout', () => { req.destroy(); reject(new Error('TikTok API timeout')); });
|
|
45
|
+
req.end();
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
async function tiktokPost(path, accessToken, body) {
|
|
49
|
+
const payload = JSON.stringify(body);
|
|
50
|
+
return new Promise((resolve, reject) => {
|
|
51
|
+
const req = httpsRequest({
|
|
52
|
+
hostname: TIKTOK_HOST,
|
|
53
|
+
path: `/open_api/v1.3${path}`,
|
|
54
|
+
method: 'POST',
|
|
55
|
+
headers: {
|
|
56
|
+
'Access-Token': accessToken,
|
|
57
|
+
'Content-Type': 'application/json',
|
|
58
|
+
'Accept': 'application/json',
|
|
59
|
+
},
|
|
60
|
+
timeout: 15000,
|
|
61
|
+
}, (res) => {
|
|
62
|
+
let data = '';
|
|
63
|
+
res.on('data', (chunk) => { data += chunk.toString(); });
|
|
64
|
+
res.on('end', () => resolve({ status: res.statusCode ?? 500, body: data }));
|
|
65
|
+
});
|
|
66
|
+
req.on('error', reject);
|
|
67
|
+
req.on('timeout', () => { req.destroy(); reject(new Error('TikTok API timeout')); });
|
|
68
|
+
req.write(payload);
|
|
69
|
+
req.end();
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/** Parse JSON response body; on failure return a descriptive error object. */
|
|
73
|
+
function safeParseJson(body) {
|
|
74
|
+
try {
|
|
75
|
+
return JSON.parse(body);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return { error: { message: 'Non-JSON response from TikTok API' } };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// -- Setup Implementation -----------------------------------------
|
|
82
|
+
export class TikTokBillingSetup {
|
|
83
|
+
async verifyBillingCapability(_platform, externalAccountId, tokens) {
|
|
84
|
+
const advertiserInfo = await this.fetchAdvertiserInfo(externalAccountId, tokens.accessToken);
|
|
85
|
+
const billingType = detectTikTokBillingType(advertiserInfo);
|
|
86
|
+
// TikTok doesn't support programmatic settlement — prepaid and postpaid are monitor-only
|
|
87
|
+
if (billingType === 'prepaid' || billingType === 'postpaid')
|
|
88
|
+
return 'MONITORED_ONLY';
|
|
89
|
+
return 'UNSUPPORTED';
|
|
90
|
+
}
|
|
91
|
+
async readBillingConfiguration(_platform, externalAccountId, tokens) {
|
|
92
|
+
const advertiserInfo = await this.fetchAdvertiserInfo(externalAccountId, tokens.accessToken);
|
|
93
|
+
const billingType = detectTikTokBillingType(advertiserInfo);
|
|
94
|
+
return {
|
|
95
|
+
billingMode: billingType === 'prepaid' ? 'manual_bank_transfer' : billingType === 'postpaid' ? 'direct_debit' : 'unknown',
|
|
96
|
+
accountIds: {
|
|
97
|
+
externalAccountId,
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
async detectBillingMode(_platform, externalAccountId, tokens) {
|
|
102
|
+
const advertiserInfo = await this.fetchAdvertiserInfo(externalAccountId, tokens.accessToken);
|
|
103
|
+
const billingType = detectTikTokBillingType(advertiserInfo);
|
|
104
|
+
// Map TikTok billing types to BillingMode union
|
|
105
|
+
if (billingType === 'prepaid')
|
|
106
|
+
return 'manual_bank_transfer';
|
|
107
|
+
if (billingType === 'postpaid')
|
|
108
|
+
return 'direct_debit';
|
|
109
|
+
return 'unknown';
|
|
110
|
+
}
|
|
111
|
+
/** Fetch advertiser info to determine billing type. */
|
|
112
|
+
async fetchAdvertiserInfo(advertiserId, accessToken) {
|
|
113
|
+
const { status, body } = await tiktokGet('/advertiser/info/', accessToken, { advertiser_ids: JSON.stringify([advertiserId]) });
|
|
114
|
+
if (status !== 200) {
|
|
115
|
+
let errorMsg = `HTTP ${status}`;
|
|
116
|
+
try {
|
|
117
|
+
const e = JSON.parse(body);
|
|
118
|
+
errorMsg = e.message ?? errorMsg;
|
|
119
|
+
}
|
|
120
|
+
catch { /* non-JSON */ }
|
|
121
|
+
throw new Error(`TikTok fetchAdvertiserInfo failed: ${errorMsg}`);
|
|
122
|
+
}
|
|
123
|
+
const parsed = safeParseJson(body);
|
|
124
|
+
// TikTok wraps responses in { code: 0, data: { list: [...] } }
|
|
125
|
+
const data = parsed.data;
|
|
126
|
+
const list = data?.list ?? [];
|
|
127
|
+
if (list.length === 0) {
|
|
128
|
+
return { billing_type: 'unknown' };
|
|
129
|
+
}
|
|
130
|
+
return list[0];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// -- Runtime Adapter Implementation -------------------------------
|
|
134
|
+
export class TikTokBillingAdapter {
|
|
135
|
+
config;
|
|
136
|
+
profile;
|
|
137
|
+
constructor(config) {
|
|
138
|
+
this.config = config;
|
|
139
|
+
}
|
|
140
|
+
/** Set or update the billing profile (called by heartbeat after setup verification). */
|
|
141
|
+
setProfile(profile) {
|
|
142
|
+
this.profile = profile;
|
|
143
|
+
}
|
|
144
|
+
async getCapabilityState(_platform) {
|
|
145
|
+
return this.profile?.capabilityState ?? 'UNSUPPORTED';
|
|
146
|
+
}
|
|
147
|
+
async readInvoices(_platform, _dateRange) {
|
|
148
|
+
// TikTok does not expose a direct invoice API for programmatic access.
|
|
149
|
+
// Billing is managed entirely through TikTok Ads Manager.
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
152
|
+
async readExpectedDebits(_platform, dateRange) {
|
|
153
|
+
// Estimate upcoming debits from recent spend velocity via the reporting API.
|
|
154
|
+
// TikTok reporting endpoint returns spend data for the given date range.
|
|
155
|
+
const { status, body } = await tiktokPost('/report/integrated/get/', this.config.accessToken, {
|
|
156
|
+
advertiser_id: this.config.appId,
|
|
157
|
+
report_type: 'BASIC',
|
|
158
|
+
dimensions: ['stat_time_day'],
|
|
159
|
+
metrics: ['spend'],
|
|
160
|
+
data_level: 'AUCTION_ADVERTISER',
|
|
161
|
+
start_date: dateRange.start.slice(0, 10),
|
|
162
|
+
end_date: dateRange.end.slice(0, 10),
|
|
163
|
+
page_size: 365,
|
|
164
|
+
});
|
|
165
|
+
if (status !== 200) {
|
|
166
|
+
let errorMsg = `HTTP ${status}`;
|
|
167
|
+
try {
|
|
168
|
+
const e = JSON.parse(body);
|
|
169
|
+
errorMsg = e.message ?? errorMsg;
|
|
170
|
+
}
|
|
171
|
+
catch { /* non-JSON */ }
|
|
172
|
+
throw new Error(`TikTok readExpectedDebits failed: ${errorMsg}`);
|
|
173
|
+
}
|
|
174
|
+
const parsed = safeParseJson(body);
|
|
175
|
+
const data = parsed.data;
|
|
176
|
+
const list = data?.list ?? [];
|
|
177
|
+
if (list.length === 0)
|
|
178
|
+
return [];
|
|
179
|
+
// Calculate total spend in the date range
|
|
180
|
+
const totalSpendDollars = list.reduce((sum, row) => {
|
|
181
|
+
const metrics = row.metrics;
|
|
182
|
+
const spend = parseFloat(metrics?.spend ?? '0');
|
|
183
|
+
return sum + spend;
|
|
184
|
+
}, 0);
|
|
185
|
+
// Calculate days in range for daily rate
|
|
186
|
+
const rangeStart = new Date(dateRange.start);
|
|
187
|
+
const rangeEnd = new Date(dateRange.end);
|
|
188
|
+
const daySpan = Math.max(1, Math.ceil((rangeEnd.getTime() - rangeStart.getTime()) / (24 * 60 * 60 * 1000)));
|
|
189
|
+
const dailyRateDollars = totalSpendDollars / daySpan;
|
|
190
|
+
// Project: estimate next billing cycle as ~30 days of spend at current rate.
|
|
191
|
+
const estimatedMonthlyDollars = dailyRateDollars * 30;
|
|
192
|
+
if (estimatedMonthlyDollars < 1)
|
|
193
|
+
return []; // negligible spend
|
|
194
|
+
const nextDebitDate = new Date(rangeEnd.getTime() + 30 * 24 * 60 * 60 * 1000);
|
|
195
|
+
return [{
|
|
196
|
+
id: randomUUID(),
|
|
197
|
+
platform: 'tiktok',
|
|
198
|
+
externalAccountId: this.config.appId,
|
|
199
|
+
estimatedAmountCents: toCents(estimatedMonthlyDollars),
|
|
200
|
+
currency: 'USD',
|
|
201
|
+
expectedDate: nextDebitDate.toISOString().slice(0, 10),
|
|
202
|
+
status: 'expected',
|
|
203
|
+
}];
|
|
204
|
+
}
|
|
205
|
+
async generateSettlementInstructions(invoice) {
|
|
206
|
+
// TikTok billing is MONITORED_ONLY — no programmatic settlement.
|
|
207
|
+
// Return guidance directing users to TikTok Ads Manager.
|
|
208
|
+
return {
|
|
209
|
+
invoiceId: invoice.id,
|
|
210
|
+
platform: 'tiktok',
|
|
211
|
+
payeeName: 'TikTok / ByteDance',
|
|
212
|
+
paymentMethod: 'direct_debit',
|
|
213
|
+
amountCents: invoice.amountCents,
|
|
214
|
+
currency: 'USD',
|
|
215
|
+
dueDate: invoice.dueDate,
|
|
216
|
+
notes: 'TikTok billing is managed in TikTok Ads Manager — no programmatic settlement available',
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
async confirmSettlement(invoiceId, bankTransactionId) {
|
|
220
|
+
// Optimistic confirmation for monitoring purposes.
|
|
221
|
+
// TikTok handles billing internally; we track for reconciliation only.
|
|
222
|
+
void invoiceId;
|
|
223
|
+
void bankTransactionId; // recorded in audit log by caller
|
|
224
|
+
return {
|
|
225
|
+
confirmed: true,
|
|
226
|
+
reconciledAmountCents: 0,
|
|
227
|
+
varianceCents: 0,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
async normalizeFundingState() {
|
|
231
|
+
if (!this.profile)
|
|
232
|
+
return [];
|
|
233
|
+
const warnings = [];
|
|
234
|
+
if (this.profile.status === 'degraded') {
|
|
235
|
+
warnings.push('TikTok billing degraded — check advertiser account status');
|
|
236
|
+
}
|
|
237
|
+
return [{
|
|
238
|
+
platform: 'tiktok',
|
|
239
|
+
capabilityState: this.profile.capabilityState,
|
|
240
|
+
billingMode: this.profile.billingMode,
|
|
241
|
+
outstandingCents: 0, // TikTok manages billing internally
|
|
242
|
+
nextPaymentDueDate: this.profile.nextDueDate,
|
|
243
|
+
daysUntilNextPayment: this.profile.nextDueDate
|
|
244
|
+
? Math.ceil((new Date(this.profile.nextDueDate).getTime() - Date.now()) / (24 * 60 * 60 * 1000))
|
|
245
|
+
: undefined,
|
|
246
|
+
fundingHealthy: this.profile.status === 'active',
|
|
247
|
+
warnings,
|
|
248
|
+
}];
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
function detectTikTokBillingType(advertiserInfo) {
|
|
252
|
+
// TikTok returns billing_type or contacter_type to indicate billing model.
|
|
253
|
+
// Common values: "prepaid", "postpaid"
|
|
254
|
+
const billingType = (advertiserInfo.billing_type ?? '').toLowerCase();
|
|
255
|
+
if (billingType === 'prepaid')
|
|
256
|
+
return 'prepaid';
|
|
257
|
+
if (billingType === 'postpaid')
|
|
258
|
+
return 'postpaid';
|
|
259
|
+
return 'unknown';
|
|
260
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Campaign adapter types — re-exports from the pattern file.
|
|
3
|
+
* ARCH-R2-012: Production code should not import from docs/patterns/ directly.
|
|
4
|
+
*
|
|
5
|
+
* The AdPlatformAdapter interface defines campaign CRUD operations:
|
|
6
|
+
* create, pause, resume, delete, updateBudget, updateCreative,
|
|
7
|
+
* plus reporting (getSpend, getPerformance, getInsights).
|
|
8
|
+
*
|
|
9
|
+
* Split interface: AdPlatformSetup (interactive CLI) + AdPlatformAdapter (daemon runtime).
|
|
10
|
+
* ReadOnlyAdapter restricts daemon Tier 1 jobs to safe operations only.
|
|
11
|
+
*/
|
|
12
|
+
export type { AdPlatformSetup, AdPlatformAdapter, ReadOnlyAdapter, CampaignConfig, CampaignResult, CampaignUpdate, CreativeConfig, SpendReport, PerformanceMetrics, InsightData, OAuthTokens, ConnectionStatus, PlatformError, Cents, Percentage, Ratio, AdPlatform, } from '../../patterns/ad-platform-adapter.js';
|
|
13
|
+
export { toCents, toDollars, TokenBucketLimiter } from '../../patterns/ad-platform-adapter.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { toCents, toDollars, TokenBucketLimiter } from '../../patterns/ad-platform-adapter.js';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared patterns across Google, TikTok, and Meta campaign adapters.
|
|
3
|
+
*
|
|
4
|
+
* Extracts: JSON parsing, error factory, objective mapping, spend aggregation.
|
|
5
|
+
* PRD Reference: SS9.5, SS9.19.10, SS9.20.4
|
|
6
|
+
*/
|
|
7
|
+
import type { CampaignConfig, PlatformError, Cents, AdPlatform } from './base.js';
|
|
8
|
+
/** Platforms with full campaign adapter implementations. */
|
|
9
|
+
export type CampaignPlatform = 'google' | 'tiktok' | 'meta';
|
|
10
|
+
/** Safely parse JSON, returning an error-shaped object on failure. */
|
|
11
|
+
export declare function safeParseJson(body: string): Record<string, unknown>;
|
|
12
|
+
/** Create a typed PlatformError for a given ad platform. */
|
|
13
|
+
export declare function makePlatformError(platform: AdPlatform, code: PlatformError['code'], originalCode: number, message: string, retryable?: boolean, retryAfter?: number): PlatformError;
|
|
14
|
+
/** Map a CampaignConfig objective to a platform-specific objective string. */
|
|
15
|
+
export declare function mapObjective(platform: CampaignPlatform, objective: CampaignConfig['objective']): string;
|
|
16
|
+
/** Aggregate total spend from campaign rows. */
|
|
17
|
+
export declare function aggregateSpend(campaigns: Array<{
|
|
18
|
+
spend: Cents;
|
|
19
|
+
}>): Cents;
|
|
20
|
+
/** Throw if campaign compliance has not passed. */
|
|
21
|
+
export declare function requireCompliance(config: CampaignConfig, platform: AdPlatform): void;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared patterns across Google, TikTok, and Meta campaign adapters.
|
|
3
|
+
*
|
|
4
|
+
* Extracts: JSON parsing, error factory, objective mapping, spend aggregation.
|
|
5
|
+
* PRD Reference: SS9.5, SS9.19.10, SS9.20.4
|
|
6
|
+
*/
|
|
7
|
+
// ── JSON parsing ──────────────────────────────────────
|
|
8
|
+
/** Safely parse JSON, returning an error-shaped object on failure. */
|
|
9
|
+
export function safeParseJson(body) {
|
|
10
|
+
try {
|
|
11
|
+
return JSON.parse(body);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return { error: { message: 'Non-JSON response' } };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
// ── Error factory ─────────────────────────────────────
|
|
18
|
+
/** Create a typed PlatformError for a given ad platform. */
|
|
19
|
+
export function makePlatformError(platform, code, originalCode, message, retryable = false, retryAfter) {
|
|
20
|
+
return { platform, code, originalCode, message, retryable, retryAfter };
|
|
21
|
+
}
|
|
22
|
+
// ── Objective mapping ─────────────────────────────────
|
|
23
|
+
const GOOGLE_OBJECTIVES = {
|
|
24
|
+
awareness: 'TARGET_IMPRESSION_SHARE',
|
|
25
|
+
traffic: 'MAXIMIZE_CLICKS',
|
|
26
|
+
conversions: 'MAXIMIZE_CONVERSIONS',
|
|
27
|
+
};
|
|
28
|
+
const TIKTOK_OBJECTIVES = {
|
|
29
|
+
awareness: 'REACH',
|
|
30
|
+
traffic: 'TRAFFIC',
|
|
31
|
+
conversions: 'CONVERSIONS',
|
|
32
|
+
};
|
|
33
|
+
const META_OBJECTIVES = {
|
|
34
|
+
awareness: 'OUTCOME_AWARENESS',
|
|
35
|
+
traffic: 'OUTCOME_TRAFFIC',
|
|
36
|
+
conversions: 'OUTCOME_SALES',
|
|
37
|
+
};
|
|
38
|
+
/** Map a CampaignConfig objective to a platform-specific objective string. */
|
|
39
|
+
export function mapObjective(platform, objective) {
|
|
40
|
+
const maps = {
|
|
41
|
+
google: GOOGLE_OBJECTIVES,
|
|
42
|
+
tiktok: TIKTOK_OBJECTIVES,
|
|
43
|
+
meta: META_OBJECTIVES,
|
|
44
|
+
};
|
|
45
|
+
return maps[platform][objective];
|
|
46
|
+
}
|
|
47
|
+
// ── Spend aggregation ─────────────────────────────────
|
|
48
|
+
/** Aggregate total spend from campaign rows. */
|
|
49
|
+
export function aggregateSpend(campaigns) {
|
|
50
|
+
return campaigns.reduce((sum, c) => (sum + c.spend), 0);
|
|
51
|
+
}
|
|
52
|
+
// ── Compliance gate ───────────────────────────────────
|
|
53
|
+
/** Throw if campaign compliance has not passed. */
|
|
54
|
+
export function requireCompliance(config, platform) {
|
|
55
|
+
if (config.complianceStatus !== 'passed') {
|
|
56
|
+
throw makePlatformError(platform, 'UNKNOWN', 400, 'Campaign compliance not passed \u2014 cannot create');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Ads API layer — raw HTTP calls via node:https (zero new dependencies).
|
|
3
|
+
*
|
|
4
|
+
* Google Ads API v17:
|
|
5
|
+
* Base URL: https://googleads.googleapis.com/v17
|
|
6
|
+
* Auth: Authorization: Bearer {accessToken} + developer-token header
|
|
7
|
+
* Rate limit: 15,000 operations/day
|
|
8
|
+
*
|
|
9
|
+
* PRD Reference: SS9.5, SS9.19.10, SS9.20.4
|
|
10
|
+
*/
|
|
11
|
+
export declare const GOOGLE_ADS_HOST = "googleads.googleapis.com";
|
|
12
|
+
export interface GoogleCampaignConfig {
|
|
13
|
+
customerId: string;
|
|
14
|
+
accessToken: string;
|
|
15
|
+
developerToken: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function googleGet(path: string, accessToken: string, developerToken: string): Promise<{
|
|
18
|
+
status: number;
|
|
19
|
+
body: string;
|
|
20
|
+
}>;
|
|
21
|
+
export declare function googlePost(path: string, accessToken: string, developerToken: string, body: Record<string, unknown>): Promise<{
|
|
22
|
+
status: number;
|
|
23
|
+
body: string;
|
|
24
|
+
}>;
|
|
25
|
+
export declare function googleRefreshToken(refreshToken: string): Promise<{
|
|
26
|
+
status: number;
|
|
27
|
+
body: string;
|
|
28
|
+
}>;
|
|
29
|
+
/** Sanitize GAQL parameter — allow only alphanumeric, underscores, hyphens, dots. */
|
|
30
|
+
export declare function sanitizeGaqlParam(value: string): string;
|
|
31
|
+
/** Sanitize a date string for GAQL — must be YYYY-MM-DD. */
|
|
32
|
+
export declare function sanitizeDate(value: string): string;
|
|
33
|
+
/** Extract the first results array from a searchStream response. */
|
|
34
|
+
export declare function extractSearchStreamRows(body: string): Array<Record<string, unknown>>;
|
|
35
|
+
export declare function throwGoogleApiError(status: number, body: string): never;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Ads API layer — raw HTTP calls via node:https (zero new dependencies).
|
|
3
|
+
*
|
|
4
|
+
* Google Ads API v17:
|
|
5
|
+
* Base URL: https://googleads.googleapis.com/v17
|
|
6
|
+
* Auth: Authorization: Bearer {accessToken} + developer-token header
|
|
7
|
+
* Rate limit: 15,000 operations/day
|
|
8
|
+
*
|
|
9
|
+
* PRD Reference: SS9.5, SS9.19.10, SS9.20.4
|
|
10
|
+
*/
|
|
11
|
+
import { request as httpsRequest } from 'node:https';
|
|
12
|
+
import { safeParseJson, makePlatformError } from './campaign-common.js';
|
|
13
|
+
export const GOOGLE_ADS_HOST = 'googleads.googleapis.com';
|
|
14
|
+
// ── HTTP helpers ─────────────────────────────────────
|
|
15
|
+
export async function googleGet(path, accessToken, developerToken) {
|
|
16
|
+
return new Promise((resolve, reject) => {
|
|
17
|
+
const req = httpsRequest({
|
|
18
|
+
hostname: GOOGLE_ADS_HOST,
|
|
19
|
+
path: `/v17${path}`,
|
|
20
|
+
method: 'GET',
|
|
21
|
+
headers: {
|
|
22
|
+
'Authorization': `Bearer ${accessToken}`,
|
|
23
|
+
'developer-token': developerToken,
|
|
24
|
+
'Accept': 'application/json',
|
|
25
|
+
},
|
|
26
|
+
timeout: 15000,
|
|
27
|
+
}, (res) => {
|
|
28
|
+
let data = '';
|
|
29
|
+
res.on('data', (chunk) => { data += chunk.toString(); });
|
|
30
|
+
res.on('end', () => resolve({ status: res.statusCode ?? 500, body: data }));
|
|
31
|
+
});
|
|
32
|
+
req.on('error', reject);
|
|
33
|
+
req.on('timeout', () => { req.destroy(); reject(new Error('Google Ads API timeout')); });
|
|
34
|
+
req.end();
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
export async function googlePost(path, accessToken, developerToken, body) {
|
|
38
|
+
const payload = JSON.stringify(body);
|
|
39
|
+
return new Promise((resolve, reject) => {
|
|
40
|
+
const req = httpsRequest({
|
|
41
|
+
hostname: GOOGLE_ADS_HOST,
|
|
42
|
+
path: `/v17${path}`,
|
|
43
|
+
method: 'POST',
|
|
44
|
+
headers: {
|
|
45
|
+
'Authorization': `Bearer ${accessToken}`,
|
|
46
|
+
'developer-token': developerToken,
|
|
47
|
+
'Content-Type': 'application/json',
|
|
48
|
+
'Accept': 'application/json',
|
|
49
|
+
},
|
|
50
|
+
timeout: 15000,
|
|
51
|
+
}, (res) => {
|
|
52
|
+
let data = '';
|
|
53
|
+
res.on('data', (chunk) => { data += chunk.toString(); });
|
|
54
|
+
res.on('end', () => resolve({ status: res.statusCode ?? 500, body: data }));
|
|
55
|
+
});
|
|
56
|
+
req.on('error', reject);
|
|
57
|
+
req.on('timeout', () => { req.destroy(); reject(new Error('Google Ads API timeout')); });
|
|
58
|
+
req.write(payload);
|
|
59
|
+
req.end();
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
// ── OAuth refresh ────────────────────────────────────
|
|
63
|
+
export async function googleRefreshToken(refreshToken) {
|
|
64
|
+
const payload = JSON.stringify({
|
|
65
|
+
client_id: 'configured-in-vault',
|
|
66
|
+
grant_type: 'refresh_token',
|
|
67
|
+
refresh_token: refreshToken,
|
|
68
|
+
});
|
|
69
|
+
return new Promise((resolve, reject) => {
|
|
70
|
+
const req = httpsRequest({
|
|
71
|
+
hostname: 'oauth2.googleapis.com',
|
|
72
|
+
path: '/token',
|
|
73
|
+
method: 'POST',
|
|
74
|
+
headers: { 'Content-Type': 'application/json' },
|
|
75
|
+
timeout: 10000,
|
|
76
|
+
}, (res) => {
|
|
77
|
+
let data = '';
|
|
78
|
+
res.on('data', (chunk) => { data += chunk.toString(); });
|
|
79
|
+
res.on('end', () => resolve({ status: res.statusCode ?? 500, body: data }));
|
|
80
|
+
});
|
|
81
|
+
req.on('error', reject);
|
|
82
|
+
req.on('timeout', () => { req.destroy(); reject(new Error('Google OAuth timeout')); });
|
|
83
|
+
req.write(payload);
|
|
84
|
+
req.end();
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
// ── GAQL sanitisation ────────────────────────────────
|
|
88
|
+
/** Sanitize GAQL parameter — allow only alphanumeric, underscores, hyphens, dots. */
|
|
89
|
+
export function sanitizeGaqlParam(value) {
|
|
90
|
+
return value.replace(/[^a-zA-Z0-9_.\-]/g, '');
|
|
91
|
+
}
|
|
92
|
+
/** Sanitize a date string for GAQL — must be YYYY-MM-DD. */
|
|
93
|
+
export function sanitizeDate(value) {
|
|
94
|
+
const match = value.match(/^(\d{4}-\d{2}-\d{2})/);
|
|
95
|
+
return match ? match[1] : new Date().toISOString().slice(0, 10);
|
|
96
|
+
}
|
|
97
|
+
// ── GAQL response extraction ─────────────────────────
|
|
98
|
+
/** Extract the first results array from a searchStream response. */
|
|
99
|
+
export function extractSearchStreamRows(body) {
|
|
100
|
+
const parsed = safeParseJson(body);
|
|
101
|
+
const batches = parsed;
|
|
102
|
+
return batches[0]?.results ?? [];
|
|
103
|
+
}
|
|
104
|
+
// ── Error classification ─────────────────────────────
|
|
105
|
+
export function throwGoogleApiError(status, body) {
|
|
106
|
+
const parsed = safeParseJson(body);
|
|
107
|
+
const errMsg = parsed.error?.message ?? `HTTP ${status}`;
|
|
108
|
+
if (status === 429) {
|
|
109
|
+
throw makePlatformError('google', 'RATE_LIMITED', status, errMsg, true, 60);
|
|
110
|
+
}
|
|
111
|
+
if (status === 401 || status === 403) {
|
|
112
|
+
throw makePlatformError('google', 'AUTH_EXPIRED', status, errMsg);
|
|
113
|
+
}
|
|
114
|
+
if (errMsg.toLowerCase().includes('budget') || errMsg.includes('BudgetError')) {
|
|
115
|
+
throw makePlatformError('google', 'BUDGET_EXCEEDED', status, errMsg);
|
|
116
|
+
}
|
|
117
|
+
throw makePlatformError('google', 'UNKNOWN', status, errMsg);
|
|
118
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Ads Campaign Adapter — orchestration layer.
|
|
3
|
+
*
|
|
4
|
+
* Implements AdPlatformAdapter for Google Ads API v17.
|
|
5
|
+
* Raw API calls delegated to google-api.ts.
|
|
6
|
+
* Shared patterns from campaign-common.ts.
|
|
7
|
+
*
|
|
8
|
+
* PRD Reference: SS9.5, SS9.19.10, SS9.20.4
|
|
9
|
+
* No Stubs Doctrine: every method makes a real API call or returns documented empty.
|
|
10
|
+
*/
|
|
11
|
+
import type { AdPlatformAdapter, CampaignConfig, CampaignResult, CampaignUpdate, CreativeConfig, SpendReport, PerformanceMetrics, InsightData, OAuthTokens, Cents } from './base.js';
|
|
12
|
+
export type { GoogleCampaignConfig } from './google-api.js';
|
|
13
|
+
export declare class GoogleCampaignAdapter implements AdPlatformAdapter {
|
|
14
|
+
private readonly config;
|
|
15
|
+
private readonly rateLimiter;
|
|
16
|
+
constructor(config: {
|
|
17
|
+
customerId: string;
|
|
18
|
+
accessToken: string;
|
|
19
|
+
developerToken: string;
|
|
20
|
+
});
|
|
21
|
+
private mutate;
|
|
22
|
+
private search;
|
|
23
|
+
private campaignResource;
|
|
24
|
+
refreshToken(token: OAuthTokens): Promise<OAuthTokens>;
|
|
25
|
+
createCampaign(config: CampaignConfig): Promise<CampaignResult>;
|
|
26
|
+
updateCampaign(id: string, changes: CampaignUpdate): Promise<void>;
|
|
27
|
+
pauseCampaign(id: string): Promise<void>;
|
|
28
|
+
resumeCampaign(id: string): Promise<void>;
|
|
29
|
+
deleteCampaign(id: string): Promise<void>;
|
|
30
|
+
updateBudget(id: string, dailyBudget: Cents): Promise<void>;
|
|
31
|
+
updateCreative(id: string, creative: CreativeConfig): Promise<void>;
|
|
32
|
+
getSpend(dateRange: {
|
|
33
|
+
start: string;
|
|
34
|
+
end: string;
|
|
35
|
+
}): Promise<SpendReport>;
|
|
36
|
+
getPerformance(campaignId: string): Promise<PerformanceMetrics>;
|
|
37
|
+
getInsights(campaignId: string, metrics: string[]): Promise<InsightData>;
|
|
38
|
+
}
|