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.
Files changed (772) hide show
  1. package/dist/.claude/agents/adolin-brand.md +40 -0
  2. package/dist/.claude/agents/ahsoka-access-control.md +56 -0
  3. package/dist/.claude/agents/alfred-dependencies.md +43 -0
  4. package/dist/.claude/agents/alia-threat-detect.md +40 -0
  5. package/dist/.claude/agents/anakin-dark-side.md +41 -0
  6. package/dist/.claude/agents/aquaman-deep-dive.md +43 -0
  7. package/dist/.claude/agents/aragorn-orchestration.md +39 -0
  8. package/dist/.claude/agents/archer-greenfield.md +48 -0
  9. package/dist/.claude/agents/armin-clever.md +39 -0
  10. package/dist/.claude/agents/arwen-ui-polish.md +42 -0
  11. package/dist/.claude/agents/ashitaka-tech-debt.md +39 -0
  12. package/dist/.claude/agents/asuka-performance.md +39 -0
  13. package/dist/.claude/agents/bail-organa-governance.md +37 -0
  14. package/dist/.claude/agents/banner-database.md +44 -0
  15. package/dist/.claude/agents/barton-smoke-test.md +59 -0
  16. package/dist/.claude/agents/bashir-field-medic.md +63 -0
  17. package/dist/.claude/agents/batgirl-detail.md +43 -0
  18. package/dist/.claude/agents/batman-qa.md +73 -0
  19. package/dist/.claude/agents/bayta-evals.md +41 -0
  20. package/dist/.claude/agents/beast-boy-cross-env.md +43 -0
  21. package/dist/.claude/agents/beerus-destroyer.md +39 -0
  22. package/dist/.claude/agents/bel-riose-orchestration.md +40 -0
  23. package/dist/.claude/agents/beru-subprocess.md +37 -0
  24. package/dist/.claude/agents/bilbo-microcopy.md +43 -0
  25. package/dist/.claude/agents/black-canary-monitoring.md +43 -0
  26. package/dist/.claude/agents/bliss-ai-safety.md +40 -0
  27. package/dist/.claude/agents/bo-katan-perimeter.md +40 -0
  28. package/dist/.claude/agents/bombadil-forge-sync.md +62 -0
  29. package/dist/.claude/agents/boromir-hubris.md +40 -0
  30. package/dist/.claude/agents/breeze-platform-relations.md +40 -0
  31. package/dist/.claude/agents/bucky-legacy.md +43 -0
  32. package/dist/.claude/agents/bulma-engineering.md +40 -0
  33. package/dist/.claude/agents/calcifer-daemon.md +39 -0
  34. package/dist/.claude/agents/cara-dune-enforcement.md +37 -0
  35. package/dist/.claude/agents/cassian-recon.md +37 -0
  36. package/dist/.claude/agents/cc-persistent-process.md +39 -0
  37. package/dist/.claude/agents/celeborn-design-system.md +40 -0
  38. package/dist/.claude/agents/celebrimbor-forge-artist.md +62 -0
  39. package/dist/.claude/agents/chakotay-bridge.md +47 -0
  40. package/dist/.claude/agents/chani-worm-rider.md +61 -0
  41. package/dist/.claude/agents/chewie-dependency-audit.md +41 -0
  42. package/dist/.claude/agents/chrome-discovery.md +37 -0
  43. package/dist/.claude/agents/constantine-cursed-code.md +59 -0
  44. package/dist/.claude/agents/coulson-release.md +64 -0
  45. package/dist/.claude/agents/crusher-diagnostics.md +48 -0
  46. package/dist/.claude/agents/cyborg-system-integration.md +43 -0
  47. package/dist/.claude/agents/dalinar-positioning.md +40 -0
  48. package/dist/.claude/agents/daneel-model-migration.md +40 -0
  49. package/dist/.claude/agents/data-tech-debt.md +48 -0
  50. package/dist/.claude/agents/dax-legacy-wisdom.md +48 -0
  51. package/dist/.claude/agents/deathstroke-adversarial.md +59 -0
  52. package/dist/.claude/agents/denji-determination.md +39 -0
  53. package/dist/.claude/agents/din-djarin-bounty.md +42 -0
  54. package/dist/.claude/agents/dockson-treasury.md +67 -0
  55. package/dist/.claude/agents/dori-integration-check.md +37 -0
  56. package/dist/.claude/agents/dors-observability.md +40 -0
  57. package/dist/.claude/agents/drax-exact-match.md +42 -0
  58. package/dist/.claude/agents/ducem-token-economics.md +41 -0
  59. package/dist/.claude/agents/duncan-relay.md +40 -0
  60. package/dist/.claude/agents/duo-teardown.md +38 -0
  61. package/dist/.claude/agents/ed-network-scan.md +38 -0
  62. package/dist/.claude/agents/elrond-ux-strategy.md +39 -0
  63. package/dist/.claude/agents/eowyn-delight.md +56 -0
  64. package/dist/.claude/agents/erwin-strategy.md +39 -0
  65. package/dist/.claude/agents/ezra-catches-missed.md +40 -0
  66. package/dist/.claude/agents/ezri-session-analyst.md +45 -0
  67. package/dist/.claude/agents/falcon-migration.md +43 -0
  68. package/dist/.claude/agents/faramir-judgment.md +40 -0
  69. package/dist/.claude/agents/faye-resourceful.md +39 -0
  70. package/dist/.claude/agents/fenring-passive-monitor.md +37 -0
  71. package/dist/.claude/agents/fern-protocol.md +37 -0
  72. package/dist/.claude/agents/feyd-adversarial.md +41 -0
  73. package/dist/.claude/agents/flash-rapid-test.md +43 -0
  74. package/dist/.claude/agents/friday-automation.md +42 -0
  75. package/dist/.claude/agents/frieren-long-term.md +39 -0
  76. package/dist/.claude/agents/frodo-critical-path.md +40 -0
  77. package/dist/.claude/agents/fury-initiative.md +65 -0
  78. package/dist/.claude/agents/gaal-prompt-arch.md +41 -0
  79. package/dist/.claude/agents/galadriel-frontend.md +69 -0
  80. package/dist/.claude/agents/gamora-perf-assassin.md +43 -0
  81. package/dist/.claude/agents/gandalf-setup-wizard.md +63 -0
  82. package/dist/.claude/agents/gen-docs.md +37 -0
  83. package/dist/.claude/agents/ghanima-paired-monitor.md +37 -0
  84. package/dist/.claude/agents/gimli-performance.md +41 -0
  85. package/dist/.claude/agents/giyu-silent-guard.md +39 -0
  86. package/dist/.claude/agents/glorfindel-rendering.md +40 -0
  87. package/dist/.claude/agents/gohan-hidden-power.md +39 -0
  88. package/dist/.claude/agents/gojo-infinite-scale.md +39 -0
  89. package/dist/.claude/agents/goku-scaling.md +39 -0
  90. package/dist/.claude/agents/goldberry-change-detect.md +37 -0
  91. package/dist/.claude/agents/gordon-escalation.md +42 -0
  92. package/dist/.claude/agents/green-arrow-precision.md +43 -0
  93. package/dist/.claude/agents/green-lantern-scenarios.md +43 -0
  94. package/dist/.claude/agents/grogu-tiny-vulns.md +38 -0
  95. package/dist/.claude/agents/groot-caching.md +43 -0
  96. package/dist/.claude/agents/gurney-delivery.md +40 -0
  97. package/dist/.claude/agents/haku-deploy-wizard.md +65 -0
  98. package/dist/.claude/agents/haldir-boundaries.md +40 -0
  99. package/dist/.claude/agents/han-vuln-hunter.md +40 -0
  100. package/dist/.claude/agents/hange-experimentation.md +39 -0
  101. package/dist/.claude/agents/harah-protocol.md +38 -0
  102. package/dist/.claude/agents/hawkgirl-regression-sweep.md +43 -0
  103. package/dist/.claude/agents/heero-mission-deploy.md +39 -0
  104. package/dist/.claude/agents/hera-navigation.md +41 -0
  105. package/dist/.claude/agents/hill-mission-control.md +43 -0
  106. package/dist/.claude/agents/himmel-legacy.md +37 -0
  107. package/dist/.claude/agents/hober-tool-schema.md +40 -0
  108. package/dist/.claude/agents/hoid-copywriting.md +40 -0
  109. package/dist/.claude/agents/howl-migration.md +39 -0
  110. package/dist/.claude/agents/hughes-observability.md +37 -0
  111. package/dist/.claude/agents/huntress-flaky-bugs.md +42 -0
  112. package/dist/.claude/agents/irulan-historian.md +37 -0
  113. package/dist/.claude/agents/jake-reporter.md +45 -0
  114. package/dist/.claude/agents/janeway-novel-arch.md +48 -0
  115. package/dist/.claude/agents/janov-context-eng.md +40 -0
  116. package/dist/.claude/agents/jarvis-status.md +42 -0
  117. package/dist/.claude/agents/jean-pragmatic.md +39 -0
  118. package/dist/.claude/agents/jessica-voice.md +40 -0
  119. package/dist/.claude/agents/jet-maintenance.md +39 -0
  120. package/dist/.claude/agents/jin-disciplined-adv.md +39 -0
  121. package/dist/.claude/agents/kaji-intelligence.md +39 -0
  122. package/dist/.claude/agents/kaladin-organic-growth.md +40 -0
  123. package/dist/.claude/agents/kallen-hard-deploy.md +39 -0
  124. package/dist/.claude/agents/kanan-intuitive.md +41 -0
  125. package/dist/.claude/agents/kaoru-harmony.md +37 -0
  126. package/dist/.claude/agents/kaworu-solver.md +39 -0
  127. package/dist/.claude/agents/kelsier-growth.md +64 -0
  128. package/dist/.claude/agents/kenobi-security.md +70 -0
  129. package/dist/.claude/agents/kim-api-design.md +49 -0
  130. package/dist/.claude/agents/kira-pragmatic.md +48 -0
  131. package/dist/.claude/agents/kishibe-hardening.md +39 -0
  132. package/dist/.claude/agents/kohaku-rapid-response.md +36 -0
  133. package/dist/.claude/agents/krillin-support.md +36 -0
  134. package/dist/.claude/agents/kusanagi-devops.md +70 -0
  135. package/dist/.claude/agents/la-forge-reliability.md +63 -0
  136. package/dist/.claude/agents/lang-micro-changes.md +43 -0
  137. package/dist/.claude/agents/legolas-precision.md +42 -0
  138. package/dist/.claude/agents/leia-secrets.md +41 -0
  139. package/dist/.claude/agents/lelouch-orchestration.md +39 -0
  140. package/dist/.claude/agents/leto-ii-persistence.md +40 -0
  141. package/dist/.claude/agents/leto-protection.md +40 -0
  142. package/dist/.claude/agents/levi-deploy.md +40 -0
  143. package/dist/.claude/agents/liet-kynes-deep-system.md +40 -0
  144. package/dist/.claude/agents/lift-social-media.md +40 -0
  145. package/dist/.claude/agents/loki-chaos.md +58 -0
  146. package/dist/.claude/agents/lucius-config.md +43 -0
  147. package/dist/.claude/agents/luke-audit-journey.md +41 -0
  148. package/dist/.claude/agents/manhunter-shapeshifting.md +43 -0
  149. package/dist/.claude/agents/marsh-competitive-intel.md +41 -0
  150. package/dist/.claude/agents/maul-red-team.md +57 -0
  151. package/dist/.claude/agents/merry-pair-review.md +40 -0
  152. package/dist/.claude/agents/mikasa-protection.md +39 -0
  153. package/dist/.claude/agents/miles-teg-perf.md +40 -0
  154. package/dist/.claude/agents/milim-load-test.md +39 -0
  155. package/dist/.claude/agents/misato-operations.md +39 -0
  156. package/dist/.claude/agents/mob-capacity.md +39 -0
  157. package/dist/.claude/agents/mohiam-authentication.md +40 -0
  158. package/dist/.claude/agents/mon-mothma-security-mgmt.md +41 -0
  159. package/dist/.claude/agents/mugen-chaos.md +39 -0
  160. package/dist/.claude/agents/mule-adversarial-ai.md +41 -0
  161. package/dist/.claude/agents/mustang-cleanup.md +39 -0
  162. package/dist/.claude/agents/nanami-structured-ops.md +39 -0
  163. package/dist/.claude/agents/nausicaa-resources.md +39 -0
  164. package/dist/.claude/agents/navani-technical-seo.md +40 -0
  165. package/dist/.claude/agents/nebula-optimization.md +43 -0
  166. package/dist/.claude/agents/nightwing-regression.md +59 -0
  167. package/dist/.claude/agents/nobara-direct-fix.md +39 -0
  168. package/dist/.claude/agents/nog-solutions.md +48 -0
  169. package/dist/.claude/agents/nori-asset-scanner.md +37 -0
  170. package/dist/.claude/agents/obrien-root-cause.md +48 -0
  171. package/dist/.claude/agents/odo-structural-anomaly.md +48 -0
  172. package/dist/.claude/agents/okoye-data-integrity.md +43 -0
  173. package/dist/.claude/agents/olivier-hardening.md +39 -0
  174. package/dist/.claude/agents/oracle-static-analysis.md +59 -0
  175. package/dist/.claude/agents/ori-prompt-crafter.md +37 -0
  176. package/dist/.claude/agents/padme-data-protection.md +42 -0
  177. package/dist/.claude/agents/paris-route-planner.md +47 -0
  178. package/dist/.claude/agents/parker-connections.md +43 -0
  179. package/dist/.claude/agents/paul-orchestration.md +40 -0
  180. package/dist/.claude/agents/picard-architecture.md +64 -0
  181. package/dist/.claude/agents/piccolo-tactics.md +39 -0
  182. package/dist/.claude/agents/pike-bold-decisions.md +48 -0
  183. package/dist/.claude/agents/pippin-discovery.md +40 -0
  184. package/dist/.claude/agents/plo-koon-edge-cases.md +37 -0
  185. package/dist/.claude/agents/power-chaotic.md +39 -0
  186. package/dist/.claude/agents/qui-gon-subtle-vulns.md +40 -0
  187. package/dist/.claude/agents/radagast-edge-cases.md +41 -0
  188. package/dist/.claude/agents/raoden-conversion.md +41 -0
  189. package/dist/.claude/agents/raven-deep-analysis.md +43 -0
  190. package/dist/.claude/agents/red-hood-aggressive.md +47 -0
  191. package/dist/.claude/agents/rei-dangerous-tasks.md +39 -0
  192. package/dist/.claude/agents/reigen-debugger.md +39 -0
  193. package/dist/.claude/agents/rengoku-intense-monitor.md +39 -0
  194. package/dist/.claude/agents/rex-infrastructure.md +41 -0
  195. package/dist/.claude/agents/rhodes-production.md +43 -0
  196. package/dist/.claude/agents/riker-review.md +62 -0
  197. package/dist/.claude/agents/rimuru-adapter.md +39 -0
  198. package/dist/.claude/agents/riza-backup.md +39 -0
  199. package/dist/.claude/agents/robin-apprentice.md +42 -0
  200. package/dist/.claude/agents/rocket-scrappy.md +43 -0
  201. package/dist/.claude/agents/rogers-api-design.md +43 -0
  202. package/dist/.claude/agents/romanoff-integrations.md +44 -0
  203. package/dist/.claude/agents/sabine-unconventional.md +40 -0
  204. package/dist/.claude/agents/salvor-model-selection.md +42 -0
  205. package/dist/.claude/agents/samwise-accessibility.md +43 -0
  206. package/dist/.claude/agents/sarene-outreach.md +40 -0
  207. package/dist/.claude/agents/sasha-resources.md +37 -0
  208. package/dist/.claude/agents/scotty-infrastructure.md +48 -0
  209. package/dist/.claude/agents/seldon-ai.md +67 -0
  210. package/dist/.claude/agents/senku-provisioning.md +40 -0
  211. package/dist/.claude/agents/sentaro-scheduling.md +37 -0
  212. package/dist/.claude/agents/seven-optimization.md +48 -0
  213. package/dist/.claude/agents/shallan-creative.md +40 -0
  214. package/dist/.claude/agents/sheeana-transport.md +40 -0
  215. package/dist/.claude/agents/shuri-innovation.md +43 -0
  216. package/dist/.claude/agents/silver-surfer-herald.md +90 -0
  217. package/dist/.claude/agents/siona-evasion.md +41 -0
  218. package/dist/.claude/agents/sisko-campaign.md +68 -0
  219. package/dist/.claude/agents/spike-routing.md +40 -0
  220. package/dist/.claude/agents/spock-schema.md +62 -0
  221. package/dist/.claude/agents/starfire-brute-force.md +43 -0
  222. package/dist/.claude/agents/stark-backend.md +71 -0
  223. package/dist/.claude/agents/steris-budget.md +41 -0
  224. package/dist/.claude/agents/stilgar-channel-security.md +40 -0
  225. package/dist/.claude/agents/strange-service-arch.md +44 -0
  226. package/dist/.claude/agents/sung-workers.md +39 -0
  227. package/dist/.claude/agents/superman-strength-test.md +43 -0
  228. package/dist/.claude/agents/suzaku-execution.md +39 -0
  229. package/dist/.claude/agents/szeth-compliance.md +40 -0
  230. package/dist/.claude/agents/tanjiro-persistent.md +39 -0
  231. package/dist/.claude/agents/tchalla-quality.md +43 -0
  232. package/dist/.claude/agents/thanos-gauntlet.md +68 -0
  233. package/dist/.claude/agents/theoden-rally.md +40 -0
  234. package/dist/.claude/agents/thor-queues.md +44 -0
  235. package/dist/.claude/agents/thufir-protocol-parsing.md +40 -0
  236. package/dist/.claude/agents/todo-brute-force.md +39 -0
  237. package/dist/.claude/agents/torres-site-scanner.md +47 -0
  238. package/dist/.claude/agents/totoro-guardian.md +39 -0
  239. package/dist/.claude/agents/tpol-disciplined.md +48 -0
  240. package/dist/.claude/agents/treebeard-deliberation.md +41 -0
  241. package/dist/.claude/agents/troi-prd-compliance.md +64 -0
  242. package/dist/.claude/agents/trunks-rollback.md +39 -0
  243. package/dist/.claude/agents/tuvok-deep-current.md +63 -0
  244. package/dist/.claude/agents/uhura-integration.md +47 -0
  245. package/dist/.claude/agents/valkyrie-recovery.md +43 -0
  246. package/dist/.claude/agents/vegeta-monitoring.md +39 -0
  247. package/dist/.claude/agents/veldora-dormant.md +37 -0
  248. package/dist/.claude/agents/vin-analytics.md +41 -0
  249. package/dist/.claude/agents/vision-data-analysis.md +43 -0
  250. package/dist/.claude/agents/wanda-seldon-validation.md +38 -0
  251. package/dist/.claude/agents/wanda-state.md +43 -0
  252. package/dist/.claude/agents/wax-paid-ads.md +40 -0
  253. package/dist/.claude/agents/wayne-ab-testing.md +40 -0
  254. package/dist/.claude/agents/whis-precision.md +39 -0
  255. package/dist/.claude/agents/windu-input-validation.md +41 -0
  256. package/dist/.claude/agents/winry-maintenance.md +39 -0
  257. package/dist/.claude/agents/wonder-woman-truth.md +43 -0
  258. package/dist/.claude/agents/wong-documentation.md +58 -0
  259. package/dist/.claude/agents/worf-security-arch.md +49 -0
  260. package/dist/.claude/agents/yoda-auth.md +57 -0
  261. package/dist/.claude/agents/yueh-trust-verify.md +40 -0
  262. package/dist/.claude/agents/zatanna-impossible.md +43 -0
  263. package/dist/.claude/agents/zechs-rival.md +39 -0
  264. package/dist/.claude/agents/zenitsu-alerts.md +37 -0
  265. package/dist/.claude/commands/ai.md +84 -0
  266. package/dist/.claude/commands/architect.md +107 -0
  267. package/dist/.claude/commands/assemble.md +223 -0
  268. package/dist/.claude/commands/assess.md +86 -0
  269. package/dist/.claude/commands/blueprint.md +135 -0
  270. package/dist/.claude/commands/build.md +138 -0
  271. package/dist/.claude/commands/campaign.md +224 -0
  272. package/dist/.claude/commands/cultivation.md +184 -0
  273. package/dist/.claude/commands/current.md +128 -0
  274. package/dist/.claude/commands/dangerroom.md +74 -0
  275. package/dist/.claude/commands/debrief.md +180 -0
  276. package/dist/.claude/commands/deploy.md +108 -0
  277. package/dist/.claude/commands/devops.md +160 -0
  278. package/dist/.claude/commands/engage.md +135 -0
  279. package/dist/.claude/commands/gauntlet.md +179 -0
  280. package/dist/.claude/commands/git.md +104 -0
  281. package/dist/.claude/commands/grow.md +160 -0
  282. package/dist/.claude/commands/imagine.md +126 -0
  283. package/dist/.claude/commands/portfolio.md +51 -0
  284. package/dist/.claude/commands/prd.md +113 -0
  285. package/dist/.claude/commands/qa.md +130 -0
  286. package/dist/.claude/commands/review.md +9 -0
  287. package/dist/.claude/commands/security.md +9 -0
  288. package/dist/.claude/commands/sentinel.md +90 -0
  289. package/dist/.claude/commands/test.md +114 -0
  290. package/dist/.claude/commands/thumper.md +116 -0
  291. package/dist/.claude/commands/treasury.md +117 -0
  292. package/dist/.claude/commands/ux.md +132 -0
  293. package/dist/.claude/commands/vault.md +198 -0
  294. package/dist/.claude/commands/void.md +148 -0
  295. package/dist/CHANGELOG.md +2621 -0
  296. package/dist/CLAUDE.md +292 -0
  297. package/dist/HOLOCRON.md +859 -0
  298. package/dist/VERSION.md +149 -0
  299. package/dist/docs/NAMING_REGISTRY.md +479 -0
  300. package/dist/docs/methods/AI_INTELLIGENCE.md +276 -0
  301. package/dist/docs/methods/ASSEMBLER.md +142 -0
  302. package/dist/docs/methods/BACKEND_ENGINEER.md +165 -0
  303. package/dist/docs/methods/BUILD_JOURNAL.md +214 -0
  304. package/dist/docs/methods/BUILD_PROTOCOL.md +436 -0
  305. package/dist/docs/methods/CAMPAIGN.md +569 -0
  306. package/dist/docs/methods/CONTEXT_MANAGEMENT.md +189 -0
  307. package/dist/docs/methods/DEEP_CURRENT.md +184 -0
  308. package/dist/docs/methods/DEVOPS_ENGINEER.md +297 -0
  309. package/dist/docs/methods/FIELD_MEDIC.md +265 -0
  310. package/dist/docs/methods/FORGE_ARTIST.md +108 -0
  311. package/dist/docs/methods/FORGE_KEEPER.md +270 -0
  312. package/dist/docs/methods/GAUNTLET.md +364 -0
  313. package/dist/docs/methods/GROWTH_STRATEGIST.md +466 -0
  314. package/dist/docs/methods/HEARTBEAT.md +168 -0
  315. package/dist/docs/methods/MCP_INTEGRATION.md +139 -0
  316. package/dist/docs/methods/MUSTER.md +152 -0
  317. package/dist/docs/methods/PRD_GENERATOR.md +186 -0
  318. package/dist/docs/methods/PRODUCT_DESIGN_FRONTEND.md +252 -0
  319. package/dist/docs/methods/QA_ENGINEER.md +360 -0
  320. package/dist/docs/methods/RELEASE_MANAGER.md +145 -0
  321. package/dist/docs/methods/SECURITY_AUDITOR.md +328 -0
  322. package/dist/docs/methods/SUB_AGENTS.md +375 -0
  323. package/dist/docs/methods/SYSTEMS_ARCHITECT.md +180 -0
  324. package/dist/docs/methods/TESTING.md +359 -0
  325. package/dist/docs/methods/THUMPER.md +175 -0
  326. package/dist/docs/methods/TIME_VAULT.md +120 -0
  327. package/dist/docs/methods/TREASURY.md +184 -0
  328. package/dist/docs/methods/TROUBLESHOOTING.md +265 -0
  329. package/dist/docs/patterns/README.md +52 -0
  330. package/dist/docs/patterns/ad-billing-adapter.ts +537 -0
  331. package/dist/docs/patterns/ad-platform-adapter.ts +421 -0
  332. package/dist/docs/patterns/ai-classifier.ts +195 -0
  333. package/dist/docs/patterns/ai-eval.ts +272 -0
  334. package/dist/docs/patterns/ai-orchestrator.ts +341 -0
  335. package/dist/docs/patterns/ai-router.ts +194 -0
  336. package/dist/docs/patterns/ai-tool-schema.ts +237 -0
  337. package/dist/docs/patterns/api-route.ts +241 -0
  338. package/dist/docs/patterns/backtest-engine.ts +499 -0
  339. package/dist/docs/patterns/browser-review.ts +292 -0
  340. package/dist/docs/patterns/combobox.tsx +300 -0
  341. package/dist/docs/patterns/component.tsx +262 -0
  342. package/dist/docs/patterns/daemon-process.ts +338 -0
  343. package/dist/docs/patterns/data-pipeline.ts +297 -0
  344. package/dist/docs/patterns/database-migration.ts +466 -0
  345. package/dist/docs/patterns/e2e-test.ts +629 -0
  346. package/dist/docs/patterns/error-handling.ts +312 -0
  347. package/dist/docs/patterns/execution-safety.ts +601 -0
  348. package/dist/docs/patterns/financial-transaction.ts +366 -0
  349. package/dist/docs/patterns/funding-plan.ts +462 -0
  350. package/dist/docs/patterns/game-entity.ts +137 -0
  351. package/dist/docs/patterns/game-loop.ts +113 -0
  352. package/dist/docs/patterns/game-state.ts +143 -0
  353. package/dist/docs/patterns/job-queue.ts +225 -0
  354. package/dist/docs/patterns/kongo-integration.ts +164 -0
  355. package/dist/docs/patterns/middleware.ts +363 -0
  356. package/dist/docs/patterns/mobile-screen.tsx +139 -0
  357. package/dist/docs/patterns/mobile-service.ts +167 -0
  358. package/dist/docs/patterns/multi-tenant.ts +382 -0
  359. package/dist/docs/patterns/oauth-token-lifecycle.ts +223 -0
  360. package/dist/docs/patterns/outbound-rate-limiter.ts +260 -0
  361. package/dist/docs/patterns/prompt-template.ts +195 -0
  362. package/dist/docs/patterns/revenue-source-adapter.ts +311 -0
  363. package/dist/docs/patterns/service.ts +224 -0
  364. package/dist/docs/patterns/sse-endpoint.ts +118 -0
  365. package/dist/docs/patterns/stablecoin-adapter.ts +511 -0
  366. package/dist/docs/patterns/third-party-script.ts +68 -0
  367. package/dist/scripts/thumper/gom-jabbar.sh +241 -0
  368. package/dist/scripts/thumper/relay.sh +610 -0
  369. package/dist/scripts/thumper/scan.sh +359 -0
  370. package/dist/scripts/thumper/thumper.sh +190 -0
  371. package/dist/scripts/thumper/water-rings.sh +76 -0
  372. package/dist/scripts/vault-read.d.ts +11 -0
  373. package/dist/scripts/vault-read.js +89 -0
  374. package/dist/scripts/voidforge.d.ts +21 -0
  375. package/dist/scripts/voidforge.js +614 -0
  376. package/dist/wizard/api/auth.d.ts +5 -0
  377. package/dist/wizard/api/auth.js +139 -0
  378. package/dist/wizard/api/blueprint.d.ts +34 -0
  379. package/dist/wizard/api/blueprint.js +161 -0
  380. package/dist/wizard/api/cloud-providers.d.ts +16 -0
  381. package/dist/wizard/api/cloud-providers.js +363 -0
  382. package/dist/wizard/api/credentials.d.ts +1 -0
  383. package/dist/wizard/api/credentials.js +265 -0
  384. package/dist/wizard/api/danger-room.d.ts +24 -0
  385. package/dist/wizard/api/danger-room.js +274 -0
  386. package/dist/wizard/api/deploy.d.ts +4 -0
  387. package/dist/wizard/api/deploy.js +164 -0
  388. package/dist/wizard/api/prd.d.ts +1 -0
  389. package/dist/wizard/api/prd.js +363 -0
  390. package/dist/wizard/api/project.d.ts +1 -0
  391. package/dist/wizard/api/project.js +241 -0
  392. package/dist/wizard/api/projects-data.d.ts +5 -0
  393. package/dist/wizard/api/projects-data.js +234 -0
  394. package/dist/wizard/api/projects-list.d.ts +5 -0
  395. package/dist/wizard/api/projects-list.js +227 -0
  396. package/dist/wizard/api/projects.d.ts +7 -0
  397. package/dist/wizard/api/projects.js +273 -0
  398. package/dist/wizard/api/provision-status.d.ts +5 -0
  399. package/dist/wizard/api/provision-status.js +47 -0
  400. package/dist/wizard/api/provision-steps.d.ts +21 -0
  401. package/dist/wizard/api/provision-steps.js +44 -0
  402. package/dist/wizard/api/provision-validate.d.ts +22 -0
  403. package/dist/wizard/api/provision-validate.js +164 -0
  404. package/dist/wizard/api/provision.d.ts +2 -0
  405. package/dist/wizard/api/provision.js +239 -0
  406. package/dist/wizard/api/terminal.d.ts +25 -0
  407. package/dist/wizard/api/terminal.js +246 -0
  408. package/dist/wizard/api/users.d.ts +6 -0
  409. package/dist/wizard/api/users.js +244 -0
  410. package/dist/wizard/api/war-room.d.ts +16 -0
  411. package/dist/wizard/api/war-room.js +70 -0
  412. package/dist/wizard/danger-room.config.json +5 -0
  413. package/dist/wizard/lib/ad-platform-core.d.ts +6 -0
  414. package/dist/wizard/lib/ad-platform-core.js +1 -0
  415. package/dist/wizard/lib/adapters/index.d.ts +52 -0
  416. package/dist/wizard/lib/adapters/index.js +38 -0
  417. package/dist/wizard/lib/adapters/sandbox-bank.d.ts +17 -0
  418. package/dist/wizard/lib/adapters/sandbox-bank.js +77 -0
  419. package/dist/wizard/lib/adapters/sandbox.d.ts +39 -0
  420. package/dist/wizard/lib/adapters/sandbox.js +174 -0
  421. package/dist/wizard/lib/adapters/stripe.d.ts +19 -0
  422. package/dist/wizard/lib/adapters/stripe.js +143 -0
  423. package/dist/wizard/lib/adapters/types.d.ts +9 -0
  424. package/dist/wizard/lib/adapters/types.js +10 -0
  425. package/dist/wizard/lib/agent-memory.d.ts +36 -0
  426. package/dist/wizard/lib/agent-memory.js +114 -0
  427. package/dist/wizard/lib/agent-registry.d.ts +21 -0
  428. package/dist/wizard/lib/agent-registry.js +105 -0
  429. package/dist/wizard/lib/anomaly-detection.d.ts +59 -0
  430. package/dist/wizard/lib/anomaly-detection.js +122 -0
  431. package/dist/wizard/lib/anthropic.d.ts +21 -0
  432. package/dist/wizard/lib/anthropic.js +105 -0
  433. package/dist/wizard/lib/asset-scanner.d.ts +23 -0
  434. package/dist/wizard/lib/asset-scanner.js +107 -0
  435. package/dist/wizard/lib/audit-log.d.ts +23 -0
  436. package/dist/wizard/lib/audit-log.js +70 -0
  437. package/dist/wizard/lib/autonomy-controller.d.ts +76 -0
  438. package/dist/wizard/lib/autonomy-controller.js +184 -0
  439. package/dist/wizard/lib/body-parser.d.ts +2 -0
  440. package/dist/wizard/lib/body-parser.js +36 -0
  441. package/dist/wizard/lib/build-analytics.d.ts +39 -0
  442. package/dist/wizard/lib/build-analytics.js +91 -0
  443. package/dist/wizard/lib/build-step.d.ts +21 -0
  444. package/dist/wizard/lib/build-step.js +104 -0
  445. package/dist/wizard/lib/campaign-proposer.d.ts +39 -0
  446. package/dist/wizard/lib/campaign-proposer.js +181 -0
  447. package/dist/wizard/lib/campaign-state-machine.d.ts +63 -0
  448. package/dist/wizard/lib/campaign-state-machine.js +114 -0
  449. package/dist/wizard/lib/ci-generator.d.ts +14 -0
  450. package/dist/wizard/lib/ci-generator.js +187 -0
  451. package/dist/wizard/lib/claude-merge.d.ts +38 -0
  452. package/dist/wizard/lib/claude-merge.js +115 -0
  453. package/dist/wizard/lib/codegen/erd-gen.d.ts +16 -0
  454. package/dist/wizard/lib/codegen/erd-gen.js +98 -0
  455. package/dist/wizard/lib/codegen/integrations.d.ts +18 -0
  456. package/dist/wizard/lib/codegen/integrations.js +189 -0
  457. package/dist/wizard/lib/codegen/openapi-gen.d.ts +15 -0
  458. package/dist/wizard/lib/codegen/openapi-gen.js +79 -0
  459. package/dist/wizard/lib/codegen/prisma-types.d.ts +15 -0
  460. package/dist/wizard/lib/codegen/prisma-types.js +44 -0
  461. package/dist/wizard/lib/codegen/seed-gen.d.ts +16 -0
  462. package/dist/wizard/lib/codegen/seed-gen.js +128 -0
  463. package/dist/wizard/lib/compliance.d.ts +51 -0
  464. package/dist/wizard/lib/compliance.js +112 -0
  465. package/dist/wizard/lib/correlation-engine.d.ts +59 -0
  466. package/dist/wizard/lib/correlation-engine.js +152 -0
  467. package/dist/wizard/lib/cost-estimator.d.ts +22 -0
  468. package/dist/wizard/lib/cost-estimator.js +72 -0
  469. package/dist/wizard/lib/cost-tracker.d.ts +27 -0
  470. package/dist/wizard/lib/cost-tracker.js +37 -0
  471. package/dist/wizard/lib/daemon-aggregator.d.ts +76 -0
  472. package/dist/wizard/lib/daemon-aggregator.js +241 -0
  473. package/dist/wizard/lib/daemon-core.d.ts +16 -0
  474. package/dist/wizard/lib/daemon-core.js +39 -0
  475. package/dist/wizard/lib/dashboard-data.d.ts +123 -0
  476. package/dist/wizard/lib/dashboard-data.js +314 -0
  477. package/dist/wizard/lib/dashboard-ws.d.ts +28 -0
  478. package/dist/wizard/lib/dashboard-ws.js +117 -0
  479. package/dist/wizard/lib/deep-current.d.ts +77 -0
  480. package/dist/wizard/lib/deep-current.js +247 -0
  481. package/dist/wizard/lib/deploy-coordinator.d.ts +40 -0
  482. package/dist/wizard/lib/deploy-coordinator.js +86 -0
  483. package/dist/wizard/lib/deploy-log.d.ts +28 -0
  484. package/dist/wizard/lib/deploy-log.js +52 -0
  485. package/dist/wizard/lib/desktop-notify.d.ts +27 -0
  486. package/dist/wizard/lib/desktop-notify.js +98 -0
  487. package/dist/wizard/lib/dns/cloudflare-dns.d.ts +35 -0
  488. package/dist/wizard/lib/dns/cloudflare-dns.js +216 -0
  489. package/dist/wizard/lib/dns/cloudflare-registrar.d.ts +31 -0
  490. package/dist/wizard/lib/dns/cloudflare-registrar.js +148 -0
  491. package/dist/wizard/lib/dns/types.d.ts +22 -0
  492. package/dist/wizard/lib/dns/types.js +4 -0
  493. package/dist/wizard/lib/document-discovery.d.ts +33 -0
  494. package/dist/wizard/lib/document-discovery.js +145 -0
  495. package/dist/wizard/lib/env-validator.d.ts +14 -0
  496. package/dist/wizard/lib/env-validator.js +205 -0
  497. package/dist/wizard/lib/env-writer.d.ts +13 -0
  498. package/dist/wizard/lib/env-writer.js +26 -0
  499. package/dist/wizard/lib/exec.d.ts +30 -0
  500. package/dist/wizard/lib/exec.js +52 -0
  501. package/dist/wizard/lib/experiment.d.ts +70 -0
  502. package/dist/wizard/lib/experiment.js +169 -0
  503. package/dist/wizard/lib/extensions.d.ts +20 -0
  504. package/dist/wizard/lib/extensions.js +183 -0
  505. package/dist/wizard/lib/financial/adapter-factory.d.ts +47 -0
  506. package/dist/wizard/lib/financial/adapter-factory.js +225 -0
  507. package/dist/wizard/lib/financial/billing/base.d.ts +6 -0
  508. package/dist/wizard/lib/financial/billing/base.js +1 -0
  509. package/dist/wizard/lib/financial/billing/google-billing.d.ts +56 -0
  510. package/dist/wizard/lib/financial/billing/google-billing.js +298 -0
  511. package/dist/wizard/lib/financial/billing/meta-billing.d.ts +54 -0
  512. package/dist/wizard/lib/financial/billing/meta-billing.js +243 -0
  513. package/dist/wizard/lib/financial/billing/tiktok-billing.d.ts +54 -0
  514. package/dist/wizard/lib/financial/billing/tiktok-billing.js +260 -0
  515. package/dist/wizard/lib/financial/campaign/base.d.ts +13 -0
  516. package/dist/wizard/lib/financial/campaign/base.js +1 -0
  517. package/dist/wizard/lib/financial/campaign/campaign-common.d.ts +21 -0
  518. package/dist/wizard/lib/financial/campaign/campaign-common.js +58 -0
  519. package/dist/wizard/lib/financial/campaign/google-api.d.ts +35 -0
  520. package/dist/wizard/lib/financial/campaign/google-api.js +118 -0
  521. package/dist/wizard/lib/financial/campaign/google-campaign.d.ts +38 -0
  522. package/dist/wizard/lib/financial/campaign/google-campaign.js +186 -0
  523. package/dist/wizard/lib/financial/campaign/meta-api.d.ts +28 -0
  524. package/dist/wizard/lib/financial/campaign/meta-api.js +93 -0
  525. package/dist/wizard/lib/financial/campaign/meta-campaign.d.ts +32 -0
  526. package/dist/wizard/lib/financial/campaign/meta-campaign.js +189 -0
  527. package/dist/wizard/lib/financial/campaign/sandbox-campaign.d.ts +45 -0
  528. package/dist/wizard/lib/financial/campaign/sandbox-campaign.js +261 -0
  529. package/dist/wizard/lib/financial/campaign/tiktok-api.d.ts +25 -0
  530. package/dist/wizard/lib/financial/campaign/tiktok-api.js +81 -0
  531. package/dist/wizard/lib/financial/campaign/tiktok-campaign.d.ts +37 -0
  532. package/dist/wizard/lib/financial/campaign/tiktok-campaign.js +155 -0
  533. package/dist/wizard/lib/financial/funding-auto.d.ts +44 -0
  534. package/dist/wizard/lib/financial/funding-auto.js +52 -0
  535. package/dist/wizard/lib/financial/funding-policy.d.ts +60 -0
  536. package/dist/wizard/lib/financial/funding-policy.js +179 -0
  537. package/dist/wizard/lib/financial/platform-planner.d.ts +47 -0
  538. package/dist/wizard/lib/financial/platform-planner.js +134 -0
  539. package/dist/wizard/lib/financial/reconciliation-engine.d.ts +78 -0
  540. package/dist/wizard/lib/financial/reconciliation-engine.js +193 -0
  541. package/dist/wizard/lib/financial/registry.d.ts +22 -0
  542. package/dist/wizard/lib/financial/registry.js +26 -0
  543. package/dist/wizard/lib/financial/reporting.d.ts +96 -0
  544. package/dist/wizard/lib/financial/reporting.js +198 -0
  545. package/dist/wizard/lib/financial/stablecoin/base.d.ts +6 -0
  546. package/dist/wizard/lib/financial/stablecoin/base.js +1 -0
  547. package/dist/wizard/lib/financial/stablecoin/circle.d.ts +54 -0
  548. package/dist/wizard/lib/financial/stablecoin/circle.js +367 -0
  549. package/dist/wizard/lib/financial/stablecoin/mercury.d.ts +24 -0
  550. package/dist/wizard/lib/financial/stablecoin/mercury.js +171 -0
  551. package/dist/wizard/lib/financial/stablecoin/sandbox-stablecoin.d.ts +47 -0
  552. package/dist/wizard/lib/financial/stablecoin/sandbox-stablecoin.js +202 -0
  553. package/dist/wizard/lib/financial/treasury-planner.d.ts +52 -0
  554. package/dist/wizard/lib/financial/treasury-planner.js +128 -0
  555. package/dist/wizard/lib/financial-core.d.ts +6 -0
  556. package/dist/wizard/lib/financial-core.js +5 -0
  557. package/dist/wizard/lib/financial-vault.d.ts +34 -0
  558. package/dist/wizard/lib/financial-vault.js +200 -0
  559. package/dist/wizard/lib/frontmatter.d.ts +30 -0
  560. package/dist/wizard/lib/frontmatter.js +99 -0
  561. package/dist/wizard/lib/gap-analysis.d.ts +37 -0
  562. package/dist/wizard/lib/gap-analysis.js +218 -0
  563. package/dist/wizard/lib/github.d.ts +22 -0
  564. package/dist/wizard/lib/github.js +261 -0
  565. package/dist/wizard/lib/headless-deploy.d.ts +14 -0
  566. package/dist/wizard/lib/headless-deploy.js +452 -0
  567. package/dist/wizard/lib/health-monitor.d.ts +15 -0
  568. package/dist/wizard/lib/health-monitor.js +91 -0
  569. package/dist/wizard/lib/health-poller.d.ts +9 -0
  570. package/dist/wizard/lib/health-poller.js +123 -0
  571. package/dist/wizard/lib/heartbeat-lifecycle.d.ts +71 -0
  572. package/dist/wizard/lib/heartbeat-lifecycle.js +107 -0
  573. package/dist/wizard/lib/heartbeat-scheduler.d.ts +26 -0
  574. package/dist/wizard/lib/heartbeat-scheduler.js +155 -0
  575. package/dist/wizard/lib/heartbeat.d.ts +22 -0
  576. package/dist/wizard/lib/heartbeat.js +538 -0
  577. package/dist/wizard/lib/herald.d.ts +28 -0
  578. package/dist/wizard/lib/herald.js +167 -0
  579. package/dist/wizard/lib/http-helpers.d.ts +9 -0
  580. package/dist/wizard/lib/http-helpers.js +24 -0
  581. package/dist/wizard/lib/image-gen.d.ts +56 -0
  582. package/dist/wizard/lib/image-gen.js +159 -0
  583. package/dist/wizard/lib/instance-sizing.d.ts +26 -0
  584. package/dist/wizard/lib/instance-sizing.js +51 -0
  585. package/dist/wizard/lib/kongo/analytics.d.ts +29 -0
  586. package/dist/wizard/lib/kongo/analytics.js +179 -0
  587. package/dist/wizard/lib/kongo/campaigns.d.ts +52 -0
  588. package/dist/wizard/lib/kongo/campaigns.js +91 -0
  589. package/dist/wizard/lib/kongo/client.d.ts +58 -0
  590. package/dist/wizard/lib/kongo/client.js +221 -0
  591. package/dist/wizard/lib/kongo/jobs.d.ts +57 -0
  592. package/dist/wizard/lib/kongo/jobs.js +122 -0
  593. package/dist/wizard/lib/kongo/pages.d.ts +60 -0
  594. package/dist/wizard/lib/kongo/pages.js +150 -0
  595. package/dist/wizard/lib/kongo/provisioner.d.ts +64 -0
  596. package/dist/wizard/lib/kongo/provisioner.js +116 -0
  597. package/dist/wizard/lib/kongo/seed.d.ts +49 -0
  598. package/dist/wizard/lib/kongo/seed.js +237 -0
  599. package/dist/wizard/lib/kongo/types.d.ts +323 -0
  600. package/dist/wizard/lib/kongo/types.js +11 -0
  601. package/dist/wizard/lib/kongo/variants.d.ts +57 -0
  602. package/dist/wizard/lib/kongo/variants.js +88 -0
  603. package/dist/wizard/lib/kongo/webhooks.d.ts +41 -0
  604. package/dist/wizard/lib/kongo/webhooks.js +112 -0
  605. package/dist/wizard/lib/marker.d.ts +28 -0
  606. package/dist/wizard/lib/marker.js +79 -0
  607. package/dist/wizard/lib/migrator.d.ts +35 -0
  608. package/dist/wizard/lib/migrator.js +190 -0
  609. package/dist/wizard/lib/natural-language-deploy.d.ts +30 -0
  610. package/dist/wizard/lib/natural-language-deploy.js +186 -0
  611. package/dist/wizard/lib/network.d.ts +22 -0
  612. package/dist/wizard/lib/network.js +72 -0
  613. package/dist/wizard/lib/oauth-core.d.ts +6 -0
  614. package/dist/wizard/lib/oauth-core.js +5 -0
  615. package/dist/wizard/lib/open-browser.d.ts +1 -0
  616. package/dist/wizard/lib/open-browser.js +26 -0
  617. package/dist/wizard/lib/patterns/ad-billing-adapter.d.ts +209 -0
  618. package/dist/wizard/lib/patterns/ad-billing-adapter.js +269 -0
  619. package/dist/wizard/lib/patterns/ad-platform-adapter.d.ts +200 -0
  620. package/dist/wizard/lib/patterns/ad-platform-adapter.js +212 -0
  621. package/dist/wizard/lib/patterns/daemon-process.d.ts +88 -0
  622. package/dist/wizard/lib/patterns/daemon-process.js +271 -0
  623. package/dist/wizard/lib/patterns/financial-transaction.d.ts +171 -0
  624. package/dist/wizard/lib/patterns/financial-transaction.js +154 -0
  625. package/dist/wizard/lib/patterns/funding-plan.d.ts +136 -0
  626. package/dist/wizard/lib/patterns/funding-plan.js +200 -0
  627. package/dist/wizard/lib/patterns/oauth-token-lifecycle.d.ts +94 -0
  628. package/dist/wizard/lib/patterns/oauth-token-lifecycle.js +139 -0
  629. package/dist/wizard/lib/patterns/outbound-rate-limiter.d.ts +67 -0
  630. package/dist/wizard/lib/patterns/outbound-rate-limiter.js +216 -0
  631. package/dist/wizard/lib/patterns/revenue-source-adapter.d.ts +96 -0
  632. package/dist/wizard/lib/patterns/revenue-source-adapter.js +182 -0
  633. package/dist/wizard/lib/patterns/stablecoin-adapter.d.ts +218 -0
  634. package/dist/wizard/lib/patterns/stablecoin-adapter.js +264 -0
  635. package/dist/wizard/lib/prd-validator.d.ts +39 -0
  636. package/dist/wizard/lib/prd-validator.js +137 -0
  637. package/dist/wizard/lib/project-init.d.ts +24 -0
  638. package/dist/wizard/lib/project-init.js +228 -0
  639. package/dist/wizard/lib/project-registry.d.ts +86 -0
  640. package/dist/wizard/lib/project-registry.js +359 -0
  641. package/dist/wizard/lib/project-scope.d.ts +64 -0
  642. package/dist/wizard/lib/project-scope.js +96 -0
  643. package/dist/wizard/lib/project-vault.d.ts +47 -0
  644. package/dist/wizard/lib/project-vault.js +221 -0
  645. package/dist/wizard/lib/provision-manifest.d.ts +44 -0
  646. package/dist/wizard/lib/provision-manifest.js +164 -0
  647. package/dist/wizard/lib/provisioner-registry.d.ts +15 -0
  648. package/dist/wizard/lib/provisioner-registry.js +34 -0
  649. package/dist/wizard/lib/provisioners/aws-config.d.ts +36 -0
  650. package/dist/wizard/lib/provisioners/aws-config.js +56 -0
  651. package/dist/wizard/lib/provisioners/aws-ec2.d.ts +19 -0
  652. package/dist/wizard/lib/provisioners/aws-ec2.js +241 -0
  653. package/dist/wizard/lib/provisioners/aws-rds.d.ts +10 -0
  654. package/dist/wizard/lib/provisioners/aws-rds.js +199 -0
  655. package/dist/wizard/lib/provisioners/aws-vps.d.ts +6 -0
  656. package/dist/wizard/lib/provisioners/aws-vps.js +231 -0
  657. package/dist/wizard/lib/provisioners/cloudflare.d.ts +6 -0
  658. package/dist/wizard/lib/provisioners/cloudflare.js +300 -0
  659. package/dist/wizard/lib/provisioners/docker.d.ts +6 -0
  660. package/dist/wizard/lib/provisioners/docker.js +75 -0
  661. package/dist/wizard/lib/provisioners/http-client.d.ts +20 -0
  662. package/dist/wizard/lib/provisioners/http-client.js +79 -0
  663. package/dist/wizard/lib/provisioners/railway-config.d.ts +24 -0
  664. package/dist/wizard/lib/provisioners/railway-config.js +220 -0
  665. package/dist/wizard/lib/provisioners/railway-deploy.d.ts +19 -0
  666. package/dist/wizard/lib/provisioners/railway-deploy.js +205 -0
  667. package/dist/wizard/lib/provisioners/railway.d.ts +6 -0
  668. package/dist/wizard/lib/provisioners/railway.js +45 -0
  669. package/dist/wizard/lib/provisioners/scripts/caddyfile.d.ts +10 -0
  670. package/dist/wizard/lib/provisioners/scripts/caddyfile.js +54 -0
  671. package/dist/wizard/lib/provisioners/scripts/deploy-vps.d.ts +10 -0
  672. package/dist/wizard/lib/provisioners/scripts/deploy-vps.js +112 -0
  673. package/dist/wizard/lib/provisioners/scripts/docker-compose.d.ts +11 -0
  674. package/dist/wizard/lib/provisioners/scripts/docker-compose.js +91 -0
  675. package/dist/wizard/lib/provisioners/scripts/dockerfile.d.ts +5 -0
  676. package/dist/wizard/lib/provisioners/scripts/dockerfile.js +185 -0
  677. package/dist/wizard/lib/provisioners/scripts/ecosystem-config.d.ts +10 -0
  678. package/dist/wizard/lib/provisioners/scripts/ecosystem-config.js +36 -0
  679. package/dist/wizard/lib/provisioners/scripts/provision-vps.d.ts +14 -0
  680. package/dist/wizard/lib/provisioners/scripts/provision-vps.js +202 -0
  681. package/dist/wizard/lib/provisioners/scripts/rollback-vps.d.ts +10 -0
  682. package/dist/wizard/lib/provisioners/scripts/rollback-vps.js +67 -0
  683. package/dist/wizard/lib/provisioners/self-deploy.d.ts +41 -0
  684. package/dist/wizard/lib/provisioners/self-deploy.js +185 -0
  685. package/dist/wizard/lib/provisioners/static-s3.d.ts +6 -0
  686. package/dist/wizard/lib/provisioners/static-s3.js +235 -0
  687. package/dist/wizard/lib/provisioners/types.d.ts +40 -0
  688. package/dist/wizard/lib/provisioners/types.js +4 -0
  689. package/dist/wizard/lib/provisioners/vercel.d.ts +6 -0
  690. package/dist/wizard/lib/provisioners/vercel.js +287 -0
  691. package/dist/wizard/lib/pty-manager.d.ts +42 -0
  692. package/dist/wizard/lib/pty-manager.js +244 -0
  693. package/dist/wizard/lib/rate-limiter-core.d.ts +5 -0
  694. package/dist/wizard/lib/rate-limiter-core.js +5 -0
  695. package/dist/wizard/lib/reconciliation.d.ts +43 -0
  696. package/dist/wizard/lib/reconciliation.js +173 -0
  697. package/dist/wizard/lib/revenue-types.d.ts +5 -0
  698. package/dist/wizard/lib/revenue-types.js +1 -0
  699. package/dist/wizard/lib/route-optimizer.d.ts +28 -0
  700. package/dist/wizard/lib/route-optimizer.js +93 -0
  701. package/dist/wizard/lib/s3-deploy.d.ts +19 -0
  702. package/dist/wizard/lib/s3-deploy.js +156 -0
  703. package/dist/wizard/lib/safety-tiers.d.ts +76 -0
  704. package/dist/wizard/lib/safety-tiers.js +134 -0
  705. package/dist/wizard/lib/sentry-generator.d.ts +15 -0
  706. package/dist/wizard/lib/sentry-generator.js +116 -0
  707. package/dist/wizard/lib/server-config.d.ts +13 -0
  708. package/dist/wizard/lib/server-config.js +23 -0
  709. package/dist/wizard/lib/service-install.d.ts +18 -0
  710. package/dist/wizard/lib/service-install.js +182 -0
  711. package/dist/wizard/lib/site-scanner.d.ts +80 -0
  712. package/dist/wizard/lib/site-scanner.js +262 -0
  713. package/dist/wizard/lib/ssh-deploy.d.ts +25 -0
  714. package/dist/wizard/lib/ssh-deploy.js +225 -0
  715. package/dist/wizard/lib/templates.d.ts +24 -0
  716. package/dist/wizard/lib/templates.js +219 -0
  717. package/dist/wizard/lib/totp.d.ts +35 -0
  718. package/dist/wizard/lib/totp.js +277 -0
  719. package/dist/wizard/lib/tower-auth.d.ts +43 -0
  720. package/dist/wizard/lib/tower-auth.js +352 -0
  721. package/dist/wizard/lib/tower-rate-limit.d.ts +14 -0
  722. package/dist/wizard/lib/tower-rate-limit.js +61 -0
  723. package/dist/wizard/lib/tower-session.d.ts +28 -0
  724. package/dist/wizard/lib/tower-session.js +119 -0
  725. package/dist/wizard/lib/treasury-backup.d.ts +23 -0
  726. package/dist/wizard/lib/treasury-backup.js +127 -0
  727. package/dist/wizard/lib/treasury-circuit-breakers.d.ts +28 -0
  728. package/dist/wizard/lib/treasury-circuit-breakers.js +74 -0
  729. package/dist/wizard/lib/treasury-handlers.d.ts +21 -0
  730. package/dist/wizard/lib/treasury-handlers.js +281 -0
  731. package/dist/wizard/lib/treasury-heartbeat.d.ts +18 -0
  732. package/dist/wizard/lib/treasury-heartbeat.js +20 -0
  733. package/dist/wizard/lib/treasury-io.d.ts +107 -0
  734. package/dist/wizard/lib/treasury-io.js +254 -0
  735. package/dist/wizard/lib/treasury-jobs.d.ts +14 -0
  736. package/dist/wizard/lib/treasury-jobs.js +589 -0
  737. package/dist/wizard/lib/treasury-migrator.d.ts +59 -0
  738. package/dist/wizard/lib/treasury-migrator.js +227 -0
  739. package/dist/wizard/lib/treasury-reader.d.ts +52 -0
  740. package/dist/wizard/lib/treasury-reader.js +235 -0
  741. package/dist/wizard/lib/updater.d.ts +29 -0
  742. package/dist/wizard/lib/updater.js +203 -0
  743. package/dist/wizard/lib/user-manager.d.ts +39 -0
  744. package/dist/wizard/lib/user-manager.js +182 -0
  745. package/dist/wizard/lib/vault.d.ts +26 -0
  746. package/dist/wizard/lib/vault.js +161 -0
  747. package/dist/wizard/router.d.ts +12 -0
  748. package/dist/wizard/router.js +58 -0
  749. package/dist/wizard/server.d.ts +18 -0
  750. package/dist/wizard/server.js +427 -0
  751. package/dist/wizard/ui/app.js +1357 -0
  752. package/dist/wizard/ui/danger-room-prophecy.js +217 -0
  753. package/dist/wizard/ui/danger-room.html +27 -0
  754. package/dist/wizard/ui/danger-room.js +29 -0
  755. package/dist/wizard/ui/deploy.html +181 -0
  756. package/dist/wizard/ui/deploy.js +616 -0
  757. package/dist/wizard/ui/favicon.svg +11 -0
  758. package/dist/wizard/ui/index.html +407 -0
  759. package/dist/wizard/ui/lobby.html +235 -0
  760. package/dist/wizard/ui/lobby.js +843 -0
  761. package/dist/wizard/ui/login.html +111 -0
  762. package/dist/wizard/ui/login.js +199 -0
  763. package/dist/wizard/ui/project.html +285 -0
  764. package/dist/wizard/ui/project.js +324 -0
  765. package/dist/wizard/ui/rollback.js +107 -0
  766. package/dist/wizard/ui/styles.css +1040 -0
  767. package/dist/wizard/ui/tower.html +177 -0
  768. package/dist/wizard/ui/tower.js +445 -0
  769. package/dist/wizard/ui/war-room-prophecy.js +217 -0
  770. package/dist/wizard/ui/war-room.html +27 -0
  771. package/dist/wizard/ui/war-room.js +29 -0
  772. package/package.json +60 -0
@@ -0,0 +1,538 @@
1
+ /**
2
+ * Heartbeat Daemon — The single-writer for all financial state (ADR-1).
3
+ *
4
+ * This module implements the heartbeat daemon: a background Node.js process
5
+ * that owns all financial state mutations. The CLI and Danger Room are clients
6
+ * that communicate via the Unix domain socket API.
7
+ *
8
+ * PRD Reference: §9.7, §9.18, §9.19.2, §9.20.4, §9.20.11
9
+ *
10
+ * Structure (v23.2 split):
11
+ * heartbeat.ts — daemon entry point, state, request handling, orchestration
12
+ * heartbeat-lifecycle.ts — daemon startup/shutdown, WAL, campaign persistence types
13
+ * heartbeat-scheduler.ts — scheduled job definitions
14
+ */
15
+ import { join } from 'node:path';
16
+ import { homedir } from 'node:os';
17
+ import { existsSync } from 'node:fs';
18
+ import { readFile, mkdir } from 'node:fs/promises';
19
+ import { writeState, JobScheduler, createLogger, } from './daemon-core.js';
20
+ import { financialVaultLock, financialVaultUnlock } from './financial-vault.js';
21
+ import { totpVerify, totpSessionInvalidate } from './totp.js';
22
+ import { classifyTier } from './safety-tiers.js';
23
+ import { projectVaultLockAll } from './project-vault.js';
24
+ import { appendToLog, atomicWrite, getTreasuryDir, getSpendLog, getRevenueLog } from './financial-core.js';
25
+ import { TREASURY_SUMMARY_FILE, readTreasurySummaryFromLogs } from './treasury-reader.js';
26
+ import { registerTreasuryJobs, handleTreasuryRequest, executeTreasuryFreeze, getTreasuryStateSnapshot, isStablecoinConfigured, } from './treasury-heartbeat.js';
27
+ import { getCampaignAdapter } from './financial/adapter-factory.js';
28
+ import { transition } from './campaign-state-machine.js';
29
+ import { startDaemon, writePendingOp, getLastLogHash, validateCampaignId, } from './heartbeat-lifecycle.js';
30
+ import { registerJobs } from './heartbeat-scheduler.js';
31
+ const VOIDFORGE_DIR = join(homedir(), '.voidforge');
32
+ // ── Daemon State ──────────────────────────────────────
33
+ let daemonState = 'starting';
34
+ let vaultKey = null;
35
+ let sessionTokenState = null;
36
+ let eventId = 0;
37
+ const logger = createLogger(join(VOIDFORGE_DIR, 'heartbeat.log'));
38
+ const daemonStartedAt = new Date().toISOString();
39
+ let daemonProjectId = 'global';
40
+ let daemonProjectDir;
41
+ function activeTreasuryDir() { return getTreasuryDir(daemonProjectDir); }
42
+ function activeSpendLog() { return getSpendLog(daemonProjectDir); }
43
+ function activeRevenueLog() { return getRevenueLog(daemonProjectDir); }
44
+ function activeCampaignsDir() { return join(activeTreasuryDir(), 'campaigns'); }
45
+ const platformFailures = {};
46
+ const platformHealth = {};
47
+ // ── Campaign Persistence ─────────────────────────────
48
+ async function writeCampaignRecord(record) {
49
+ if (!validateCampaignId(record.campaignId)) {
50
+ throw new Error(`Invalid campaign ID format: ${record.campaignId.slice(0, 20)}`);
51
+ }
52
+ await mkdir(activeCampaignsDir(), { recursive: true });
53
+ await atomicWrite(join(activeCampaignsDir(), `${record.campaignId}.json`), JSON.stringify(record, null, 2));
54
+ }
55
+ async function readCampaignRecord(campaignId) {
56
+ if (!validateCampaignId(campaignId))
57
+ return null;
58
+ const filePath = join(activeCampaignsDir(), `${campaignId}.json`);
59
+ try {
60
+ return JSON.parse(await readFile(filePath, 'utf-8'));
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ }
66
+ async function getActiveCampaignRecords() {
67
+ return (await readCampaigns()).filter(c => c.status === 'active');
68
+ }
69
+ async function getSuspendedCampaignRecords() {
70
+ return (await readCampaigns()).filter(c => c.status === 'suspended');
71
+ }
72
+ // ── State Management ──────────────────────────────────
73
+ async function readCampaigns() {
74
+ try {
75
+ const { readdir } = await import('node:fs/promises');
76
+ if (!existsSync(activeCampaignsDir()))
77
+ return [];
78
+ const files = await readdir(activeCampaignsDir());
79
+ const campaigns = [];
80
+ for (const file of files) {
81
+ if (!file.endsWith('.json'))
82
+ continue;
83
+ try {
84
+ campaigns.push(JSON.parse(await readFile(join(activeCampaignsDir(), file), 'utf-8')));
85
+ }
86
+ catch { /* skip malformed */ }
87
+ }
88
+ return campaigns;
89
+ }
90
+ catch {
91
+ return [];
92
+ }
93
+ }
94
+ async function readTreasurySummary() {
95
+ try {
96
+ let totalSpendCents = 0;
97
+ let totalRevenueCents = 0;
98
+ if (existsSync(activeSpendLog())) {
99
+ for (const line of (await readFile(activeSpendLog(), 'utf-8')).trim().split('\n').filter(Boolean)) {
100
+ try {
101
+ totalSpendCents += Math.max(0, JSON.parse(line).amountCents ?? 0);
102
+ }
103
+ catch { /* skip */ }
104
+ }
105
+ }
106
+ if (existsSync(activeRevenueLog())) {
107
+ for (const line of (await readFile(activeRevenueLog(), 'utf-8')).trim().split('\n').filter(Boolean)) {
108
+ try {
109
+ totalRevenueCents += JSON.parse(line).amountCents ?? 0;
110
+ }
111
+ catch { /* skip */ }
112
+ }
113
+ }
114
+ const net = totalRevenueCents - totalSpendCents;
115
+ const roas = totalSpendCents > 0 ? totalRevenueCents / totalSpendCents : 0;
116
+ return { revenue: totalRevenueCents, spend: totalSpendCents, net, roas, budgetRemaining: 0 };
117
+ }
118
+ catch {
119
+ return { revenue: 0, spend: 0, net: 0, roas: 0, budgetRemaining: 0 };
120
+ }
121
+ }
122
+ async function buildStateSnapshot() {
123
+ const campaigns = await readCampaigns();
124
+ const activeCampaigns = campaigns.filter((c) => c.status === 'active').length;
125
+ const summary = await readTreasurySummary();
126
+ const treasurySnapshot = isStablecoinConfigured() ? getTreasuryStateSnapshot() : undefined;
127
+ const alerts = [];
128
+ if (treasurySnapshot?.fundingFrozen) {
129
+ alerts.push(`Funding frozen: ${treasurySnapshot.freezeReason ?? 'unknown reason'}`);
130
+ }
131
+ return {
132
+ pid: process.pid, state: daemonState, startedAt: daemonStartedAt,
133
+ lastHeartbeat: new Date().toISOString(), lastEventId: eventId,
134
+ cultivationState: daemonState === 'starting' ? 'inactive' : 'active',
135
+ activePlatforms: Object.keys(platformHealth), activeCampaigns,
136
+ todaySpend: summary.spend, dailyBudget: 0,
137
+ alerts, tokenHealth: platformHealth,
138
+ ...(treasurySnapshot ? {
139
+ stablecoinBalanceCents: treasurySnapshot.stablecoinBalanceCents,
140
+ bankBalanceCents: treasurySnapshot.bankBalanceCents,
141
+ runwayDays: treasurySnapshot.runwayDays,
142
+ fundingFrozen: treasurySnapshot.fundingFrozen,
143
+ pendingTransferCount: treasurySnapshot.pendingTransferCount,
144
+ } : {}),
145
+ };
146
+ }
147
+ async function writeCurrentState() {
148
+ await writeState(await buildStateSnapshot());
149
+ await writeTreasurySummaryFile();
150
+ }
151
+ async function writeTreasurySummaryFile() {
152
+ try {
153
+ const treasuryDir = activeTreasuryDir();
154
+ await mkdir(treasuryDir, { recursive: true });
155
+ const snap = isStablecoinConfigured() ? getTreasuryStateSnapshot() : null;
156
+ const hb = snap ? {
157
+ stablecoinBalanceCents: snap.stablecoinBalanceCents,
158
+ bankAvailableCents: snap.bankBalanceCents, bankReservedCents: 0,
159
+ runwayDays: snap.runwayDays,
160
+ fundingState: snap.fundingFrozen ? 'frozen'
161
+ : snap.runwayDays > 0 && snap.runwayDays < 7 ? 'degraded'
162
+ : snap.runwayDays > 0 ? 'healthy' : null,
163
+ nextTreasuryEvent: null,
164
+ } : undefined;
165
+ const summary = await readTreasurySummaryFromLogs(treasuryDir, hb);
166
+ await atomicWrite(join(treasuryDir, TREASURY_SUMMARY_FILE), JSON.stringify({ ...summary, timestamp: new Date().toISOString() }));
167
+ }
168
+ catch { /* Non-fatal — summary is a cache */ }
169
+ }
170
+ // ── Command Handlers ──────────────────────────────────
171
+ async function handleFreeze() {
172
+ logger.log('FREEZE command received — pausing all active campaigns');
173
+ const activeCampaigns = await getActiveCampaignRecords();
174
+ let pausedCount = 0;
175
+ const errors = [];
176
+ for (const campaign of activeCampaigns) {
177
+ try {
178
+ const adapter = await getCampaignAdapter(campaign.platform, vaultKey, logger);
179
+ await adapter.pauseCampaign(campaign.externalId);
180
+ campaign.status = transition(campaign.status, 'suspended', 'cli', 'freeze').newStatus;
181
+ campaign.updatedAt = new Date().toISOString();
182
+ await writeCampaignRecord(campaign);
183
+ pausedCount++;
184
+ }
185
+ catch (err) {
186
+ const msg = err instanceof Error ? err.message : String(err);
187
+ errors.push(`${campaign.campaignId}: ${msg}`);
188
+ logger.log(`Freeze: failed to pause campaign ${campaign.campaignId}: ${msg}`);
189
+ }
190
+ }
191
+ daemonState = 'degraded';
192
+ eventId++;
193
+ await writeCurrentState();
194
+ const allPaused = errors.length === 0;
195
+ logger.log(`Freeze complete: ${pausedCount}/${activeCampaigns.length} campaigns paused${allPaused ? '' : ` (${errors.length} failures)`}`);
196
+ return {
197
+ status: allPaused ? 200 : 207,
198
+ body: {
199
+ ok: allPaused,
200
+ message: allPaused ? `Freeze complete: ${pausedCount} campaigns paused`
201
+ : `Freeze partial: ${pausedCount}/${activeCampaigns.length} campaigns paused, ${errors.length} failed`,
202
+ pausedCount, totalCampaigns: activeCampaigns.length,
203
+ errors: errors.length > 0 ? errors : undefined,
204
+ },
205
+ };
206
+ }
207
+ async function handleUnfreeze() {
208
+ logger.log('UNFREEZE command received — resuming suspended campaigns');
209
+ const suspended = await getSuspendedCampaignRecords();
210
+ let resumedCount = 0;
211
+ const errors = [];
212
+ for (const campaign of suspended) {
213
+ try {
214
+ const adapter = await getCampaignAdapter(campaign.platform, vaultKey, logger);
215
+ await adapter.resumeCampaign(campaign.externalId);
216
+ campaign.status = transition(campaign.status, 'active', 'cli', 'unfreeze').newStatus;
217
+ campaign.updatedAt = new Date().toISOString();
218
+ await writeCampaignRecord(campaign);
219
+ resumedCount++;
220
+ }
221
+ catch (err) {
222
+ const msg = err instanceof Error ? err.message : String(err);
223
+ errors.push(`${campaign.campaignId}: ${msg}`);
224
+ logger.log(`Unfreeze: failed to resume campaign ${campaign.campaignId}: ${msg}`);
225
+ }
226
+ }
227
+ daemonState = 'healthy';
228
+ eventId++;
229
+ await writeCurrentState();
230
+ logger.log(`Unfreeze complete: ${resumedCount}/${suspended.length} campaigns resumed`);
231
+ return { status: 200, body: { ok: true, message: `Spending resumed: ${resumedCount} campaigns unfrozen`, resumedCount, errors: errors.length > 0 ? errors : undefined } };
232
+ }
233
+ async function handleUnlock(body) {
234
+ if (!body.password)
235
+ return { status: 400, body: { ok: false, error: 'Password required' } };
236
+ const valid = await financialVaultUnlock(body.password);
237
+ if (!valid) {
238
+ logger.log('Vault unlock failed — wrong password');
239
+ return { status: 403, body: { ok: false, error: 'Invalid vault password' } };
240
+ }
241
+ vaultKey = body.password;
242
+ if (daemonState === 'degraded')
243
+ daemonState = 'healthy';
244
+ logger.log('Vault unlocked');
245
+ eventId++;
246
+ await writeCurrentState();
247
+ return { status: 200, body: { ok: true, message: 'Vault session renewed' } };
248
+ }
249
+ async function handleCampaignPause(id) {
250
+ logger.log(`Campaign ${id} pause requested`);
251
+ const record = await readCampaignRecord(id);
252
+ if (!record)
253
+ return { status: 404, body: { ok: false, error: `Campaign not found: ${id}` } };
254
+ try {
255
+ const adapter = await getCampaignAdapter(record.platform, vaultKey, logger);
256
+ await adapter.pauseCampaign(record.externalId);
257
+ record.status = transition(record.status, 'paused', 'cli', 'user_paused').newStatus;
258
+ record.updatedAt = new Date().toISOString();
259
+ await writeCampaignRecord(record);
260
+ eventId++;
261
+ await appendToLog(activeSpendLog(), { type: 'campaign_pause', campaignId: id, projectId: daemonProjectId, timestamp: record.updatedAt }, await getLastLogHash(activeSpendLog()));
262
+ logger.log(`Campaign ${id} paused on ${record.platform}`);
263
+ return { status: 200, body: { ok: true, campaignId: id, status: 'paused' } };
264
+ }
265
+ catch (err) {
266
+ const msg = err instanceof Error ? err.message : String(err);
267
+ logger.log(`Campaign ${id} pause failed: ${msg}`);
268
+ return { status: 500, body: { ok: false, error: `Pause failed: ${msg}` } };
269
+ }
270
+ }
271
+ async function handleCampaignResume(id) {
272
+ logger.log(`Campaign ${id} resume requested`);
273
+ const record = await readCampaignRecord(id);
274
+ if (!record)
275
+ return { status: 404, body: { ok: false, error: `Campaign not found: ${id}` } };
276
+ try {
277
+ const adapter = await getCampaignAdapter(record.platform, vaultKey, logger);
278
+ await adapter.resumeCampaign(record.externalId);
279
+ record.status = transition(record.status, 'active', 'cli', 'user_resumed').newStatus;
280
+ record.updatedAt = new Date().toISOString();
281
+ await writeCampaignRecord(record);
282
+ eventId++;
283
+ await appendToLog(activeSpendLog(), { type: 'campaign_resume', campaignId: id, projectId: daemonProjectId, timestamp: record.updatedAt }, await getLastLogHash(activeSpendLog()));
284
+ logger.log(`Campaign ${id} resumed on ${record.platform}`);
285
+ return { status: 200, body: { ok: true, campaignId: id, status: 'active' } };
286
+ }
287
+ catch (err) {
288
+ const msg = err instanceof Error ? err.message : String(err);
289
+ logger.log(`Campaign ${id} resume failed: ${msg}`);
290
+ return { status: 500, body: { ok: false, error: `Resume failed: ${msg}` } };
291
+ }
292
+ }
293
+ async function handleCampaignLaunch(body) {
294
+ logger.log('Campaign launch requested');
295
+ const config = body;
296
+ if (!config.name || !config.platform || !config.dailyBudgetCents || !config.idempotencyKey) {
297
+ return { status: 400, body: { ok: false, error: 'Missing required fields: name, platform, dailyBudgetCents, idempotencyKey' } };
298
+ }
299
+ if (!Number.isFinite(config.dailyBudgetCents) || config.dailyBudgetCents <= 0 || !Number.isInteger(config.dailyBudgetCents)) {
300
+ return { status: 400, body: { ok: false, error: 'dailyBudgetCents must be a positive integer' } };
301
+ }
302
+ const activeCampaigns = await getActiveCampaignRecords();
303
+ const aggregateDailySpend = activeCampaigns.reduce((sum, c) => (sum + (c.dailyBudgetCents || 0)), 0);
304
+ const tierResult = classifyTier(config.dailyBudgetCents, aggregateDailySpend);
305
+ if (tierResult.tier !== 'auto_approve') {
306
+ logger.log(`Campaign launch: budget $${(config.dailyBudgetCents / 100).toFixed(2)} + aggregate $${(aggregateDailySpend / 100).toFixed(2)}/day → ${tierResult.tier} (${tierResult.reason})`);
307
+ if (tierResult.requiresTotp)
308
+ return { status: 403, body: { ok: false, error: `Budget tier: ${tierResult.tier}. ${tierResult.reason}. Requires TOTP.` } };
309
+ }
310
+ try {
311
+ const adapter = await getCampaignAdapter(config.platform, vaultKey, logger);
312
+ const campaignConfig = {
313
+ name: config.name, platform: config.platform,
314
+ objective: config.objective ?? 'traffic',
315
+ dailyBudget: config.dailyBudgetCents,
316
+ targeting: config.targeting ?? { audiences: [], locations: [] },
317
+ creative: config.creative ?? { headlines: [], descriptions: [], callToAction: '', landingUrl: '' },
318
+ idempotencyKey: config.idempotencyKey, complianceStatus: 'passed',
319
+ };
320
+ await writePendingOp({ intentId: config.idempotencyKey, operation: 'campaign_launch', platform: config.platform, params: campaignConfig, status: 'pending', createdAt: new Date().toISOString() }, activeTreasuryDir());
321
+ const result = await adapter.createCampaign(campaignConfig);
322
+ const campaignId = config.idempotencyKey;
323
+ const now = new Date().toISOString();
324
+ const record = {
325
+ campaignId, externalId: result.externalId, platform: config.platform,
326
+ status: result.status === 'pending_review' ? 'pending_approval' : 'active',
327
+ name: config.name, dailyBudgetCents: config.dailyBudgetCents, createdAt: now, updatedAt: now,
328
+ };
329
+ await writeCampaignRecord(record);
330
+ await appendToLog(activeSpendLog(), { type: 'campaign_launch', campaignId, projectId: daemonProjectId, externalId: result.externalId, platform: config.platform, dailyBudgetCents: config.dailyBudgetCents, timestamp: now }, await getLastLogHash(activeSpendLog()));
331
+ eventId++;
332
+ logger.log(`Campaign launched: ${campaignId} → ${result.externalId} on ${config.platform} (status: ${record.status})`);
333
+ return { status: 200, body: { ok: true, campaignId, externalId: result.externalId, platform: config.platform, status: record.status, dashboardUrl: result.dashboardUrl } };
334
+ }
335
+ catch (err) {
336
+ const msg = err instanceof Error ? err.message : String(err);
337
+ logger.log(`Campaign launch failed: ${msg}`);
338
+ return { status: 500, body: { ok: false, error: `Launch failed: ${msg}` } };
339
+ }
340
+ }
341
+ async function handleBudgetChange(body) {
342
+ logger.log('Budget change requested');
343
+ const params = body;
344
+ if (!params.campaignId || params.newBudgetCents === undefined)
345
+ return { status: 400, body: { ok: false, error: 'Missing required fields: campaignId, newBudgetCents' } };
346
+ if (!Number.isFinite(params.newBudgetCents) || params.newBudgetCents <= 0 || !Number.isInteger(params.newBudgetCents))
347
+ return { status: 400, body: { ok: false, error: 'newBudgetCents must be a positive integer' } };
348
+ const activeBudgets = await getActiveCampaignRecords();
349
+ const currentAggregate = activeBudgets.reduce((sum, c) => (sum + (c.dailyBudgetCents || 0)), 0);
350
+ const tierResult = classifyTier(params.newBudgetCents, currentAggregate);
351
+ if (tierResult.requiresTotp)
352
+ return { status: 403, body: { ok: false, error: `Budget tier: ${tierResult.tier}. ${tierResult.reason}. Requires TOTP.` } };
353
+ await writePendingOp({ intentId: `budget_${params.campaignId}_${Date.now()}`, operation: 'budget_change', platform: 'unknown', params, status: 'pending', createdAt: new Date().toISOString() }, activeTreasuryDir());
354
+ const record = await readCampaignRecord(params.campaignId);
355
+ if (!record)
356
+ return { status: 404, body: { ok: false, error: `Campaign not found: ${params.campaignId}` } };
357
+ try {
358
+ const adapter = await getCampaignAdapter(record.platform, vaultKey, logger);
359
+ await adapter.updateBudget(record.externalId, params.newBudgetCents);
360
+ const oldBudget = record.dailyBudgetCents;
361
+ record.dailyBudgetCents = params.newBudgetCents;
362
+ record.updatedAt = new Date().toISOString();
363
+ await writeCampaignRecord(record);
364
+ await appendToLog(activeSpendLog(), { type: 'budget_change', campaignId: params.campaignId, projectId: daemonProjectId, oldBudgetCents: oldBudget, newBudgetCents: params.newBudgetCents, timestamp: record.updatedAt }, await getLastLogHash(activeSpendLog()));
365
+ eventId++;
366
+ logger.log(`Budget changed: ${params.campaignId} $${(oldBudget / 100).toFixed(2)} → $${(params.newBudgetCents / 100).toFixed(2)}`);
367
+ return { status: 200, body: { ok: true, campaignId: params.campaignId, newBudgetCents: params.newBudgetCents } };
368
+ }
369
+ catch (err) {
370
+ const msg = err instanceof Error ? err.message : String(err);
371
+ logger.log(`Budget change failed: ${msg}`);
372
+ return { status: 500, body: { ok: false, error: `Budget change failed: ${msg}` } };
373
+ }
374
+ }
375
+ async function handleCreativeUpdate(id, body) {
376
+ logger.log(`Creative update for campaign ${id}`);
377
+ const record = await readCampaignRecord(id);
378
+ if (!record)
379
+ return { status: 404, body: { ok: false, error: `Campaign not found: ${id}` } };
380
+ const creative = body;
381
+ try {
382
+ const adapter = await getCampaignAdapter(record.platform, vaultKey, logger);
383
+ await adapter.updateCreative(record.externalId, creative);
384
+ record.updatedAt = new Date().toISOString();
385
+ await writeCampaignRecord(record);
386
+ eventId++;
387
+ logger.log(`Creative updated for campaign ${id} on ${record.platform}`);
388
+ return { status: 200, body: { ok: true, campaignId: id, message: 'Creative updated' } };
389
+ }
390
+ catch (err) {
391
+ const msg = err instanceof Error ? err.message : String(err);
392
+ logger.log(`Creative update failed for ${id}: ${msg}`);
393
+ return { status: 500, body: { ok: false, error: `Creative update failed: ${msg}` } };
394
+ }
395
+ }
396
+ async function handleReconcile() {
397
+ logger.log('Manual reconciliation requested');
398
+ eventId++;
399
+ try {
400
+ const { runReconciliation } = await import('./reconciliation.js');
401
+ const today = new Date().toISOString().slice(0, 10);
402
+ const hour = new Date().getUTCHours();
403
+ const type = hour >= 6 ? 'final' : 'preliminary';
404
+ const report = await runReconciliation('default', today, type, new Map(), new Map());
405
+ return { status: 200, body: { ok: true, message: `Reconciliation (${type}) completed`, report } };
406
+ }
407
+ catch (err) {
408
+ const message = err instanceof Error ? err.message : 'Reconciliation failed';
409
+ logger.log(`Reconciliation error: ${message}`);
410
+ return { status: 500, body: { ok: false, error: `Reconciliation failed: ${message}` } };
411
+ }
412
+ }
413
+ // ── Socket API Request Handler (§9.20.11) ─────────────
414
+ async function handleRequest(method, path, body, auth) {
415
+ if (!auth.hasToken)
416
+ return { status: 401, body: { ok: false, error: 'Session token required' } };
417
+ // SEC-001 + R4-MAUL-001: HMAC vault password comparison (constant-time)
418
+ let vaultVerified = false;
419
+ if (auth.vaultPassword && vaultKey) {
420
+ const { createHmac, timingSafeEqual } = await import('node:crypto');
421
+ const HMAC_KEY = 'voidforge-vault-password-comparison-v1';
422
+ const providedMac = createHmac('sha256', HMAC_KEY).update(auth.vaultPassword).digest();
423
+ const expectedMac = createHmac('sha256', HMAC_KEY).update(vaultKey).digest();
424
+ vaultVerified = timingSafeEqual(providedMac, expectedMac);
425
+ }
426
+ let totpVerified = false;
427
+ if (auth.totpCode) {
428
+ try {
429
+ totpVerified = await totpVerify(auth.totpCode);
430
+ }
431
+ catch { /* not configured */ }
432
+ }
433
+ // ── Treasury routes ──
434
+ const treasuryFreeze = async (reason) => {
435
+ await executeTreasuryFreeze(reason, logger);
436
+ daemonState = 'degraded';
437
+ eventId++;
438
+ await writeCurrentState();
439
+ };
440
+ if (path.startsWith('/treasury/')) {
441
+ const result = await handleTreasuryRequest(method, path, body, { vaultVerified, totpVerified }, logger, treasuryFreeze, vaultKey);
442
+ if (result) {
443
+ eventId++;
444
+ return result;
445
+ }
446
+ }
447
+ // ── GET ──
448
+ if (method === 'GET') {
449
+ if (path === '/status')
450
+ return { status: 200, body: { ok: true, data: await buildStateSnapshot() } };
451
+ if (path === '/campaigns')
452
+ return { status: 200, body: { ok: true, data: await readCampaigns() } };
453
+ if (path === '/treasury')
454
+ return { status: 200, body: { ok: true, data: await readTreasurySummary() } };
455
+ return { status: 404, body: { ok: false, error: 'Unknown endpoint' } };
456
+ }
457
+ // ── POST ──
458
+ if (method === 'POST') {
459
+ if (path === '/freeze')
460
+ return await handleFreeze();
461
+ if (path === '/unfreeze') {
462
+ if (!vaultVerified || !totpVerified)
463
+ return { status: 403, body: { ok: false, error: 'Unfreeze requires valid vault password + TOTP code' } };
464
+ return await handleUnfreeze();
465
+ }
466
+ if (path === '/unlock')
467
+ return await handleUnlock(body);
468
+ if (path.match(/^\/campaigns\/[^/]+\/pause$/))
469
+ return await handleCampaignPause(path.split('/')[2]);
470
+ if (path.match(/^\/campaigns\/[^/]+\/creative$/))
471
+ return await handleCreativeUpdate(path.split('/')[2], body);
472
+ if (path.match(/^\/campaigns\/[^/]+\/resume$/)) {
473
+ if (!vaultVerified)
474
+ return { status: 403, body: { ok: false, error: 'Resume requires valid vault password' } };
475
+ return await handleCampaignResume(path.split('/')[2]);
476
+ }
477
+ if (path === '/campaigns/launch') {
478
+ if (!vaultVerified)
479
+ return { status: 403, body: { ok: false, error: 'Campaign launch requires valid vault password' } };
480
+ return await handleCampaignLaunch(body);
481
+ }
482
+ if (path === '/budget') {
483
+ if (!vaultVerified)
484
+ return { status: 403, body: { ok: false, error: 'Budget changes require valid vault password' } };
485
+ return await handleBudgetChange(body);
486
+ }
487
+ if (path === '/reconcile')
488
+ return await handleReconcile();
489
+ return { status: 404, body: { ok: false, error: 'Unknown endpoint' } };
490
+ }
491
+ return { status: 405, body: { ok: false, error: 'Method not allowed' } };
492
+ }
493
+ // ── Main Entry Point ──────────────────────────────────
494
+ export async function startHeartbeat(vaultPassword) {
495
+ const { server: _server } = await startDaemon(vaultPassword, {
496
+ logger,
497
+ getDaemonState: () => daemonState,
498
+ setDaemonState: (s) => { daemonState = s; },
499
+ setVaultKey: (k) => { vaultKey = k; },
500
+ setSessionTokenState: (s) => { sessionTokenState = s; },
501
+ getDaemonProjectDir: () => daemonProjectDir,
502
+ writeCurrentState,
503
+ onShutdown: async () => {
504
+ logger.log('Shutting down gracefully');
505
+ daemonState = 'shutting_down';
506
+ await writeCurrentState();
507
+ financialVaultLock();
508
+ projectVaultLockAll();
509
+ totpSessionInvalidate();
510
+ logger.close();
511
+ },
512
+ handleRequest,
513
+ activeTreasuryDir,
514
+ });
515
+ // Start job scheduler
516
+ const scheduler = new JobScheduler();
517
+ registerJobs(scheduler, {
518
+ logger, get vaultKey() { return vaultKey; },
519
+ activeTreasuryDir, writeCurrentState, readCampaigns, readTreasurySummary,
520
+ }, platformHealth, platformFailures);
521
+ // Register treasury heartbeat jobs
522
+ const treasuryFreeze = async (reason) => {
523
+ await executeTreasuryFreeze(reason, logger);
524
+ daemonState = 'degraded';
525
+ eventId++;
526
+ await writeCurrentState();
527
+ };
528
+ registerTreasuryJobs(scheduler, logger, writeCurrentState, treasuryFreeze, vaultKey);
529
+ scheduler.start();
530
+ // Transition to healthy
531
+ daemonState = daemonState === 'recovering' ? 'degraded' : 'healthy';
532
+ await writeCurrentState();
533
+ logger.log(`Heartbeat daemon running (PID ${process.pid}, state: ${daemonState})`);
534
+ }
535
+ // SEC-007: vaultKey is NOT exported
536
+ function setDaemonProjectId(id) { daemonProjectId = id; }
537
+ function setDaemonProjectDir(dir) { daemonProjectDir = dir; }
538
+ export { daemonState, readCampaigns, readTreasurySummary, setDaemonProjectId, setDaemonProjectDir };
@@ -0,0 +1,28 @@
1
+ /**
2
+ * The Herald — intelligent agent dispatch via Haiku pre-scan.
3
+ *
4
+ * Before every major slash command, a single Haiku call selects the optimal
5
+ * agent roster from all agents based on the current context. ADR-048.
6
+ */
7
+ export interface HeraldInput {
8
+ command: string;
9
+ userArgs: string;
10
+ focus?: string;
11
+ fileTree: string[];
12
+ prdFrontmatter?: string;
13
+ gitDiffSummary?: string;
14
+ }
15
+ export interface AgentEntry {
16
+ id: string;
17
+ name: string;
18
+ description: string;
19
+ model: string;
20
+ tags?: string[];
21
+ }
22
+ export interface HeraldResult {
23
+ roster: string[];
24
+ reasoning: string;
25
+ estimatedAgents: number;
26
+ }
27
+ export declare function runHerald(input: HeraldInput, agents: AgentEntry[]): Promise<HeraldResult>;
28
+ export declare function gatherHeraldContext(commandName: string, userArgs: string, focus?: string): Promise<HeraldInput>;