genesis-ai-cli 13.1.0 → 13.3.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.
Files changed (54) hide show
  1. package/dist/src/active-inference/actions.js +60 -9
  2. package/dist/src/active-inference/autonomous-loop.js +16 -0
  3. package/dist/src/active-inference/economic-integration.d.ts +1 -0
  4. package/dist/src/active-inference/economic-integration.js +25 -1
  5. package/dist/src/active-inference/observations.js +17 -3
  6. package/dist/src/brain/index.js +21 -0
  7. package/dist/src/economy/assets/compute-provider.d.ts +125 -0
  8. package/dist/src/economy/assets/compute-provider.js +274 -0
  9. package/dist/src/economy/assets/index.d.ts +9 -0
  10. package/dist/src/economy/assets/index.js +16 -0
  11. package/dist/src/economy/assets/yield-optimizer.d.ts +122 -0
  12. package/dist/src/economy/assets/yield-optimizer.js +317 -0
  13. package/dist/src/economy/autonomous.d.ts +144 -0
  14. package/dist/src/economy/autonomous.js +730 -0
  15. package/dist/src/economy/capital-allocator.d.ts +107 -0
  16. package/dist/src/economy/capital-allocator.js +275 -0
  17. package/dist/src/economy/economic-intelligence.d.ts +203 -0
  18. package/dist/src/economy/economic-intelligence.js +448 -0
  19. package/dist/src/economy/generators/auditor.d.ts +123 -0
  20. package/dist/src/economy/generators/auditor.js +333 -0
  21. package/dist/src/economy/generators/bounty-hunter.d.ts +116 -0
  22. package/dist/src/economy/generators/bounty-hunter.js +301 -0
  23. package/dist/src/economy/generators/content-engine.d.ts +135 -0
  24. package/dist/src/economy/generators/content-engine.js +342 -0
  25. package/dist/src/economy/generators/index.d.ts +7 -0
  26. package/dist/src/economy/generators/index.js +22 -0
  27. package/dist/src/economy/generators/keeper.d.ts +107 -0
  28. package/dist/src/economy/generators/keeper.js +299 -0
  29. package/dist/src/economy/index.d.ts +6 -0
  30. package/dist/src/economy/index.js +57 -1
  31. package/dist/src/economy/infrastructure/index.d.ts +7 -0
  32. package/dist/src/economy/infrastructure/index.js +22 -0
  33. package/dist/src/economy/infrastructure/mcp-marketplace.d.ts +129 -0
  34. package/dist/src/economy/infrastructure/mcp-marketplace.js +441 -0
  35. package/dist/src/economy/infrastructure/memory-service.d.ts +111 -0
  36. package/dist/src/economy/infrastructure/memory-service.js +267 -0
  37. package/dist/src/economy/infrastructure/meta-orchestrator.d.ts +140 -0
  38. package/dist/src/economy/infrastructure/meta-orchestrator.js +281 -0
  39. package/dist/src/economy/infrastructure/x402-facilitator.d.ts +126 -0
  40. package/dist/src/economy/infrastructure/x402-facilitator.js +249 -0
  41. package/dist/src/economy/multipliers/cross-l2-arb.d.ts +141 -0
  42. package/dist/src/economy/multipliers/cross-l2-arb.js +354 -0
  43. package/dist/src/economy/multipliers/grants.d.ts +120 -0
  44. package/dist/src/economy/multipliers/grants.js +307 -0
  45. package/dist/src/economy/multipliers/index.d.ts +9 -0
  46. package/dist/src/economy/multipliers/index.js +16 -0
  47. package/dist/src/genesis.d.ts +35 -0
  48. package/dist/src/genesis.js +299 -12
  49. package/dist/src/index.js +2 -0
  50. package/dist/src/kernel/free-energy-kernel.d.ts +5 -0
  51. package/dist/src/kernel/free-energy-kernel.js +65 -7
  52. package/dist/src/unified-system.d.ts +3 -0
  53. package/dist/src/unified-system.js +3 -0
  54. package/package.json +1 -1
@@ -290,17 +290,68 @@ registerAction('verify.ethics', async (context) => {
290
290
  });
291
291
  /**
292
292
  * execute.task: Execute the planned task
293
+ * v13.1: Closes the autopoietic execution loop by routing through Brain.process()
293
294
  */
295
+ let _executeTaskDepth = 0;
296
+ const MAX_EXECUTE_DEPTH = 2; // Prevent infinite recursion (AIF → brain → AIF → brain)
294
297
  registerAction('execute.task', async (context) => {
295
- return {
296
- success: true,
297
- action: 'execute.task',
298
- data: {
299
- taskId: context.taskId,
300
- result: null,
301
- },
302
- duration: 0,
303
- };
298
+ const start = Date.now();
299
+ // Re-entrancy guard: prevent recursive brain.process() calls
300
+ if (_executeTaskDepth >= MAX_EXECUTE_DEPTH) {
301
+ return {
302
+ success: false,
303
+ action: 'execute.task',
304
+ error: `Execution depth limit (${MAX_EXECUTE_DEPTH}) reached — preventing recursion`,
305
+ duration: Date.now() - start,
306
+ };
307
+ }
308
+ _executeTaskDepth++;
309
+ try {
310
+ // Dynamic import to avoid circular dependency (brain → actions → brain)
311
+ const { getBrainInstance } = await import('../brain/index.js');
312
+ const brain = getBrainInstance();
313
+ if (!brain) {
314
+ return {
315
+ success: false,
316
+ action: 'execute.task',
317
+ error: 'Brain not initialized — cannot execute task',
318
+ duration: Date.now() - start,
319
+ };
320
+ }
321
+ const goal = context.goal || context.parameters?.goal || '';
322
+ if (!goal) {
323
+ return {
324
+ success: false,
325
+ action: 'execute.task',
326
+ error: 'No goal specified for task execution',
327
+ duration: Date.now() - start,
328
+ };
329
+ }
330
+ // Route through Brain's full processing pipeline (memory → LLM → tools → response)
331
+ const result = await brain.process(goal);
332
+ return {
333
+ success: true,
334
+ action: 'execute.task',
335
+ data: {
336
+ taskId: context.taskId,
337
+ goal,
338
+ result,
339
+ truncated: result.length > 500,
340
+ },
341
+ duration: Date.now() - start,
342
+ };
343
+ }
344
+ catch (error) {
345
+ return {
346
+ success: false,
347
+ action: 'execute.task',
348
+ error: error instanceof Error ? error.message : String(error),
349
+ duration: Date.now() - start,
350
+ };
351
+ }
352
+ finally {
353
+ _executeTaskDepth--;
354
+ }
304
355
  });
305
356
  /**
306
357
  * execute.cycle: Run a processing cycle
@@ -575,12 +575,28 @@ class AutonomousLoop {
575
575
  const avgS = highSurprise.reduce((s, e) => s + e.surprise, 0) / highSurprise.length;
576
576
  console.log(`[AI Loop] Dream: ${highSurprise.length} experiences, avg surprise ${avgS.toFixed(2)}`);
577
577
  }
578
+ // v13.1: Notify FEK to enter dreaming mode (suppresses L2-L4 during consolidation)
579
+ try {
580
+ const { getFreeEnergyKernel } = require('../kernel/free-energy-kernel.js');
581
+ const fek = getFreeEnergyKernel();
582
+ if (fek?.setMode)
583
+ fek.setMode('dreaming');
584
+ }
585
+ catch { /* FEK may not be available */ }
578
586
  // v11.4: Delegate to DreamService for NREM/SWS/REM phases
579
587
  // DreamService handles: episodic consolidation, pattern extraction, creative synthesis
580
588
  this.dreamService.startDream({ duration: 3000 }).then(session => {
581
589
  if (this.config.verbose && session?.results) {
582
590
  console.log(`[AI Loop] Dream complete: ${session.results.memoriesConsolidated} consolidated, ${session.results.patternsExtracted} patterns`);
583
591
  }
592
+ // v13.1: Restore FEK to awake mode after dream
593
+ try {
594
+ const { getFreeEnergyKernel } = require('../kernel/free-energy-kernel.js');
595
+ const fek = getFreeEnergyKernel();
596
+ if (fek?.setMode)
597
+ fek.setMode('awake');
598
+ }
599
+ catch { /* non-fatal */ }
584
600
  }).catch(() => {
585
601
  // Fallback: direct 3× replay if DreamService fails
586
602
  for (let iter = 0; iter < 3; iter++) {
@@ -190,6 +190,7 @@ export declare class EconomicIntegration {
190
190
  export declare function getEconomicIntegration(): EconomicIntegration;
191
191
  /**
192
192
  * Hook to record LLM costs (call this after each LLM request)
193
+ * v13.1: Also feeds real costs into EconomicFiber for FEK's leapfrog budget allocation
193
194
  */
194
195
  export declare function recordLLMCost(provider: string, inputTokens: number, outputTokens: number, model: string): void;
195
196
  /**
@@ -17,6 +17,7 @@ exports.getEconomicIntegration = getEconomicIntegration;
17
17
  exports.recordLLMCost = recordLLMCost;
18
18
  exports.recordRevenue = recordRevenue;
19
19
  const index_js_1 = require("../economy/index.js");
20
+ const fiber_js_1 = require("../economy/fiber.js");
20
21
  // ============================================================================
21
22
  // Cost Tracker
22
23
  // ============================================================================
@@ -511,9 +512,32 @@ function getEconomicIntegration() {
511
512
  }
512
513
  /**
513
514
  * Hook to record LLM costs (call this after each LLM request)
515
+ * v13.1: Also feeds real costs into EconomicFiber for FEK's leapfrog budget allocation
514
516
  */
515
517
  function recordLLMCost(provider, inputTokens, outputTokens, model) {
516
- getEconomicIntegration().getCostTracker().recordLLMCost(provider, inputTokens, outputTokens, model);
518
+ const tracker = getEconomicIntegration().getCostTracker();
519
+ tracker.recordLLMCost(provider, inputTokens, outputTokens, model);
520
+ // v13.1: Feed real cost into FEK's EconomicFiber (replaces synthetic $0.001/cycle)
521
+ // Recompute cost using same pricing as CostTracker
522
+ const pricing = {
523
+ 'claude-3-opus': { input: 15, output: 75 },
524
+ 'claude-3-sonnet': { input: 3, output: 15 },
525
+ 'claude-3-haiku': { input: 0.25, output: 1.25 },
526
+ 'claude-opus-4': { input: 15, output: 75 },
527
+ 'claude-sonnet-4': { input: 3, output: 15 },
528
+ 'gpt-4o': { input: 2.5, output: 10 },
529
+ 'gpt-4o-mini': { input: 0.15, output: 0.6 },
530
+ 'default': { input: 1, output: 4 },
531
+ };
532
+ const rates = pricing[model] || pricing['default'];
533
+ const realCost = (inputTokens / 1_000_000) * rates.input + (outputTokens / 1_000_000) * rates.output;
534
+ try {
535
+ const fiber = (0, fiber_js_1.getEconomicFiber)();
536
+ fiber.recordCost('llm', realCost, `${provider}:${model}`);
537
+ }
538
+ catch {
539
+ // Fiber may not be initialized yet during startup
540
+ }
517
541
  }
518
542
  /**
519
543
  * Hook to record revenue (call this when receiving payment)
@@ -55,12 +55,26 @@ class ObservationGatherer {
55
55
  if (this.realSourcesInitialized)
56
56
  return;
57
57
  this.realSourcesInitialized = true;
58
- // Wire kernel state to process metrics
58
+ // Wire kernel state to process metrics + FEK total free energy
59
+ // v13.1: Incorporates FEK's hierarchical free energy as the primary energy signal
59
60
  this.getKernelState = () => {
60
61
  const mem = process.memoryUsage();
61
62
  const heapUsedRatio = mem.heapUsed / mem.heapTotal;
62
- // Energy = inverse of resource pressure (more heap used = less energy)
63
- const energy = Math.max(0, Math.min(1, 1 - heapUsedRatio));
63
+ const heapEnergy = Math.max(0, Math.min(1, 1 - heapUsedRatio));
64
+ // v13.1: Blend with FEK's total free energy (low FE = high energy/viability)
65
+ let fekEnergy = heapEnergy;
66
+ try {
67
+ const { getFreeEnergyKernel } = require('../kernel/free-energy-kernel.js');
68
+ const fek = getFreeEnergyKernel();
69
+ if (fek) {
70
+ const totalFE = fek.getTotalFE?.() ?? 0;
71
+ // Map FE to energy: FE=0 → energy=1.0, FE≥5 → energy=0.0
72
+ fekEnergy = Math.max(0, Math.min(1, 1 - totalFE / 5));
73
+ }
74
+ }
75
+ catch { /* FEK may not be initialized */ }
76
+ // Blend: 30% heap pressure, 70% FEK free energy
77
+ const energy = 0.3 * heapEnergy + 0.7 * fekEnergy;
64
78
  return {
65
79
  energy,
66
80
  state: 'running',
@@ -281,6 +281,27 @@ class Brain {
281
281
  data: { mode, prev, kernel: 'fek' },
282
282
  module: 'consciousness',
283
283
  });
284
+ // v13.1: Close the self-modification loop — when FEK L4 requests
285
+ // self_improving mode, trigger the DarwinGodel improvement engine
286
+ if (mode === 'self_improving' && prev !== 'self_improving' && this.darwinGodel) {
287
+ import('../active-inference/actions.js').then(({ executeAction }) => {
288
+ executeAction('improve.self', {
289
+ parameters: { autoApply: false },
290
+ beliefs: { viability: 0.5, worldState: 0.5, coupling: 0.5, goalProgress: 0.5 },
291
+ }).then((result) => {
292
+ this.emit({
293
+ type: 'module_exit',
294
+ timestamp: new Date(),
295
+ data: {
296
+ type: 'fek_self_improvement',
297
+ success: result.success,
298
+ opportunities: result.data?.opportunities?.length || 0,
299
+ },
300
+ module: 'consciousness',
301
+ });
302
+ }).catch(() => { });
303
+ }).catch(() => { });
304
+ }
284
305
  });
285
306
  }
286
307
  catch {
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Decentralized Compute Provider — Akash/Render/io.net
3
+ *
4
+ * Deploys Genesis as a compute provider on decentralized networks,
5
+ * earning revenue by selling idle compute capacity.
6
+ *
7
+ * Requirements:
8
+ * - Capital: $1,000+ (staking for provider registration)
9
+ * - Identity: Wallet only
10
+ * - Revenue: $200-$2,000/month depending on hardware
11
+ *
12
+ * Networks:
13
+ * - Akash Network: General-purpose compute ($0.05-$0.50/hr)
14
+ * - Render Network: GPU rendering ($0.20-$2.00/hr)
15
+ * - io.net: GPU compute for ML ($0.30-$3.00/hr)
16
+ * - Flux: Decentralized cloud ($0.10-$1.00/hr)
17
+ *
18
+ * What we sell:
19
+ * - Idle CPU cycles during low-activity periods
20
+ * - Memory capacity for data processing jobs
21
+ * - (Optional) GPU time if available
22
+ *
23
+ * Safety:
24
+ * - Max 70% CPU utilization for external jobs
25
+ * - Pause external work when Genesis needs resources
26
+ * - Sandboxed execution (Docker containers)
27
+ * - Auto-scale down under load
28
+ */
29
+ export interface ComputeJob {
30
+ id: string;
31
+ network: 'akash' | 'render' | 'ionet' | 'flux';
32
+ type: 'cpu' | 'gpu' | 'memory' | 'storage';
33
+ specs: ComputeSpecs;
34
+ pricePerHour: number;
35
+ startTime: number;
36
+ endTime?: number;
37
+ status: 'pending' | 'running' | 'completed' | 'cancelled' | 'failed';
38
+ revenue: number;
39
+ resourceUsage: ResourceUsage;
40
+ }
41
+ export interface ComputeSpecs {
42
+ cpuCores: number;
43
+ memoryMB: number;
44
+ gpuCount: number;
45
+ storageGB: number;
46
+ durationHours: number;
47
+ }
48
+ export interface ResourceUsage {
49
+ cpuPercent: number;
50
+ memoryPercent: number;
51
+ gpuPercent: number;
52
+ networkMbps: number;
53
+ }
54
+ export interface ProviderRegistration {
55
+ network: string;
56
+ stakeAmount: number;
57
+ registered: boolean;
58
+ registeredAt?: number;
59
+ providerAddress?: string;
60
+ }
61
+ export interface ComputeProviderStats {
62
+ totalJobs: number;
63
+ completedJobs: number;
64
+ totalRevenue: number;
65
+ totalUptime: number;
66
+ averageUtilization: number;
67
+ activeJobs: number;
68
+ registeredNetworks: number;
69
+ totalStaked: number;
70
+ hourlyRate: number;
71
+ }
72
+ export interface ComputeProviderConfig {
73
+ maxCpuUtilization: number;
74
+ maxMemoryUtilization: number;
75
+ enabledNetworks: string[];
76
+ minPricePerHour: number;
77
+ maxConcurrentJobs: number;
78
+ autoScaleDown: boolean;
79
+ stakePerNetwork: number;
80
+ }
81
+ export declare class ComputeProvider {
82
+ private config;
83
+ private jobs;
84
+ private registrations;
85
+ private readonly fiberId;
86
+ private currentUsage;
87
+ constructor(config?: Partial<ComputeProviderConfig>);
88
+ /**
89
+ * Register as a provider on a decentralized compute network.
90
+ */
91
+ register(network: string): Promise<ProviderRegistration>;
92
+ /**
93
+ * Accept and start a compute job.
94
+ */
95
+ acceptJob(job: Omit<ComputeJob, 'id' | 'startTime' | 'status' | 'revenue' | 'resourceUsage'>): Promise<ComputeJob | null>;
96
+ /**
97
+ * Complete a running job and collect payment.
98
+ */
99
+ completeJob(jobId: string): Promise<number>;
100
+ /**
101
+ * Check for new jobs on registered networks.
102
+ */
103
+ checkForJobs(): Promise<ComputeJob[]>;
104
+ /**
105
+ * Complete all finished jobs.
106
+ */
107
+ harvestCompleted(): Promise<number>;
108
+ /**
109
+ * Get current statistics.
110
+ */
111
+ getStats(): ComputeProviderStats;
112
+ /**
113
+ * Get ROI.
114
+ */
115
+ getROI(): number;
116
+ /**
117
+ * Check if provider is operational (registered on at least one network).
118
+ */
119
+ isOperational(): boolean;
120
+ private hasCapacity;
121
+ private getAvailableSpecs;
122
+ private updateUsage;
123
+ }
124
+ export declare function getComputeProvider(config?: Partial<ComputeProviderConfig>): ComputeProvider;
125
+ export declare function resetComputeProvider(): void;
@@ -0,0 +1,274 @@
1
+ "use strict";
2
+ /**
3
+ * Decentralized Compute Provider — Akash/Render/io.net
4
+ *
5
+ * Deploys Genesis as a compute provider on decentralized networks,
6
+ * earning revenue by selling idle compute capacity.
7
+ *
8
+ * Requirements:
9
+ * - Capital: $1,000+ (staking for provider registration)
10
+ * - Identity: Wallet only
11
+ * - Revenue: $200-$2,000/month depending on hardware
12
+ *
13
+ * Networks:
14
+ * - Akash Network: General-purpose compute ($0.05-$0.50/hr)
15
+ * - Render Network: GPU rendering ($0.20-$2.00/hr)
16
+ * - io.net: GPU compute for ML ($0.30-$3.00/hr)
17
+ * - Flux: Decentralized cloud ($0.10-$1.00/hr)
18
+ *
19
+ * What we sell:
20
+ * - Idle CPU cycles during low-activity periods
21
+ * - Memory capacity for data processing jobs
22
+ * - (Optional) GPU time if available
23
+ *
24
+ * Safety:
25
+ * - Max 70% CPU utilization for external jobs
26
+ * - Pause external work when Genesis needs resources
27
+ * - Sandboxed execution (Docker containers)
28
+ * - Auto-scale down under load
29
+ */
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.ComputeProvider = void 0;
32
+ exports.getComputeProvider = getComputeProvider;
33
+ exports.resetComputeProvider = resetComputeProvider;
34
+ const index_js_1 = require("../../mcp/index.js");
35
+ const fiber_js_1 = require("../fiber.js");
36
+ // ============================================================================
37
+ // Compute Provider
38
+ // ============================================================================
39
+ class ComputeProvider {
40
+ config;
41
+ jobs = new Map();
42
+ registrations = new Map();
43
+ fiberId = 'compute-provider';
44
+ currentUsage = { cpuPercent: 0, memoryPercent: 0, gpuPercent: 0, networkMbps: 0 };
45
+ constructor(config) {
46
+ this.config = {
47
+ maxCpuUtilization: config?.maxCpuUtilization ?? 0.7,
48
+ maxMemoryUtilization: config?.maxMemoryUtilization ?? 0.6,
49
+ enabledNetworks: config?.enabledNetworks ?? ['akash', 'flux'],
50
+ minPricePerHour: config?.minPricePerHour ?? 0.05,
51
+ maxConcurrentJobs: config?.maxConcurrentJobs ?? 5,
52
+ autoScaleDown: config?.autoScaleDown ?? true,
53
+ stakePerNetwork: config?.stakePerNetwork ?? 500,
54
+ };
55
+ (0, fiber_js_1.getEconomicFiber)().registerModule(this.fiberId);
56
+ }
57
+ /**
58
+ * Register as a provider on a decentralized compute network.
59
+ */
60
+ async register(network) {
61
+ const fiber = (0, fiber_js_1.getEconomicFiber)();
62
+ const existing = this.registrations.get(network);
63
+ if (existing?.registered)
64
+ return existing;
65
+ try {
66
+ const client = (0, index_js_1.getMCPClient)();
67
+ const result = await client.call('coinbase', 'register_compute_provider', {
68
+ network,
69
+ stake: this.config.stakePerNetwork,
70
+ specs: this.getAvailableSpecs(),
71
+ });
72
+ const reg = {
73
+ network,
74
+ stakeAmount: this.config.stakePerNetwork,
75
+ registered: result.success ?? false,
76
+ registeredAt: result.success ? Date.now() : undefined,
77
+ providerAddress: result.data?.address,
78
+ };
79
+ if (reg.registered) {
80
+ fiber.recordCost(this.fiberId, this.config.stakePerNetwork, `stake:${network}`);
81
+ }
82
+ this.registrations.set(network, reg);
83
+ return reg;
84
+ }
85
+ catch {
86
+ const reg = {
87
+ network,
88
+ stakeAmount: this.config.stakePerNetwork,
89
+ registered: false,
90
+ };
91
+ this.registrations.set(network, reg);
92
+ return reg;
93
+ }
94
+ }
95
+ /**
96
+ * Accept and start a compute job.
97
+ */
98
+ async acceptJob(job) {
99
+ // Check capacity
100
+ const activeJobs = [...this.jobs.values()].filter(j => j.status === 'running');
101
+ if (activeJobs.length >= this.config.maxConcurrentJobs)
102
+ return null;
103
+ // Check price
104
+ if (job.pricePerHour < this.config.minPricePerHour)
105
+ return null;
106
+ // Check resource availability
107
+ if (!this.hasCapacity(job.specs))
108
+ return null;
109
+ const computeJob = {
110
+ ...job,
111
+ id: `job-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
112
+ startTime: Date.now(),
113
+ status: 'running',
114
+ revenue: 0,
115
+ resourceUsage: { cpuPercent: 0, memoryPercent: 0, gpuPercent: 0, networkMbps: 0 },
116
+ };
117
+ this.jobs.set(computeJob.id, computeJob);
118
+ this.updateUsage();
119
+ return computeJob;
120
+ }
121
+ /**
122
+ * Complete a running job and collect payment.
123
+ */
124
+ async completeJob(jobId) {
125
+ const job = this.jobs.get(jobId);
126
+ if (!job || job.status !== 'running')
127
+ return 0;
128
+ const fiber = (0, fiber_js_1.getEconomicFiber)();
129
+ const hoursRun = (Date.now() - job.startTime) / 3600000;
130
+ const revenue = hoursRun * job.pricePerHour;
131
+ job.status = 'completed';
132
+ job.endTime = Date.now();
133
+ job.revenue = revenue;
134
+ fiber.recordRevenue(this.fiberId, revenue, `compute:${job.network}:${job.type}`);
135
+ this.updateUsage();
136
+ return revenue;
137
+ }
138
+ /**
139
+ * Check for new jobs on registered networks.
140
+ */
141
+ async checkForJobs() {
142
+ const accepted = [];
143
+ for (const [network, reg] of this.registrations) {
144
+ if (!reg.registered)
145
+ continue;
146
+ try {
147
+ const client = (0, index_js_1.getMCPClient)();
148
+ const result = await client.call('coinbase', 'check_compute_jobs', {
149
+ network,
150
+ providerAddress: reg.providerAddress,
151
+ availableSpecs: this.getAvailableSpecs(),
152
+ });
153
+ if (result.success && Array.isArray(result.data?.jobs)) {
154
+ for (const j of result.data.jobs) {
155
+ const job = await this.acceptJob({
156
+ network: network,
157
+ type: j.type ?? 'cpu',
158
+ specs: {
159
+ cpuCores: j.cpuCores ?? 1,
160
+ memoryMB: j.memoryMB ?? 512,
161
+ gpuCount: j.gpuCount ?? 0,
162
+ storageGB: j.storageGB ?? 10,
163
+ durationHours: j.durationHours ?? 1,
164
+ },
165
+ pricePerHour: j.pricePerHour ?? 0.10,
166
+ });
167
+ if (job)
168
+ accepted.push(job);
169
+ }
170
+ }
171
+ }
172
+ catch {
173
+ // Network unavailable
174
+ }
175
+ }
176
+ return accepted;
177
+ }
178
+ /**
179
+ * Complete all finished jobs.
180
+ */
181
+ async harvestCompleted() {
182
+ let totalRevenue = 0;
183
+ for (const [, job] of this.jobs) {
184
+ if (job.status !== 'running')
185
+ continue;
186
+ const hoursRun = (Date.now() - job.startTime) / 3600000;
187
+ if (hoursRun >= job.specs.durationHours) {
188
+ const revenue = await this.completeJob(job.id);
189
+ totalRevenue += revenue;
190
+ }
191
+ }
192
+ return totalRevenue;
193
+ }
194
+ /**
195
+ * Get current statistics.
196
+ */
197
+ getStats() {
198
+ const completed = [...this.jobs.values()].filter(j => j.status === 'completed');
199
+ const active = [...this.jobs.values()].filter(j => j.status === 'running');
200
+ const registered = [...this.registrations.values()].filter(r => r.registered);
201
+ const totalUptime = completed.reduce((s, j) => {
202
+ const hours = ((j.endTime ?? Date.now()) - j.startTime) / 3600000;
203
+ return s + hours;
204
+ }, 0);
205
+ return {
206
+ totalJobs: this.jobs.size,
207
+ completedJobs: completed.length,
208
+ totalRevenue: completed.reduce((s, j) => s + j.revenue, 0),
209
+ totalUptime,
210
+ averageUtilization: this.currentUsage.cpuPercent,
211
+ activeJobs: active.length,
212
+ registeredNetworks: registered.length,
213
+ totalStaked: registered.reduce((s, r) => s + r.stakeAmount, 0),
214
+ hourlyRate: totalUptime > 0
215
+ ? completed.reduce((s, j) => s + j.revenue, 0) / totalUptime
216
+ : 0,
217
+ };
218
+ }
219
+ /**
220
+ * Get ROI.
221
+ */
222
+ getROI() {
223
+ const fiber = (0, fiber_js_1.getEconomicFiber)().getFiber(this.fiberId);
224
+ return fiber?.roi ?? 0;
225
+ }
226
+ /**
227
+ * Check if provider is operational (registered on at least one network).
228
+ */
229
+ isOperational() {
230
+ return [...this.registrations.values()].some(r => r.registered);
231
+ }
232
+ // ============================================================================
233
+ // Private
234
+ // ============================================================================
235
+ hasCapacity(specs) {
236
+ const availCpu = (this.config.maxCpuUtilization - this.currentUsage.cpuPercent) * 100;
237
+ const availMem = (this.config.maxMemoryUtilization - this.currentUsage.memoryPercent) * 100;
238
+ return specs.cpuCores <= availCpu / 25 && specs.memoryMB <= (availMem / 100) * 16384;
239
+ }
240
+ getAvailableSpecs() {
241
+ return {
242
+ cpuCores: Math.floor((this.config.maxCpuUtilization - this.currentUsage.cpuPercent) * 8),
243
+ memoryMB: Math.floor((this.config.maxMemoryUtilization - this.currentUsage.memoryPercent) * 16384),
244
+ gpuCount: 0,
245
+ storageGB: 50,
246
+ durationHours: 24,
247
+ };
248
+ }
249
+ updateUsage() {
250
+ const active = [...this.jobs.values()].filter(j => j.status === 'running');
251
+ const totalCpuDemand = active.reduce((s, j) => s + j.specs.cpuCores * 0.125, 0); // 8 cores = 100%
252
+ const totalMemDemand = active.reduce((s, j) => s + j.specs.memoryMB / 16384, 0);
253
+ this.currentUsage = {
254
+ cpuPercent: Math.min(1, totalCpuDemand),
255
+ memoryPercent: Math.min(1, totalMemDemand),
256
+ gpuPercent: 0,
257
+ networkMbps: active.length * 10,
258
+ };
259
+ }
260
+ }
261
+ exports.ComputeProvider = ComputeProvider;
262
+ // ============================================================================
263
+ // Singleton
264
+ // ============================================================================
265
+ let providerInstance = null;
266
+ function getComputeProvider(config) {
267
+ if (!providerInstance) {
268
+ providerInstance = new ComputeProvider(config);
269
+ }
270
+ return providerInstance;
271
+ }
272
+ function resetComputeProvider() {
273
+ providerInstance = null;
274
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Assets — Passive Revenue Generators
3
+ *
4
+ * Capital-deployed assets that earn yield with minimal active management.
5
+ */
6
+ export { YieldOptimizer, getYieldOptimizer, resetYieldOptimizer } from './yield-optimizer.js';
7
+ export type { YieldPosition, YieldOpportunity, YieldOptimizerStats, YieldOptimizerConfig } from './yield-optimizer.js';
8
+ export { ComputeProvider, getComputeProvider, resetComputeProvider } from './compute-provider.js';
9
+ export type { ComputeJob, ComputeSpecs, ComputeProviderStats, ComputeProviderConfig } from './compute-provider.js';
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ /**
3
+ * Assets — Passive Revenue Generators
4
+ *
5
+ * Capital-deployed assets that earn yield with minimal active management.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.resetComputeProvider = exports.getComputeProvider = exports.ComputeProvider = exports.resetYieldOptimizer = exports.getYieldOptimizer = exports.YieldOptimizer = void 0;
9
+ var yield_optimizer_js_1 = require("./yield-optimizer.js");
10
+ Object.defineProperty(exports, "YieldOptimizer", { enumerable: true, get: function () { return yield_optimizer_js_1.YieldOptimizer; } });
11
+ Object.defineProperty(exports, "getYieldOptimizer", { enumerable: true, get: function () { return yield_optimizer_js_1.getYieldOptimizer; } });
12
+ Object.defineProperty(exports, "resetYieldOptimizer", { enumerable: true, get: function () { return yield_optimizer_js_1.resetYieldOptimizer; } });
13
+ var compute_provider_js_1 = require("./compute-provider.js");
14
+ Object.defineProperty(exports, "ComputeProvider", { enumerable: true, get: function () { return compute_provider_js_1.ComputeProvider; } });
15
+ Object.defineProperty(exports, "getComputeProvider", { enumerable: true, get: function () { return compute_provider_js_1.getComputeProvider; } });
16
+ Object.defineProperty(exports, "resetComputeProvider", { enumerable: true, get: function () { return compute_provider_js_1.resetComputeProvider; } });