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.
- package/dist/src/active-inference/actions.js +60 -9
- package/dist/src/active-inference/autonomous-loop.js +16 -0
- package/dist/src/active-inference/economic-integration.d.ts +1 -0
- package/dist/src/active-inference/economic-integration.js +25 -1
- package/dist/src/active-inference/observations.js +17 -3
- package/dist/src/brain/index.js +21 -0
- package/dist/src/economy/assets/compute-provider.d.ts +125 -0
- package/dist/src/economy/assets/compute-provider.js +274 -0
- package/dist/src/economy/assets/index.d.ts +9 -0
- package/dist/src/economy/assets/index.js +16 -0
- package/dist/src/economy/assets/yield-optimizer.d.ts +122 -0
- package/dist/src/economy/assets/yield-optimizer.js +317 -0
- package/dist/src/economy/autonomous.d.ts +144 -0
- package/dist/src/economy/autonomous.js +730 -0
- package/dist/src/economy/capital-allocator.d.ts +107 -0
- package/dist/src/economy/capital-allocator.js +275 -0
- package/dist/src/economy/economic-intelligence.d.ts +203 -0
- package/dist/src/economy/economic-intelligence.js +448 -0
- package/dist/src/economy/generators/auditor.d.ts +123 -0
- package/dist/src/economy/generators/auditor.js +333 -0
- package/dist/src/economy/generators/bounty-hunter.d.ts +116 -0
- package/dist/src/economy/generators/bounty-hunter.js +301 -0
- package/dist/src/economy/generators/content-engine.d.ts +135 -0
- package/dist/src/economy/generators/content-engine.js +342 -0
- package/dist/src/economy/generators/index.d.ts +7 -0
- package/dist/src/economy/generators/index.js +22 -0
- package/dist/src/economy/generators/keeper.d.ts +107 -0
- package/dist/src/economy/generators/keeper.js +299 -0
- package/dist/src/economy/index.d.ts +6 -0
- package/dist/src/economy/index.js +57 -1
- package/dist/src/economy/infrastructure/index.d.ts +7 -0
- package/dist/src/economy/infrastructure/index.js +22 -0
- package/dist/src/economy/infrastructure/mcp-marketplace.d.ts +129 -0
- package/dist/src/economy/infrastructure/mcp-marketplace.js +441 -0
- package/dist/src/economy/infrastructure/memory-service.d.ts +111 -0
- package/dist/src/economy/infrastructure/memory-service.js +267 -0
- package/dist/src/economy/infrastructure/meta-orchestrator.d.ts +140 -0
- package/dist/src/economy/infrastructure/meta-orchestrator.js +281 -0
- package/dist/src/economy/infrastructure/x402-facilitator.d.ts +126 -0
- package/dist/src/economy/infrastructure/x402-facilitator.js +249 -0
- package/dist/src/economy/multipliers/cross-l2-arb.d.ts +141 -0
- package/dist/src/economy/multipliers/cross-l2-arb.js +354 -0
- package/dist/src/economy/multipliers/grants.d.ts +120 -0
- package/dist/src/economy/multipliers/grants.js +307 -0
- package/dist/src/economy/multipliers/index.d.ts +9 -0
- package/dist/src/economy/multipliers/index.js +16 -0
- package/dist/src/genesis.d.ts +35 -0
- package/dist/src/genesis.js +299 -12
- package/dist/src/index.js +2 -0
- package/dist/src/kernel/free-energy-kernel.d.ts +5 -0
- package/dist/src/kernel/free-energy-kernel.js +65 -7
- package/dist/src/unified-system.d.ts +3 -0
- package/dist/src/unified-system.js +3 -0
- 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
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
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()
|
|
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
|
-
|
|
63
|
-
|
|
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',
|
package/dist/src/brain/index.js
CHANGED
|
@@ -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; } });
|