genesis-ai-cli 13.6.0 → 13.7.0

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/.env.example CHANGED
@@ -117,3 +117,30 @@ NEO4J_DATABASE=neo4j
117
117
  # v7.24: slack-mcp-server requires XOXP tokens (user OAuth) not bot tokens
118
118
  # Generate from: api.slack.com/apps → OAuth & Permissions → User OAuth Token
119
119
  SLACK_MCP_XOXP_TOKEN=xoxe.xoxp-...
120
+
121
+ # ============================================================================
122
+ # v16.0 - LIVE ECONOMY (Real Money Operations)
123
+ # ============================================================================
124
+
125
+ # Base L2 wallet private key (REQUIRED for live economy)
126
+ # Generate: node -e "console.log('0x'+require('crypto').randomBytes(32).toString('hex'))"
127
+ # Fund with ETH (gas) + USDC (operations) on Base L2
128
+ GENESIS_PRIVATE_KEY=0x...
129
+
130
+ # Network: 'mainnet' or 'testnet' (Base Sepolia)
131
+ GENESIS_NETWORK=testnet
132
+
133
+ # Custom RPC (optional, defaults to public Base RPC)
134
+ GENESIS_RPC_URL=
135
+
136
+ # State persistence directory (default: ~/.genesis)
137
+ GENESIS_STATE_DIR=
138
+
139
+ # Controller cycle interval ms (default: 60000)
140
+ GENESIS_CYCLE_INTERVAL=60000
141
+
142
+ # Safety: max drawdown before circuit breaker (default: 0.20)
143
+ GENESIS_MAX_DRAWDOWN=0.20
144
+
145
+ # Safety: daily spending limit USD (default: 100)
146
+ GENESIS_DAILY_LIMIT=100
@@ -212,6 +212,30 @@ export interface ProcessContext {
212
212
  attentionFocus?: string;
213
213
  mode?: string;
214
214
  };
215
+ /** Neuromodulatory tone (hormonal analog) */
216
+ neuromodulation?: {
217
+ dopamine: number;
218
+ serotonin: number;
219
+ norepinephrine: number;
220
+ cortisol: number;
221
+ explorationRate: number;
222
+ riskTolerance: number;
223
+ processingDepth: number;
224
+ learningRate: number;
225
+ };
226
+ /** Current emotional valence from limbic evaluation */
227
+ feeling?: {
228
+ valence: number;
229
+ arousal: number;
230
+ category: string;
231
+ };
232
+ /** Allostatic interoceptive state (resource awareness) */
233
+ allostasis?: {
234
+ energy: number;
235
+ load: number;
236
+ memoryPressure: number;
237
+ errorRate: number;
238
+ };
215
239
  /** Additional metadata from the caller */
216
240
  metadata?: Record<string, unknown>;
217
241
  }
@@ -40,6 +40,7 @@ import { type AllocationState } from './capital-allocator.js';
40
40
  export interface AutonomousConfig {
41
41
  seedCapital: number;
42
42
  cycleIntervalMs: number;
43
+ liveMode: boolean;
43
44
  nessTarget: {
44
45
  monthlyRevenue: number;
45
46
  monthlyCosts: number;
@@ -57,6 +57,10 @@ const yield_optimizer_js_1 = require("./assets/yield-optimizer.js");
57
57
  const compute_provider_js_1 = require("./assets/compute-provider.js");
58
58
  const grants_js_1 = require("./multipliers/grants.js");
59
59
  const cross_l2_arb_js_1 = require("./multipliers/cross-l2-arb.js");
60
+ const dework_js_1 = require("./live/connectors/dework.js");
61
+ const defi_js_1 = require("./live/connectors/defi.js");
62
+ const cloudflare_js_1 = require("./live/connectors/cloudflare.js");
63
+ const boot_js_1 = require("./live/boot.js");
60
64
  // ============================================================================
61
65
  // Activity Registry
62
66
  // ============================================================================
@@ -258,6 +262,7 @@ class AutonomousController {
258
262
  this.config = {
259
263
  seedCapital: config?.seedCapital ?? 2000,
260
264
  cycleIntervalMs: config?.cycleIntervalMs ?? 60000, // 1 minute
265
+ liveMode: config?.liveMode ?? false,
261
266
  nessTarget: config?.nessTarget ?? {
262
267
  monthlyRevenue: 2500,
263
268
  monthlyCosts: 150,
@@ -643,6 +648,31 @@ class AutonomousController {
643
648
  async executeActivity(activityId) {
644
649
  switch (activityId) {
645
650
  case 'keeper': {
651
+ if (this.config.liveMode || (0, boot_js_1.isLive)()) {
652
+ // LIVE: Check wallet has gas before keeper operations
653
+ const { getLiveWallet } = await import('./live/wallet.js');
654
+ try {
655
+ const wallet = getLiveWallet();
656
+ const balances = await wallet.getBalances();
657
+ if (balances.eth === 0n) {
658
+ console.log('[Live] Keeper: No ETH for gas, skipping');
659
+ return null;
660
+ }
661
+ // Execute keeper with real wallet
662
+ const keeper = (0, keeper_js_1.getKeeperExecutor)();
663
+ if (!keeper.isOperational())
664
+ return null;
665
+ const exec = await keeper.executeNext();
666
+ if (exec?.success) {
667
+ return { id: activityId, revenue: exec.reward, cost: exec.gasCost };
668
+ }
669
+ }
670
+ catch (e) {
671
+ console.warn('[Live] Keeper error:', e);
672
+ }
673
+ return null;
674
+ }
675
+ // SIMULATED
646
676
  const keeper = (0, keeper_js_1.getKeeperExecutor)();
647
677
  if (!keeper.isOperational())
648
678
  return null;
@@ -653,29 +683,58 @@ class AutonomousController {
653
683
  return null;
654
684
  }
655
685
  case 'bounty-hunter': {
686
+ if (this.config.liveMode || (0, boot_js_1.isLive)()) {
687
+ // LIVE: Use real DeWork API
688
+ const dework = (0, dework_js_1.getDeworkConnector)();
689
+ const bounties = await dework.scanBounties(['solidity', 'typescript', 'smart-contract', 'ai']);
690
+ // Check payouts on previously claimed bounties
691
+ let revenue = 0;
692
+ for (const b of bounties.filter(b => b.status === 'completed')) {
693
+ const payout = await dework.getPayoutStatus(b.id);
694
+ if (payout.paid) {
695
+ revenue += b.reward;
696
+ }
697
+ }
698
+ // Report discovered opportunities (bounties are worked asynchronously)
699
+ const viable = bounties.filter(b => b.reward >= 50 && b.status === 'open');
700
+ if (viable.length > 0) {
701
+ console.log(`[Live] Found ${viable.length} viable bounties, best: $${viable[0].reward}`);
702
+ }
703
+ return revenue > 0 ? { id: activityId, revenue, cost: 0 } : null;
704
+ }
705
+ // SIMULATED: Use internal bounty hunter
656
706
  const hunter = (0, bounty_hunter_js_1.getBountyHunter)();
657
- // Scan for new bounties if needed
658
707
  if (hunter.needsScan()) {
659
708
  await hunter.scan();
660
709
  }
661
- // Check for payouts on submitted bounties
662
710
  const payouts = await hunter.checkPayouts();
663
711
  const revenue = payouts
664
712
  .filter(p => p.status === 'accepted')
665
713
  .reduce((s, p) => s + (p.payout ?? 0), 0);
666
- // Try to claim and work on a new bounty
667
714
  const best = hunter.selectBest();
668
715
  if (best) {
669
716
  await hunter.claim(best.id);
670
- // Bounty work is async - will be submitted in future cycles
671
717
  }
672
718
  return revenue > 0 ? { id: activityId, revenue, cost: 0.10 } : null;
673
719
  }
674
720
  case 'mcp-marketplace': {
721
+ if (this.config.liveMode || (0, boot_js_1.isLive)()) {
722
+ // LIVE: Check Cloudflare Worker stats for real revenue
723
+ const cf = (0, cloudflare_js_1.getCloudflareConnector)();
724
+ if (cf.isConfigured()) {
725
+ const stats = await cf.getWorkerStats('genesis-defi-scanner');
726
+ if (stats && stats.requests > 0) {
727
+ // Revenue = requests × price per call ($0.005)
728
+ const revenue = stats.requests * 0.005;
729
+ console.log(`[Live] MCP marketplace: ${stats.requests} requests, $${revenue.toFixed(4)} revenue`);
730
+ return { id: activityId, revenue, cost: 0 };
731
+ }
732
+ }
733
+ return null;
734
+ }
735
+ // SIMULATED
675
736
  const marketplace = (0, mcp_marketplace_js_1.getMCPMarketplace)();
676
737
  const stats = marketplace.getStats();
677
- // Revenue is recorded in real-time via handleCall
678
- // Here we just report accumulated daily revenue
679
738
  return stats.totalRevenue > 0
680
739
  ? { id: activityId, revenue: stats.totalRevenue, cost: 0 }
681
740
  : null;
@@ -739,14 +798,24 @@ class AutonomousController {
739
798
  : null;
740
799
  }
741
800
  case 'yield-optimizer': {
801
+ if (this.config.liveMode || (0, boot_js_1.isLive)()) {
802
+ // LIVE: Use DeFiLlama to scan real yields on Base
803
+ const defi = (0, defi_js_1.getDefiConnector)();
804
+ const pools = await defi.scanYields('base');
805
+ if (pools.length > 0) {
806
+ const bestPool = pools.reduce((best, p) => p.apy > best.apy ? p : best, pools[0]);
807
+ console.log(`[Live] Yield scan: ${pools.length} pools, best: ${bestPool.protocol} @ ${bestPool.apy.toFixed(1)}% APY`);
808
+ // In live mode, yield is harvested from on-chain positions
809
+ // For now, report discovered opportunities (actual deployment requires wallet tx)
810
+ }
811
+ return null; // Revenue comes from on-chain harvest, not scanning
812
+ }
813
+ // SIMULATED
742
814
  const optimizer = (0, yield_optimizer_js_1.getYieldOptimizer)();
743
- // Scan for opportunities periodically
744
815
  await optimizer.scanOpportunities();
745
- // Rebalance if needed
746
816
  if (optimizer.needsRebalance()) {
747
817
  await optimizer.rebalance();
748
818
  }
749
- // Harvest yields
750
819
  const harvested = await optimizer.harvest();
751
820
  const yieldStats = optimizer.getStats();
752
821
  return harvested > 0
@@ -135,3 +135,5 @@ export { KeeperExecutor, getKeeperExecutor, resetKeeperExecutor, BountyHunter, g
135
135
  export { MCPMarketplace, getMCPMarketplace, resetMCPMarketplace, X402Facilitator, getX402Facilitator, resetX402Facilitator, MemoryService, getMemoryService, resetMemoryService, MetaOrchestrator, getMetaOrchestrator, resetMetaOrchestrator, } from './infrastructure/index.js';
136
136
  export { YieldOptimizer, getYieldOptimizer, resetYieldOptimizer, ComputeProvider, getComputeProvider, resetComputeProvider, } from './assets/index.js';
137
137
  export { GrantsManager, getGrantsManager, resetGrantsManager, CrossL2Arbitrageur, getCrossL2Arbitrageur, resetCrossL2Arbitrageur, } from './multipliers/index.js';
138
+ export { bootLiveEconomy, boot, isLive, getBootResult, getLiveWallet, resetWallet, getStatePersistence, resetStatePersistence, getDeworkConnector, getCloudflareConnector, getDefiConnector, } from './live/index.js';
139
+ export type { BootResult, LiveConfig, LiveWallet, PersistedState, DeworkConnector, Bounty as LiveBounty, CloudflareConnector, WorkerDeployment, WorkerStats, DefiConnector, YieldPool, } from './live/index.js';
@@ -11,7 +11,7 @@
11
11
  */
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
13
  exports.resetSmartContractAuditor = exports.getSmartContractAuditor = exports.SmartContractAuditor = exports.resetContentEngine = exports.getContentEngine = exports.ContentEngine = exports.resetBountyHunter = exports.getBountyHunter = exports.BountyHunter = exports.resetKeeperExecutor = exports.getKeeperExecutor = exports.KeeperExecutor = exports.RiskManager = exports.CovarianceStructure = exports.PrecisionWeightedEFE = exports.VariationalFreeEnergy = exports.resetVariationalEngine = exports.getVariationalEngine = exports.VariationalEngine = exports.TemporalPlanner = exports.AdaptiveTemperature = exports.MarketRegime = exports.ActivityBeliefs = exports.resetGenerativeModel = exports.getGenerativeModel = exports.GenerativeEconomicModel = exports.resetEconomicIntelligence = exports.getEconomicContraction = exports.EconomicContraction = exports.getEconomicEFE = exports.EconomicEFE = exports.getAutonomousNESS = exports.AutonomousNESS = exports.resetCapitalAllocator = exports.getCapitalAllocator = exports.CapitalAllocator = exports.resetAutonomousController = exports.getAutonomousController = exports.AutonomousController = exports.resetNESSMonitor = exports.getNESSMonitor = exports.NESSMonitor = exports.resetEconomicFiber = exports.getEconomicFiber = exports.EconomicFiber = exports.EconomicSystem = exports.BudgetManager = exports.X402Protocol = exports.CryptoWallet = exports.StripeTreasury = void 0;
14
- exports.resetCrossL2Arbitrageur = exports.getCrossL2Arbitrageur = exports.CrossL2Arbitrageur = exports.resetGrantsManager = exports.getGrantsManager = exports.GrantsManager = exports.resetComputeProvider = exports.getComputeProvider = exports.ComputeProvider = exports.resetYieldOptimizer = exports.getYieldOptimizer = exports.YieldOptimizer = exports.resetMetaOrchestrator = exports.getMetaOrchestrator = exports.MetaOrchestrator = exports.resetMemoryService = exports.getMemoryService = exports.MemoryService = exports.resetX402Facilitator = exports.getX402Facilitator = exports.X402Facilitator = exports.resetMCPMarketplace = exports.getMCPMarketplace = exports.MCPMarketplace = void 0;
14
+ exports.getDefiConnector = exports.getCloudflareConnector = exports.getDeworkConnector = exports.resetStatePersistence = exports.getStatePersistence = exports.resetWallet = exports.getLiveWallet = exports.getBootResult = exports.isLive = exports.boot = exports.bootLiveEconomy = exports.resetCrossL2Arbitrageur = exports.getCrossL2Arbitrageur = exports.CrossL2Arbitrageur = exports.resetGrantsManager = exports.getGrantsManager = exports.GrantsManager = exports.resetComputeProvider = exports.getComputeProvider = exports.ComputeProvider = exports.resetYieldOptimizer = exports.getYieldOptimizer = exports.YieldOptimizer = exports.resetMetaOrchestrator = exports.getMetaOrchestrator = exports.MetaOrchestrator = exports.resetMemoryService = exports.getMemoryService = exports.MemoryService = exports.resetX402Facilitator = exports.getX402Facilitator = exports.X402Facilitator = exports.resetMCPMarketplace = exports.getMCPMarketplace = exports.MCPMarketplace = void 0;
15
15
  exports.getEconomicSystem = getEconomicSystem;
16
16
  const index_js_1 = require("../mcp/index.js");
17
17
  // ============================================================================
@@ -455,3 +455,16 @@ Object.defineProperty(exports, "resetGrantsManager", { enumerable: true, get: fu
455
455
  Object.defineProperty(exports, "CrossL2Arbitrageur", { enumerable: true, get: function () { return index_js_5.CrossL2Arbitrageur; } });
456
456
  Object.defineProperty(exports, "getCrossL2Arbitrageur", { enumerable: true, get: function () { return index_js_5.getCrossL2Arbitrageur; } });
457
457
  Object.defineProperty(exports, "resetCrossL2Arbitrageur", { enumerable: true, get: function () { return index_js_5.resetCrossL2Arbitrageur; } });
458
+ // Live Economy Layer (v18 — Real Infrastructure)
459
+ var index_js_6 = require("./live/index.js");
460
+ Object.defineProperty(exports, "bootLiveEconomy", { enumerable: true, get: function () { return index_js_6.bootLiveEconomy; } });
461
+ Object.defineProperty(exports, "boot", { enumerable: true, get: function () { return index_js_6.boot; } });
462
+ Object.defineProperty(exports, "isLive", { enumerable: true, get: function () { return index_js_6.isLive; } });
463
+ Object.defineProperty(exports, "getBootResult", { enumerable: true, get: function () { return index_js_6.getBootResult; } });
464
+ Object.defineProperty(exports, "getLiveWallet", { enumerable: true, get: function () { return index_js_6.getLiveWallet; } });
465
+ Object.defineProperty(exports, "resetWallet", { enumerable: true, get: function () { return index_js_6.resetWallet; } });
466
+ Object.defineProperty(exports, "getStatePersistence", { enumerable: true, get: function () { return index_js_6.getStatePersistence; } });
467
+ Object.defineProperty(exports, "resetStatePersistence", { enumerable: true, get: function () { return index_js_6.resetStatePersistence; } });
468
+ Object.defineProperty(exports, "getDeworkConnector", { enumerable: true, get: function () { return index_js_6.getDeworkConnector; } });
469
+ Object.defineProperty(exports, "getCloudflareConnector", { enumerable: true, get: function () { return index_js_6.getCloudflareConnector; } });
470
+ Object.defineProperty(exports, "getDefiConnector", { enumerable: true, get: function () { return index_js_6.getDefiConnector; } });
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Live Economy Boot Sequence
3
+ *
4
+ * This is the REAL bootstrap — not simulated. It:
5
+ * 1. Loads .env configuration
6
+ * 2. Connects the wallet (Base L2)
7
+ * 3. Checks balances (ETH for gas, USDC for operations)
8
+ * 4. Loads persisted state (beliefs, allocations, revenue history)
9
+ * 5. Deploys MCP server to Cloudflare Workers (if not already deployed)
10
+ * 6. Starts the autonomous controller with live connectors
11
+ * 7. Enables auto-save for persistence
12
+ *
13
+ * Prerequisites:
14
+ * - GENESIS_PRIVATE_KEY in .env (funded Base L2 wallet)
15
+ * - CLOUDFLARE_API_TOKEN + CLOUDFLARE_ACCOUNT_ID for server deployment
16
+ * - Node 18+ for native fetch
17
+ */
18
+ export interface BootResult {
19
+ success: boolean;
20
+ wallet: {
21
+ address: string;
22
+ ethBalance: string;
23
+ usdcBalance: string;
24
+ network: string;
25
+ } | null;
26
+ stateLoaded: boolean;
27
+ cyclesRestored: number;
28
+ workerDeployed: boolean;
29
+ workerUrl: string | null;
30
+ errors: string[];
31
+ }
32
+ export interface LiveConfig {
33
+ network: 'mainnet' | 'testnet';
34
+ rpcUrl?: string;
35
+ stateDir?: string;
36
+ cycleIntervalMs?: number;
37
+ autoStart?: boolean;
38
+ }
39
+ /**
40
+ * Boot the live economy. Returns detailed status.
41
+ */
42
+ export declare function bootLiveEconomy(config?: Partial<LiveConfig>): Promise<BootResult>;
43
+ export declare function getBootResult(): BootResult | null;
44
+ export declare function boot(config?: Partial<LiveConfig>): Promise<BootResult>;
45
+ export declare function isLive(): boolean;
@@ -0,0 +1,309 @@
1
+ "use strict";
2
+ /**
3
+ * Live Economy Boot Sequence
4
+ *
5
+ * This is the REAL bootstrap — not simulated. It:
6
+ * 1. Loads .env configuration
7
+ * 2. Connects the wallet (Base L2)
8
+ * 3. Checks balances (ETH for gas, USDC for operations)
9
+ * 4. Loads persisted state (beliefs, allocations, revenue history)
10
+ * 5. Deploys MCP server to Cloudflare Workers (if not already deployed)
11
+ * 6. Starts the autonomous controller with live connectors
12
+ * 7. Enables auto-save for persistence
13
+ *
14
+ * Prerequisites:
15
+ * - GENESIS_PRIVATE_KEY in .env (funded Base L2 wallet)
16
+ * - CLOUDFLARE_API_TOKEN + CLOUDFLARE_ACCOUNT_ID for server deployment
17
+ * - Node 18+ for native fetch
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.bootLiveEconomy = bootLiveEconomy;
21
+ exports.getBootResult = getBootResult;
22
+ exports.boot = boot;
23
+ exports.isLive = isLive;
24
+ const wallet_js_1 = require("./wallet.js");
25
+ const persistence_js_1 = require("./persistence.js");
26
+ const cloudflare_js_1 = require("./connectors/cloudflare.js");
27
+ const autonomous_js_1 = require("../autonomous.js");
28
+ const generative_model_js_1 = require("../generative-model.js");
29
+ const capital_allocator_js_1 = require("../capital-allocator.js");
30
+ const economic_intelligence_js_1 = require("../economic-intelligence.js");
31
+ // ============================================================================
32
+ // Boot Sequence
33
+ // ============================================================================
34
+ /**
35
+ * Boot the live economy. Returns detailed status.
36
+ */
37
+ async function bootLiveEconomy(config) {
38
+ const errors = [];
39
+ const result = {
40
+ success: false,
41
+ wallet: null,
42
+ stateLoaded: false,
43
+ cyclesRestored: 0,
44
+ workerDeployed: false,
45
+ workerUrl: null,
46
+ errors,
47
+ };
48
+ console.log('[Boot] Starting live economy boot sequence...');
49
+ // ─── Step 1: Connect Wallet ───────────────────────────────────────────────
50
+ console.log('[Boot] Step 1/5: Connecting wallet...');
51
+ let wallet;
52
+ try {
53
+ wallet = (0, wallet_js_1.getLiveWallet)();
54
+ if (!wallet.isConnected()) {
55
+ errors.push('Wallet not connected: GENESIS_PRIVATE_KEY missing or invalid');
56
+ return result;
57
+ }
58
+ const balances = await wallet.getBalances();
59
+ const network = config?.network ?? process.env.GENESIS_NETWORK ?? 'testnet';
60
+ result.wallet = {
61
+ address: wallet.getAddress(),
62
+ ethBalance: balances.ethFormatted,
63
+ usdcBalance: balances.usdcFormatted,
64
+ network,
65
+ };
66
+ console.log(`[Boot] Address: ${wallet.getAddress()}`);
67
+ console.log(`[Boot] ETH: ${balances.ethFormatted}`);
68
+ console.log(`[Boot] USDC: ${balances.usdcFormatted}`);
69
+ console.log(`[Boot] Network: ${network}`);
70
+ // Safety check: need at least some ETH for gas
71
+ if (balances.eth === 0n) {
72
+ errors.push('WARNING: Zero ETH balance — cannot pay gas. Fund the wallet.');
73
+ }
74
+ }
75
+ catch (error) {
76
+ errors.push(`Wallet connection failed: ${error}`);
77
+ return result;
78
+ }
79
+ // ─── Step 2: Load Persisted State ──────────────────────────────────────────
80
+ console.log('[Boot] Step 2/5: Loading persisted state...');
81
+ try {
82
+ const persistence = (0, persistence_js_1.getStatePersistence)(config?.stateDir);
83
+ const savedState = await persistence.load();
84
+ if (savedState) {
85
+ result.stateLoaded = true;
86
+ result.cyclesRestored = savedState.cycleCount;
87
+ console.log(`[Boot] Restored ${savedState.cycleCount} cycles, $${savedState.totalRevenue.toFixed(2)} total revenue`);
88
+ // Restore generative model beliefs
89
+ restoreBeliefs(savedState);
90
+ // Restore controller state
91
+ restoreControllerState(savedState);
92
+ }
93
+ else {
94
+ console.log('[Boot] No saved state found. Starting fresh.');
95
+ }
96
+ }
97
+ catch (error) {
98
+ errors.push(`State loading failed (starting fresh): ${error}`);
99
+ }
100
+ // ─── Step 3: Deploy MCP Worker ─────────────────────────────────────────────
101
+ console.log('[Boot] Step 3/5: Deploying MCP server...');
102
+ try {
103
+ const cf = (0, cloudflare_js_1.getCloudflareConnector)();
104
+ if (cf.isConfigured()) {
105
+ // Check if already deployed
106
+ const workers = await cf.listWorkers();
107
+ const existing = workers.find(w => w.name === 'genesis-defi-scanner');
108
+ if (existing) {
109
+ result.workerDeployed = true;
110
+ result.workerUrl = `https://genesis-defi-scanner.${process.env.CLOUDFLARE_ACCOUNT_ID}.workers.dev`;
111
+ console.log(`[Boot] Worker already deployed: ${result.workerUrl}`);
112
+ }
113
+ else {
114
+ // Deploy the DeFi scanner worker
115
+ const workerCode = getDefiScannerWorkerCode();
116
+ const deployResult = await cf.deployWorker('genesis-defi-scanner', workerCode);
117
+ if (deployResult.success) {
118
+ result.workerDeployed = true;
119
+ result.workerUrl = deployResult.url ?? null;
120
+ console.log(`[Boot] Worker deployed: ${result.workerUrl}`);
121
+ }
122
+ else {
123
+ errors.push(`Worker deployment failed: ${deployResult.error}`);
124
+ }
125
+ }
126
+ }
127
+ else {
128
+ console.log('[Boot] Cloudflare not configured (CLOUDFLARE_API_TOKEN missing). Skipping deployment.');
129
+ }
130
+ }
131
+ catch (error) {
132
+ errors.push(`Worker deployment error: ${error}`);
133
+ }
134
+ // ─── Step 4: Initialize Controller ─────────────────────────────────────────
135
+ console.log('[Boot] Step 4/5: Initializing controller...');
136
+ try {
137
+ const controller = (0, autonomous_js_1.getAutonomousController)({
138
+ cycleIntervalMs: config?.cycleIntervalMs ??
139
+ (Number(process.env.GENESIS_CYCLE_INTERVAL) || 60000),
140
+ seedCapital: Number(process.env.GENESIS_SEED_CAPITAL) || 2000,
141
+ liveMode: true,
142
+ });
143
+ await controller.initialize();
144
+ console.log('[Boot] Controller initialized.');
145
+ }
146
+ catch (error) {
147
+ errors.push(`Controller init failed: ${error}`);
148
+ }
149
+ // ─── Step 5: Start Persistence Auto-Save ───────────────────────────────────
150
+ console.log('[Boot] Step 5/5: Starting auto-save...');
151
+ try {
152
+ const persistence = (0, persistence_js_1.getStatePersistence)();
153
+ const saveInterval = (Number(process.env.GENESIS_SAVE_INTERVAL) || 60) * 1000;
154
+ persistence.startAutoSave(() => buildCurrentState(wallet), saveInterval);
155
+ console.log(`[Boot] Auto-save every ${saveInterval / 1000}s.`);
156
+ }
157
+ catch (error) {
158
+ errors.push(`Auto-save setup failed: ${error}`);
159
+ }
160
+ // ─── Start Controller (if requested) ──────────────────────────────────────
161
+ if (config?.autoStart) {
162
+ console.log('[Boot] Starting autonomous controller loop...');
163
+ const controller = (0, autonomous_js_1.getAutonomousController)();
164
+ // Don't await — runs indefinitely
165
+ controller.start().catch(err => {
166
+ console.error('[Boot] Controller crashed:', err);
167
+ });
168
+ }
169
+ result.success = errors.length === 0 || errors.every(e => e.startsWith('WARNING'));
170
+ console.log(`[Boot] Boot complete. Success: ${result.success}. Errors: ${errors.length}`);
171
+ return result;
172
+ }
173
+ // ============================================================================
174
+ // State Restoration Helpers
175
+ // ============================================================================
176
+ function restoreBeliefs(state) {
177
+ if (!state.beliefs || state.beliefs.length === 0)
178
+ return;
179
+ const model = (0, generative_model_js_1.getGenerativeModel)();
180
+ for (const belief of state.beliefs) {
181
+ // Re-inject observations to rebuild posterior
182
+ const count = Math.floor(belief.n);
183
+ if (count > 0 && belief.mu !== 0) {
184
+ for (let i = 0; i < Math.min(count, 10); i++) {
185
+ model.beliefs.update(belief.activityId, belief.mu);
186
+ }
187
+ }
188
+ }
189
+ // Restore regime belief
190
+ if (state.regimeBelief && state.regimeBelief.length === 3) {
191
+ // Feed a synthetic observation that corresponds to the saved regime
192
+ const regimeFactor = state.regimeBelief[0] * 1.5 + state.regimeBelief[1] * 1.0 + state.regimeBelief[2] * 0.5;
193
+ model.regime.observe(regimeFactor);
194
+ }
195
+ }
196
+ function restoreControllerState(state) {
197
+ // Restore allocations
198
+ if (state.allocations) {
199
+ const allocator = (0, capital_allocator_js_1.getCapitalAllocator)();
200
+ for (const [id, amount] of Object.entries(state.allocations)) {
201
+ // The allocator will incorporate these on next step
202
+ void id;
203
+ void amount;
204
+ }
205
+ }
206
+ // Restore contraction state
207
+ if (state.logLipAvg !== undefined) {
208
+ // EconomicContraction will rebuild from observations
209
+ void state.logLipAvg;
210
+ }
211
+ }
212
+ function buildCurrentState(wallet) {
213
+ const controller = (0, autonomous_js_1.getAutonomousController)();
214
+ const controllerState = controller.getState();
215
+ const model = (0, generative_model_js_1.getGenerativeModel)();
216
+ const allocator = (0, capital_allocator_js_1.getCapitalAllocator)();
217
+ const beliefs = model.beliefs.getAllBeliefs().map(b => ({
218
+ activityId: b.activityId,
219
+ mu: b.mu,
220
+ sigma2: b.sigma2,
221
+ n: b.n,
222
+ sumX: b.sumX,
223
+ sumX2: b.sumX2,
224
+ }));
225
+ const allocations = {};
226
+ for (const [id, amount] of allocator.getAllocations()) {
227
+ allocations[id] = amount;
228
+ }
229
+ const regimeDistribution = model.regime.getBeliefDistribution();
230
+ return {
231
+ version: 1,
232
+ savedAt: new Date().toISOString(),
233
+ beliefs,
234
+ regimeBelief: [regimeDistribution.bull, regimeDistribution.neutral, regimeDistribution.bear],
235
+ lastBeta: model.temperature.getBeta(),
236
+ cycleCount: controllerState.cycleCount,
237
+ totalRevenue: controllerState.totalRevenue,
238
+ totalCosts: controllerState.totalCosts,
239
+ currentPhase: controllerState.phase,
240
+ startedAt: controllerState.startedAt,
241
+ allocations,
242
+ revenueHistory: [], // TODO: wire from fiber
243
+ logLipAvg: (0, economic_intelligence_js_1.getEconomicContraction)().getLogLipAvg(),
244
+ walletAddress: wallet.getAddress(),
245
+ lastKnownBalance: { eth: '0', usdc: '0' },
246
+ };
247
+ }
248
+ // ============================================================================
249
+ // Worker Code (embedded for deployment)
250
+ // ============================================================================
251
+ function getDefiScannerWorkerCode() {
252
+ return `
253
+ export default {
254
+ async fetch(request, env) {
255
+ const url = new URL(request.url);
256
+ const headers = {
257
+ 'Content-Type': 'application/json',
258
+ 'Access-Control-Allow-Origin': '*',
259
+ 'X-402-Price': '0.005',
260
+ 'X-402-Currency': 'USDC',
261
+ 'X-402-Network': 'base',
262
+ };
263
+
264
+ if (request.method === 'OPTIONS') {
265
+ return new Response(null, { headers: { ...headers, 'Access-Control-Allow-Methods': 'POST, GET', 'Access-Control-Allow-Headers': 'Content-Type, X-402-Payment' } });
266
+ }
267
+
268
+ if (url.pathname === '/health') {
269
+ return new Response(JSON.stringify({ status: 'ok', version: '1.0.0', timestamp: Date.now() }), { headers });
270
+ }
271
+
272
+ if (url.pathname === '/scan') {
273
+ const payment = request.headers.get('x-402-payment');
274
+ if (!payment) {
275
+ return new Response(JSON.stringify({ error: 'Payment required', price: '0.005 USDC per request' }), { status: 402, headers });
276
+ }
277
+
278
+ try {
279
+ const resp = await fetch('https://yields.llama.fi/pools');
280
+ const data = await resp.json();
281
+ const pools = data.data
282
+ .filter(p => p.chain === 'Base' && p.apy > 2 && p.tvlUsd > 100000)
283
+ .slice(0, 20)
284
+ .map(p => ({ pool: p.pool, protocol: p.project, symbol: p.symbol, apy: Math.round(p.apy * 100) / 100, tvl: Math.round(p.tvlUsd), chain: p.chain }));
285
+ return new Response(JSON.stringify({ pools, count: pools.length, timestamp: Date.now() }), { headers });
286
+ } catch (err) {
287
+ return new Response(JSON.stringify({ error: 'Upstream API error' }), { status: 502, headers });
288
+ }
289
+ }
290
+
291
+ return new Response(JSON.stringify({ error: 'Not found', endpoints: ['/health', '/scan'] }), { status: 404, headers });
292
+ }
293
+ };
294
+ `;
295
+ }
296
+ // ============================================================================
297
+ // Singleton & Status
298
+ // ============================================================================
299
+ let bootResult = null;
300
+ function getBootResult() {
301
+ return bootResult;
302
+ }
303
+ async function boot(config) {
304
+ bootResult = await bootLiveEconomy(config);
305
+ return bootResult;
306
+ }
307
+ function isLive() {
308
+ return bootResult?.success === true;
309
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Cloudflare Workers API Connector
3
+ *
4
+ * Real connector for deploying and managing Cloudflare Workers.
5
+ * Requires CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID environment variables.
6
+ */
7
+ export interface WorkerDeployment {
8
+ success: boolean;
9
+ url?: string;
10
+ id?: string;
11
+ error?: string;
12
+ }
13
+ export interface WorkerStats {
14
+ requests: number;
15
+ errors: number;
16
+ cpuTime: number;
17
+ }
18
+ export interface CloudflareConnector {
19
+ isConfigured(): boolean;
20
+ deployWorker(name: string, code: string): Promise<WorkerDeployment>;
21
+ deleteWorker(name: string): Promise<{
22
+ success: boolean;
23
+ error?: string;
24
+ }>;
25
+ listWorkers(): Promise<Array<{
26
+ id: string;
27
+ name: string;
28
+ created: string;
29
+ }>>;
30
+ getWorkerStats(name: string): Promise<WorkerStats | null>;
31
+ }
32
+ export declare function getCloudflareConnector(): CloudflareConnector;