@holoscript/framework 6.0.3
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/ALL-test-results.json +1 -0
- package/CHANGELOG.md +8 -0
- package/LICENSE +21 -0
- package/ROADMAP.md +175 -0
- package/dist/AgentManifest-CB4xM-Ma.d.cts +704 -0
- package/dist/AgentManifest-CB4xM-Ma.d.ts +704 -0
- package/dist/BehaviorTree-BrBFECv5.d.cts +103 -0
- package/dist/BehaviorTree-BrBFECv5.d.ts +103 -0
- package/dist/InvisibleWallet-BB6tFvRA.d.cts +1732 -0
- package/dist/InvisibleWallet-rtRrBOA8.d.ts +1732 -0
- package/dist/OrchestratorAgent-BvWgf9uw.d.cts +798 -0
- package/dist/OrchestratorAgent-Q_CbVTmO.d.ts +798 -0
- package/dist/agents/index.cjs +4790 -0
- package/dist/agents/index.d.cts +1788 -0
- package/dist/agents/index.d.ts +1788 -0
- package/dist/agents/index.js +4695 -0
- package/dist/ai/index.cjs +5347 -0
- package/dist/ai/index.d.cts +1753 -0
- package/dist/ai/index.d.ts +1753 -0
- package/dist/ai/index.js +5244 -0
- package/dist/behavior.cjs +449 -0
- package/dist/behavior.d.cts +130 -0
- package/dist/behavior.d.ts +130 -0
- package/dist/behavior.js +407 -0
- package/dist/economy/index.cjs +3659 -0
- package/dist/economy/index.d.cts +747 -0
- package/dist/economy/index.d.ts +747 -0
- package/dist/economy/index.js +3617 -0
- package/dist/implementations-D9T3un9D.d.cts +236 -0
- package/dist/implementations-D9T3un9D.d.ts +236 -0
- package/dist/index.cjs +24550 -0
- package/dist/index.d.cts +1729 -0
- package/dist/index.d.ts +1729 -0
- package/dist/index.js +24277 -0
- package/dist/learning/index.cjs +219 -0
- package/dist/learning/index.d.cts +104 -0
- package/dist/learning/index.d.ts +104 -0
- package/dist/learning/index.js +189 -0
- package/dist/negotiation/index.cjs +970 -0
- package/dist/negotiation/index.d.cts +610 -0
- package/dist/negotiation/index.d.ts +610 -0
- package/dist/negotiation/index.js +931 -0
- package/dist/skills/index.cjs +1118 -0
- package/dist/skills/index.d.cts +289 -0
- package/dist/skills/index.d.ts +289 -0
- package/dist/skills/index.js +1079 -0
- package/dist/swarm/index.cjs +5268 -0
- package/dist/swarm/index.d.cts +2433 -0
- package/dist/swarm/index.d.ts +2433 -0
- package/dist/swarm/index.js +5221 -0
- package/dist/training/index.cjs +2745 -0
- package/dist/training/index.d.cts +1734 -0
- package/dist/training/index.d.ts +1734 -0
- package/dist/training/index.js +2687 -0
- package/extract-failures.js +10 -0
- package/package.json +82 -0
- package/src/__tests__/bounty-marketplace.test.ts +374 -0
- package/src/__tests__/delegation.test.ts +144 -0
- package/src/__tests__/distributed-claimer.test.ts +147 -0
- package/src/__tests__/done-log-audit.test.ts +342 -0
- package/src/__tests__/framework.test.ts +865 -0
- package/src/__tests__/goal-synthesizer.test.ts +236 -0
- package/src/__tests__/presence.test.ts +223 -0
- package/src/__tests__/protocol-agent.test.ts +254 -0
- package/src/__tests__/revenue-splitter.test.ts +114 -0
- package/src/__tests__/scenario-driven-todo.test.ts +197 -0
- package/src/__tests__/self-improve.test.ts +349 -0
- package/src/__tests__/service-lifecycle.test.ts +237 -0
- package/src/__tests__/skill-router.test.ts +121 -0
- package/src/agents/AgentManifest.ts +493 -0
- package/src/agents/AgentRegistry.ts +475 -0
- package/src/agents/AgentTypes.ts +585 -0
- package/src/agents/AgentWalletRegistry.ts +83 -0
- package/src/agents/AuthenticatedCRDT.ts +388 -0
- package/src/agents/CapabilityMatcher.ts +453 -0
- package/src/agents/CrossRealityHandoff.ts +305 -0
- package/src/agents/CulturalMemory.ts +454 -0
- package/src/agents/FederatedRegistryAdapter.ts +429 -0
- package/src/agents/NormEngine.ts +450 -0
- package/src/agents/OrchestratorAgent.ts +414 -0
- package/src/agents/SkillWorkflowEngine.ts +472 -0
- package/src/agents/TaskDelegationService.ts +551 -0
- package/src/agents/__tests__/AgentManifest.prod.test.ts +134 -0
- package/src/agents/__tests__/AgentManifest.test.ts +182 -0
- package/src/agents/__tests__/AgentModule.test.ts +864 -0
- package/src/agents/__tests__/AgentRegistry.prod.test.ts +125 -0
- package/src/agents/__tests__/AgentRegistry.test.ts +148 -0
- package/src/agents/__tests__/AgentTypes.test.ts +534 -0
- package/src/agents/__tests__/AgentWalletRegistry.test.ts +152 -0
- package/src/agents/__tests__/AuthenticatedCRDT.test.ts +558 -0
- package/src/agents/__tests__/CapabilityMatcher.prod.test.ts +117 -0
- package/src/agents/__tests__/CapabilityMatcher.test.ts +178 -0
- package/src/agents/__tests__/CrossRealityHandoff.test.ts +402 -0
- package/src/agents/__tests__/CulturalMemory.test.ts +200 -0
- package/src/agents/__tests__/FederatedRegistryAdapter.test.ts +409 -0
- package/src/agents/__tests__/NormEngine.test.ts +276 -0
- package/src/agents/__tests__/OrchestratorAgent.test.ts +182 -0
- package/src/agents/__tests__/SkillWorkflowEngine.test.ts +357 -0
- package/src/agents/__tests__/TaskDelegationService.test.ts +446 -0
- package/src/agents/index.ts +107 -0
- package/src/agents/spatial-comms/Layer1RealTime.ts +621 -0
- package/src/agents/spatial-comms/Layer2A2A.ts +661 -0
- package/src/agents/spatial-comms/Layer3MCP.ts +651 -0
- package/src/agents/spatial-comms/ProtocolTypes.ts +543 -0
- package/src/agents/spatial-comms/SpatialCommClient.ts +483 -0
- package/src/agents/spatial-comms/__tests__/performance-benchmark.test.ts +465 -0
- package/src/agents/spatial-comms/examples/multi-agent-world-creation.ts +409 -0
- package/src/agents/spatial-comms/index.ts +66 -0
- package/src/ai/AIAdapter.ts +313 -0
- package/src/ai/AICopilot.ts +331 -0
- package/src/ai/AIOutputValidator.ts +203 -0
- package/src/ai/BTNodes.ts +239 -0
- package/src/ai/BehaviorSelector.ts +135 -0
- package/src/ai/BehaviorTree.ts +153 -0
- package/src/ai/Blackboard.ts +165 -0
- package/src/ai/GenerationAnalytics.ts +461 -0
- package/src/ai/GenerationCache.ts +265 -0
- package/src/ai/GoalPlanner.ts +165 -0
- package/src/ai/HoloScriptGenerator.ts +580 -0
- package/src/ai/InfluenceMap.ts +180 -0
- package/src/ai/NavMesh.ts +168 -0
- package/src/ai/PerceptionSystem.ts +178 -0
- package/src/ai/PromptTemplates.ts +453 -0
- package/src/ai/SemanticSearchService.ts +80 -0
- package/src/ai/StateMachine.ts +196 -0
- package/src/ai/SteeringBehavior.ts +150 -0
- package/src/ai/SteeringBehaviors.ts +244 -0
- package/src/ai/TrainingDataGenerator.ts +1082 -0
- package/src/ai/UtilityAI.ts +145 -0
- package/src/ai/__tests__/AIAdapter.prod.test.ts +259 -0
- package/src/ai/__tests__/AIAdapter.test.ts +109 -0
- package/src/ai/__tests__/AICopilot.prod.test.ts +341 -0
- package/src/ai/__tests__/AICopilot.test.ts +178 -0
- package/src/ai/__tests__/AIOutputValidator.prod.test.ts +226 -0
- package/src/ai/__tests__/AIOutputValidator.test.ts +138 -0
- package/src/ai/__tests__/BTNodes.prod.test.ts +391 -0
- package/src/ai/__tests__/BTNodes.test.ts +263 -0
- package/src/ai/__tests__/BehaviorSelector.prod.test.ts +129 -0
- package/src/ai/__tests__/BehaviorSelector.test.ts +132 -0
- package/src/ai/__tests__/BehaviorTree.prod.test.ts +266 -0
- package/src/ai/__tests__/BehaviorTree.test.ts +216 -0
- package/src/ai/__tests__/Blackboard.prod.test.ts +339 -0
- package/src/ai/__tests__/Blackboard.test.ts +183 -0
- package/src/ai/__tests__/GenerationAnalytics.prod.test.ts +141 -0
- package/src/ai/__tests__/GenerationAnalytics.test.ts +165 -0
- package/src/ai/__tests__/GenerationCache.prod.test.ts +144 -0
- package/src/ai/__tests__/GenerationCache.test.ts +171 -0
- package/src/ai/__tests__/GoalPlanner.prod.test.ts +189 -0
- package/src/ai/__tests__/GoalPlanner.test.ts +137 -0
- package/src/ai/__tests__/GoalPlannerDepth.prod.test.ts +217 -0
- package/src/ai/__tests__/HoloScriptGenerator.test.ts +125 -0
- package/src/ai/__tests__/InfluenceMap.prod.test.ts +146 -0
- package/src/ai/__tests__/InfluenceMap.test.ts +149 -0
- package/src/ai/__tests__/NavMesh.prod.test.ts +141 -0
- package/src/ai/__tests__/NavMesh.test.ts +159 -0
- package/src/ai/__tests__/PerceptionSystem.prod.test.ts +135 -0
- package/src/ai/__tests__/PerceptionSystem.test.ts +250 -0
- package/src/ai/__tests__/PromptTemplates.prod.test.ts +313 -0
- package/src/ai/__tests__/PromptTemplates.test.ts +146 -0
- package/src/ai/__tests__/SemanticSearch.test.ts +37 -0
- package/src/ai/__tests__/StateMachine.prod.test.ts +162 -0
- package/src/ai/__tests__/StateMachine.test.ts +163 -0
- package/src/ai/__tests__/SteeringBehavior.prod.test.ts +251 -0
- package/src/ai/__tests__/SteeringBehavior.test.ts +135 -0
- package/src/ai/__tests__/SteeringBehaviors.prod.test.ts +133 -0
- package/src/ai/__tests__/SteeringBehaviors.test.ts +151 -0
- package/src/ai/__tests__/TrainingDataGenerator.prod.test.ts +286 -0
- package/src/ai/__tests__/TrainingDataGenerator.test.ts +286 -0
- package/src/ai/__tests__/UtilityAI.prod.test.ts +207 -0
- package/src/ai/__tests__/UtilityAI.test.ts +155 -0
- package/src/ai/__tests__/adapters.prod.test.ts +263 -0
- package/src/ai/__tests__/adapters.test.ts +320 -0
- package/src/ai/adapters.ts +1585 -0
- package/src/ai/index.ts +130 -0
- package/src/behavior/BehaviorPresets.ts +140 -0
- package/src/behavior/BehaviorTree.ts +236 -0
- package/src/behavior/StateMachine.ts +176 -0
- package/src/behavior/StateTrait.ts +67 -0
- package/src/behavior/index.ts +8 -0
- package/src/behavior.ts +8 -0
- package/src/board/audit.ts +284 -0
- package/src/board/board-ops.ts +336 -0
- package/src/board/board-types.ts +302 -0
- package/src/board/index.ts +69 -0
- package/src/define-agent.ts +46 -0
- package/src/define-team.ts +33 -0
- package/src/delegation.ts +265 -0
- package/src/distributed-claimer.ts +228 -0
- package/src/economy/AgentBudgetEnforcer.ts +464 -0
- package/src/economy/BountyManager.ts +185 -0
- package/src/economy/CreatorRevenueAggregator.ts +460 -0
- package/src/economy/InvisibleWallet.ts +82 -0
- package/src/economy/KnowledgeMarketplace.ts +193 -0
- package/src/economy/PaymentWebhookService.ts +512 -0
- package/src/economy/RevenueSplitter.ts +156 -0
- package/src/economy/SubscriptionManager.ts +546 -0
- package/src/economy/UnifiedBudgetOptimizer.ts +635 -0
- package/src/economy/UsageMeter.ts +440 -0
- package/src/economy/_core-stubs.ts +219 -0
- package/src/economy/index.ts +100 -0
- package/src/economy/x402-facilitator.ts +1978 -0
- package/src/index.ts +348 -0
- package/src/knowledge/__tests__/knowledge-consolidator.test.ts +444 -0
- package/src/knowledge/__tests__/knowledge-store-vector.test.ts +291 -0
- package/src/knowledge/brain.ts +167 -0
- package/src/knowledge/consolidation.ts +581 -0
- package/src/knowledge/knowledge-consolidator.ts +510 -0
- package/src/knowledge/knowledge-store.ts +616 -0
- package/src/learning/MemoryConsolidator.ts +102 -0
- package/src/learning/MemoryScorer.ts +69 -0
- package/src/learning/ProceduralCompiler.ts +45 -0
- package/src/learning/SemanticClusterer.ts +66 -0
- package/src/learning/index.ts +8 -0
- package/src/llm/llm-adapter.ts +159 -0
- package/src/mesh/index.ts +309 -0
- package/src/negotiation/NegotiationProtocol.ts +694 -0
- package/src/negotiation/NegotiationTypes.ts +473 -0
- package/src/negotiation/VotingMechanisms.ts +691 -0
- package/src/negotiation/index.ts +49 -0
- package/src/protocol/goal-synthesizer.ts +317 -0
- package/src/protocol/implementations.ts +474 -0
- package/src/protocol/micro-phase-decomposer.ts +299 -0
- package/src/protocol/micro-step-decomposer.test.ts +306 -0
- package/src/protocol-agent.test.ts +353 -0
- package/src/protocol-agent.ts +670 -0
- package/src/self-improve/absorb-scanner.ts +252 -0
- package/src/self-improve/evolution-engine.ts +149 -0
- package/src/self-improve/framework-absorber.ts +214 -0
- package/src/self-improve/index.ts +50 -0
- package/src/self-improve/prompt-optimizer.ts +212 -0
- package/src/self-improve/test-generator.ts +175 -0
- package/src/skill-router.ts +186 -0
- package/src/skills/index.ts +5 -0
- package/src/skills/skill-md-bridge.ts +1699 -0
- package/src/swarm/ACOEngine.ts +261 -0
- package/src/swarm/CollectiveIntelligence.ts +383 -0
- package/src/swarm/ContributionSynthesizer.ts +481 -0
- package/src/swarm/LeaderElection.ts +393 -0
- package/src/swarm/PSOEngine.ts +206 -0
- package/src/swarm/QuorumPolicy.ts +173 -0
- package/src/swarm/SwarmCoordinator.ts +335 -0
- package/src/swarm/SwarmManager.ts +442 -0
- package/src/swarm/SwarmMembership.ts +456 -0
- package/src/swarm/VotingRound.ts +255 -0
- package/src/swarm/__tests__/ACOEngine.prod.test.ts +164 -0
- package/src/swarm/__tests__/ACOEngine.test.ts +117 -0
- package/src/swarm/__tests__/CollectiveIntelligence.prod.test.ts +296 -0
- package/src/swarm/__tests__/CollectiveIntelligence.test.ts +457 -0
- package/src/swarm/__tests__/ContributionSynthesizer.prod.test.ts +269 -0
- package/src/swarm/__tests__/ContributionSynthesizer.test.ts +254 -0
- package/src/swarm/__tests__/LeaderElection.prod.test.ts +196 -0
- package/src/swarm/__tests__/LeaderElection.test.ts +151 -0
- package/src/swarm/__tests__/PSOEngine.prod.test.ts +162 -0
- package/src/swarm/__tests__/PSOEngine.test.ts +106 -0
- package/src/swarm/__tests__/QuorumPolicy.prod.test.ts +216 -0
- package/src/swarm/__tests__/QuorumPolicy.test.ts +177 -0
- package/src/swarm/__tests__/SwarmCoordinator.prod.test.ts +186 -0
- package/src/swarm/__tests__/SwarmCoordinator.test.ts +167 -0
- package/src/swarm/__tests__/SwarmManager.prod.test.ts +308 -0
- package/src/swarm/__tests__/SwarmManager.test.ts +373 -0
- package/src/swarm/__tests__/SwarmMembership.prod.test.ts +273 -0
- package/src/swarm/__tests__/SwarmMembership.test.ts +264 -0
- package/src/swarm/__tests__/VotingRound.prod.test.ts +233 -0
- package/src/swarm/__tests__/VotingRound.test.ts +174 -0
- package/src/swarm/analytics/SwarmInspector.ts +476 -0
- package/src/swarm/analytics/SwarmMetrics.ts +449 -0
- package/src/swarm/analytics/__tests__/SwarmInspector.prod.test.ts +366 -0
- package/src/swarm/analytics/__tests__/SwarmInspector.test.ts +454 -0
- package/src/swarm/analytics/__tests__/SwarmMetrics.prod.test.ts +254 -0
- package/src/swarm/analytics/__tests__/SwarmMetrics.test.ts +370 -0
- package/src/swarm/analytics/index.ts +7 -0
- package/src/swarm/index.ts +69 -0
- package/src/swarm/messaging/BroadcastChannel.ts +509 -0
- package/src/swarm/messaging/GossipProtocol.ts +565 -0
- package/src/swarm/messaging/SwarmEventBus.ts +443 -0
- package/src/swarm/messaging/__tests__/BroadcastChannel.prod.test.ts +331 -0
- package/src/swarm/messaging/__tests__/BroadcastChannel.test.ts +333 -0
- package/src/swarm/messaging/__tests__/GossipProtocol.prod.test.ts +356 -0
- package/src/swarm/messaging/__tests__/GossipProtocol.test.ts +437 -0
- package/src/swarm/messaging/__tests__/SwarmEventBus.prod.test.ts +191 -0
- package/src/swarm/messaging/__tests__/SwarmEventBus.test.ts +247 -0
- package/src/swarm/messaging/index.ts +8 -0
- package/src/swarm/spatial/FlockingBehavior.ts +462 -0
- package/src/swarm/spatial/FormationController.ts +500 -0
- package/src/swarm/spatial/Vector3.ts +170 -0
- package/src/swarm/spatial/ZoneClaiming.ts +509 -0
- package/src/swarm/spatial/__tests__/FlockingBehavior.prod.test.ts +239 -0
- package/src/swarm/spatial/__tests__/FlockingBehavior.test.ts +298 -0
- package/src/swarm/spatial/__tests__/FormationController.prod.test.ts +240 -0
- package/src/swarm/spatial/__tests__/FormationController.test.ts +297 -0
- package/src/swarm/spatial/__tests__/Vector3.prod.test.ts +283 -0
- package/src/swarm/spatial/__tests__/Vector3.test.ts +224 -0
- package/src/swarm/spatial/__tests__/ZoneClaiming.prod.test.ts +246 -0
- package/src/swarm/spatial/__tests__/ZoneClaiming.test.ts +374 -0
- package/src/swarm/spatial/index.ts +28 -0
- package/src/team.ts +1245 -0
- package/src/training/LRScheduler.ts +377 -0
- package/src/training/QualityScoringPipeline.ts +139 -0
- package/src/training/SoftDedup.ts +461 -0
- package/src/training/SparsityMonitor.ts +685 -0
- package/src/training/SparsityMonitorTypes.ts +209 -0
- package/src/training/SpatialTrainingDataGenerator.ts +1526 -0
- package/src/training/SpatialTrainingDataTypes.ts +216 -0
- package/src/training/TrainingPipelineConfig.ts +215 -0
- package/src/training/constants.ts +94 -0
- package/src/training/index.ts +138 -0
- package/src/training/schema.ts +147 -0
- package/src/training/scripts/generate-novel-use-cases-dataset.ts +272 -0
- package/src/training/scripts/generate-spatial-dataset.ts +521 -0
- package/src/training/training/data/novel-use-cases.jsonl +153 -0
- package/src/training/training/data/spatial-reasoning-10k.jsonl +9354 -0
- package/src/training/trainingmonkey/TrainingMonkeyIntegration.ts +477 -0
- package/src/training/trainingmonkey/TrainingMonkeyTypes.ts +230 -0
- package/src/training/trainingmonkey/index.ts +26 -0
- package/src/training/trait-mappings.ts +157 -0
- package/src/types/core-stubs.d.ts +113 -0
- package/src/types.ts +304 -0
- package/test-output.txt +0 -0
- package/test-result.json +1 -0
- package/tsc-errors.txt +4 -0
- package/tsc_output.txt +0 -0
- package/tsconfig.json +14 -0
- package/tsup-learning-esm.config.ts +12 -0
- package/tsup.config.ts +21 -0
- package/typescript-errors-2.txt +0 -0
- package/typescript-errors.txt +22 -0
- package/vitest-log-utf8.txt +268 -0
- package/vitest-log.txt +0 -0
- package/vitest.config.ts +8 -0
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CreatorRevenueAggregator — Earnings tracking and revenue sharing
|
|
3
|
+
*
|
|
4
|
+
* Tracks earnings by creator, plugin, and time period from LedgerEntry records.
|
|
5
|
+
* Calculates revenue shares and maintains payout history.
|
|
6
|
+
*
|
|
7
|
+
* Part of HoloScript v5.8 "Live Economy".
|
|
8
|
+
*
|
|
9
|
+
* @version 1.0.0
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { TelemetryCollector } from './_core-stubs';
|
|
13
|
+
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// TYPES
|
|
16
|
+
// =============================================================================
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* A revenue event from a tool call or resource access.
|
|
20
|
+
*/
|
|
21
|
+
export interface RevenueEvent {
|
|
22
|
+
/** Unique event ID */
|
|
23
|
+
id: string;
|
|
24
|
+
/** Creator who earned revenue */
|
|
25
|
+
creatorId: string;
|
|
26
|
+
/** Plugin or tool that generated the revenue */
|
|
27
|
+
pluginId: string;
|
|
28
|
+
/** Gross amount in USDC base units (6 decimals) */
|
|
29
|
+
grossAmount: number;
|
|
30
|
+
/** Platform fee in USDC base units */
|
|
31
|
+
platformFee: number;
|
|
32
|
+
/** Net amount (grossAmount - platformFee) */
|
|
33
|
+
netAmount: number;
|
|
34
|
+
/** Timestamp (ms since epoch) */
|
|
35
|
+
timestamp: number;
|
|
36
|
+
/** Payer (agent or user) */
|
|
37
|
+
payerId: string;
|
|
38
|
+
/** Related ledger entry ID */
|
|
39
|
+
ledgerEntryId?: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Aggregated earnings for a creator.
|
|
44
|
+
*/
|
|
45
|
+
export interface CreatorEarnings {
|
|
46
|
+
/** Creator ID */
|
|
47
|
+
creatorId: string;
|
|
48
|
+
/** Total gross revenue (USDC base units) */
|
|
49
|
+
totalGross: number;
|
|
50
|
+
/** Total platform fees (USDC base units) */
|
|
51
|
+
totalFees: number;
|
|
52
|
+
/** Total net revenue (USDC base units) */
|
|
53
|
+
totalNet: number;
|
|
54
|
+
/** Revenue by plugin */
|
|
55
|
+
byPlugin: Map<string, PluginRevenue>;
|
|
56
|
+
/** Number of revenue events */
|
|
57
|
+
eventCount: number;
|
|
58
|
+
/** Period start (ISO 8601) */
|
|
59
|
+
periodStart: string;
|
|
60
|
+
/** Period end (ISO 8601) */
|
|
61
|
+
periodEnd: string;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Revenue breakdown for a specific plugin.
|
|
66
|
+
*/
|
|
67
|
+
export interface PluginRevenue {
|
|
68
|
+
/** Plugin ID */
|
|
69
|
+
pluginId: string;
|
|
70
|
+
/** Gross revenue */
|
|
71
|
+
grossAmount: number;
|
|
72
|
+
/** Platform fee */
|
|
73
|
+
platformFee: number;
|
|
74
|
+
/** Net revenue */
|
|
75
|
+
netAmount: number;
|
|
76
|
+
/** Number of revenue events */
|
|
77
|
+
eventCount: number;
|
|
78
|
+
/** Unique payers */
|
|
79
|
+
uniquePayers: Set<string>;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Payout record.
|
|
84
|
+
*/
|
|
85
|
+
export interface PayoutRecord {
|
|
86
|
+
/** Payout ID */
|
|
87
|
+
id: string;
|
|
88
|
+
/** Creator ID */
|
|
89
|
+
creatorId: string;
|
|
90
|
+
/** Amount paid out (USDC base units) */
|
|
91
|
+
amount: number;
|
|
92
|
+
/** Payout method */
|
|
93
|
+
method: 'usdc_transfer' | 'batch_settlement' | 'manual';
|
|
94
|
+
/** Transaction hash (if on-chain) */
|
|
95
|
+
transactionHash?: string;
|
|
96
|
+
/** Payout timestamp (ISO 8601) */
|
|
97
|
+
paidAt: string;
|
|
98
|
+
/** Status */
|
|
99
|
+
status: 'pending' | 'completed' | 'failed';
|
|
100
|
+
/** Period this payout covers */
|
|
101
|
+
periodStart: string;
|
|
102
|
+
periodEnd: string;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Revenue aggregation period.
|
|
107
|
+
*/
|
|
108
|
+
export type RevenuePeriod = 'daily' | 'weekly' | 'monthly' | 'all-time';
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Revenue aggregator configuration.
|
|
112
|
+
*/
|
|
113
|
+
export interface RevenueAggregatorConfig {
|
|
114
|
+
/** Platform fee rate (0-1, e.g. 0.15 = 15%) */
|
|
115
|
+
platformFeeRate?: number;
|
|
116
|
+
/** Minimum payout threshold (USDC base units, default: 5_000_000 = $5.00) */
|
|
117
|
+
minPayoutThreshold?: number;
|
|
118
|
+
/** Maximum events to retain per creator */
|
|
119
|
+
maxEventsPerCreator?: number;
|
|
120
|
+
/** Telemetry collector */
|
|
121
|
+
telemetry?: TelemetryCollector;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// =============================================================================
|
|
125
|
+
// CREATOR REVENUE AGGREGATOR
|
|
126
|
+
// =============================================================================
|
|
127
|
+
|
|
128
|
+
export class CreatorRevenueAggregator {
|
|
129
|
+
private config: Required<Omit<RevenueAggregatorConfig, 'telemetry'>> & {
|
|
130
|
+
telemetry?: TelemetryCollector;
|
|
131
|
+
};
|
|
132
|
+
private events: Map<string, RevenueEvent[]> = new Map();
|
|
133
|
+
private payouts: PayoutRecord[] = [];
|
|
134
|
+
private eventCounter = 0;
|
|
135
|
+
|
|
136
|
+
constructor(config?: RevenueAggregatorConfig) {
|
|
137
|
+
this.config = {
|
|
138
|
+
platformFeeRate: config?.platformFeeRate ?? 0.15,
|
|
139
|
+
minPayoutThreshold: config?.minPayoutThreshold ?? 5_000_000,
|
|
140
|
+
maxEventsPerCreator: config?.maxEventsPerCreator ?? 10000,
|
|
141
|
+
telemetry: config?.telemetry,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// ===========================================================================
|
|
146
|
+
// RECORDING
|
|
147
|
+
// ===========================================================================
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Record a revenue event.
|
|
151
|
+
*/
|
|
152
|
+
recordRevenue(
|
|
153
|
+
creatorId: string,
|
|
154
|
+
pluginId: string,
|
|
155
|
+
grossAmount: number,
|
|
156
|
+
payerId: string,
|
|
157
|
+
ledgerEntryId?: string
|
|
158
|
+
): RevenueEvent {
|
|
159
|
+
const platformFee = Math.floor(grossAmount * this.config.platformFeeRate);
|
|
160
|
+
const netAmount = grossAmount - platformFee;
|
|
161
|
+
|
|
162
|
+
const event: RevenueEvent = {
|
|
163
|
+
id: `rev-${++this.eventCounter}`,
|
|
164
|
+
creatorId,
|
|
165
|
+
pluginId,
|
|
166
|
+
grossAmount,
|
|
167
|
+
platformFee,
|
|
168
|
+
netAmount,
|
|
169
|
+
timestamp: Date.now(),
|
|
170
|
+
payerId,
|
|
171
|
+
ledgerEntryId,
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
const creatorEvents = this.events.get(creatorId) ?? [];
|
|
175
|
+
creatorEvents.push(event);
|
|
176
|
+
|
|
177
|
+
// Trim if too many
|
|
178
|
+
if (creatorEvents.length > this.config.maxEventsPerCreator) {
|
|
179
|
+
creatorEvents.splice(0, creatorEvents.length - this.config.maxEventsPerCreator);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
this.events.set(creatorId, creatorEvents);
|
|
183
|
+
|
|
184
|
+
this.emitTelemetry('revenue_recorded', {
|
|
185
|
+
creatorId,
|
|
186
|
+
pluginId,
|
|
187
|
+
grossAmount,
|
|
188
|
+
netAmount,
|
|
189
|
+
payerId,
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
return event;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// ===========================================================================
|
|
196
|
+
// AGGREGATION
|
|
197
|
+
// ===========================================================================
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Get earnings for a specific creator.
|
|
201
|
+
*/
|
|
202
|
+
getCreatorEarnings(creatorId: string, period: RevenuePeriod = 'monthly'): CreatorEarnings {
|
|
203
|
+
const events = this.events.get(creatorId) ?? [];
|
|
204
|
+
const { start, end } = this.getPeriodBounds(period);
|
|
205
|
+
const filtered = events.filter((e) => e.timestamp >= start && e.timestamp < end);
|
|
206
|
+
|
|
207
|
+
const byPlugin = new Map<string, PluginRevenue>();
|
|
208
|
+
let totalGross = 0;
|
|
209
|
+
let totalFees = 0;
|
|
210
|
+
let totalNet = 0;
|
|
211
|
+
|
|
212
|
+
for (const event of filtered) {
|
|
213
|
+
totalGross += event.grossAmount;
|
|
214
|
+
totalFees += event.platformFee;
|
|
215
|
+
totalNet += event.netAmount;
|
|
216
|
+
|
|
217
|
+
let pluginRev = byPlugin.get(event.pluginId);
|
|
218
|
+
if (!pluginRev) {
|
|
219
|
+
pluginRev = {
|
|
220
|
+
pluginId: event.pluginId,
|
|
221
|
+
grossAmount: 0,
|
|
222
|
+
platformFee: 0,
|
|
223
|
+
netAmount: 0,
|
|
224
|
+
eventCount: 0,
|
|
225
|
+
uniquePayers: new Set(),
|
|
226
|
+
};
|
|
227
|
+
byPlugin.set(event.pluginId, pluginRev);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
pluginRev.grossAmount += event.grossAmount;
|
|
231
|
+
pluginRev.platformFee += event.platformFee;
|
|
232
|
+
pluginRev.netAmount += event.netAmount;
|
|
233
|
+
pluginRev.eventCount++;
|
|
234
|
+
pluginRev.uniquePayers.add(event.payerId);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
return {
|
|
238
|
+
creatorId,
|
|
239
|
+
totalGross,
|
|
240
|
+
totalFees,
|
|
241
|
+
totalNet,
|
|
242
|
+
byPlugin,
|
|
243
|
+
eventCount: filtered.length,
|
|
244
|
+
periodStart: new Date(start).toISOString(),
|
|
245
|
+
periodEnd: new Date(end).toISOString(),
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Get top creators by revenue.
|
|
251
|
+
*/
|
|
252
|
+
getTopCreators(
|
|
253
|
+
period: RevenuePeriod = 'monthly',
|
|
254
|
+
limit = 10
|
|
255
|
+
): Array<{ creatorId: string; totalNet: number; eventCount: number }> {
|
|
256
|
+
const results: Array<{ creatorId: string; totalNet: number; eventCount: number }> = [];
|
|
257
|
+
|
|
258
|
+
for (const creatorId of this.events.keys()) {
|
|
259
|
+
const earnings = this.getCreatorEarnings(creatorId, period);
|
|
260
|
+
results.push({
|
|
261
|
+
creatorId,
|
|
262
|
+
totalNet: earnings.totalNet,
|
|
263
|
+
eventCount: earnings.eventCount,
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
return results.sort((a, b) => b.totalNet - a.totalNet).slice(0, limit);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Get platform revenue (total fees collected).
|
|
272
|
+
*/
|
|
273
|
+
getPlatformRevenue(period: RevenuePeriod = 'monthly'): {
|
|
274
|
+
totalFees: number;
|
|
275
|
+
totalGross: number;
|
|
276
|
+
creatorCount: number;
|
|
277
|
+
} {
|
|
278
|
+
let totalFees = 0;
|
|
279
|
+
let totalGross = 0;
|
|
280
|
+
let creatorCount = 0;
|
|
281
|
+
|
|
282
|
+
for (const creatorId of this.events.keys()) {
|
|
283
|
+
const earnings = this.getCreatorEarnings(creatorId, period);
|
|
284
|
+
if (earnings.eventCount > 0) {
|
|
285
|
+
totalFees += earnings.totalFees;
|
|
286
|
+
totalGross += earnings.totalGross;
|
|
287
|
+
creatorCount++;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
return { totalFees, totalGross, creatorCount };
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// ===========================================================================
|
|
295
|
+
// PAYOUTS
|
|
296
|
+
// ===========================================================================
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Get creators eligible for payout (net earnings >= threshold).
|
|
300
|
+
*/
|
|
301
|
+
getPayoutEligible(
|
|
302
|
+
period: RevenuePeriod = 'monthly'
|
|
303
|
+
): Array<{ creatorId: string; amount: number }> {
|
|
304
|
+
const eligible: Array<{ creatorId: string; amount: number }> = [];
|
|
305
|
+
|
|
306
|
+
for (const creatorId of this.events.keys()) {
|
|
307
|
+
const earnings = this.getCreatorEarnings(creatorId, period);
|
|
308
|
+
const previousPayouts = this.getCreatorPayouts(creatorId, period);
|
|
309
|
+
const alreadyPaid = previousPayouts.reduce(
|
|
310
|
+
(sum, p) => sum + (p.status === 'completed' ? p.amount : 0),
|
|
311
|
+
0
|
|
312
|
+
);
|
|
313
|
+
const unpaid = earnings.totalNet - alreadyPaid;
|
|
314
|
+
|
|
315
|
+
if (unpaid >= this.config.minPayoutThreshold) {
|
|
316
|
+
eligible.push({ creatorId, amount: unpaid });
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
return eligible.sort((a, b) => b.amount - a.amount);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Record a payout to a creator.
|
|
325
|
+
*/
|
|
326
|
+
recordPayout(
|
|
327
|
+
creatorId: string,
|
|
328
|
+
amount: number,
|
|
329
|
+
method: PayoutRecord['method'],
|
|
330
|
+
transactionHash?: string
|
|
331
|
+
): PayoutRecord {
|
|
332
|
+
const now = new Date();
|
|
333
|
+
const { start, end } = this.getPeriodBounds('monthly');
|
|
334
|
+
|
|
335
|
+
const record: PayoutRecord = {
|
|
336
|
+
id: `payout-${Date.now()}-${creatorId}`,
|
|
337
|
+
creatorId,
|
|
338
|
+
amount,
|
|
339
|
+
method,
|
|
340
|
+
transactionHash,
|
|
341
|
+
paidAt: now.toISOString(),
|
|
342
|
+
status: transactionHash ? 'completed' : 'pending',
|
|
343
|
+
periodStart: new Date(start).toISOString(),
|
|
344
|
+
periodEnd: new Date(end).toISOString(),
|
|
345
|
+
};
|
|
346
|
+
|
|
347
|
+
this.payouts.push(record);
|
|
348
|
+
|
|
349
|
+
this.emitTelemetry('payout_recorded', {
|
|
350
|
+
creatorId,
|
|
351
|
+
amount,
|
|
352
|
+
method,
|
|
353
|
+
status: record.status,
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
return record;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* Update payout status.
|
|
361
|
+
*/
|
|
362
|
+
updatePayoutStatus(
|
|
363
|
+
payoutId: string,
|
|
364
|
+
status: PayoutRecord['status'],
|
|
365
|
+
transactionHash?: string
|
|
366
|
+
): boolean {
|
|
367
|
+
const payout = this.payouts.find((p) => p.id === payoutId);
|
|
368
|
+
if (!payout) return false;
|
|
369
|
+
|
|
370
|
+
payout.status = status;
|
|
371
|
+
if (transactionHash) {
|
|
372
|
+
payout.transactionHash = transactionHash;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
return true;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Get payouts for a creator.
|
|
380
|
+
*/
|
|
381
|
+
getCreatorPayouts(creatorId: string, period?: RevenuePeriod): PayoutRecord[] {
|
|
382
|
+
let filtered = this.payouts.filter((p) => p.creatorId === creatorId);
|
|
383
|
+
if (period) {
|
|
384
|
+
const { start, end } = this.getPeriodBounds(period);
|
|
385
|
+
filtered = filtered.filter((p) => {
|
|
386
|
+
const paidAt = new Date(p.paidAt).getTime();
|
|
387
|
+
return paidAt >= start && paidAt < end;
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
return filtered;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* Get all payouts.
|
|
395
|
+
*/
|
|
396
|
+
getAllPayouts(): PayoutRecord[] {
|
|
397
|
+
return [...this.payouts];
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
// ===========================================================================
|
|
401
|
+
// QUERIES
|
|
402
|
+
// ===========================================================================
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Get all tracked creator IDs.
|
|
406
|
+
*/
|
|
407
|
+
getCreatorIds(): string[] {
|
|
408
|
+
return [...this.events.keys()];
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* Get platform fee rate.
|
|
413
|
+
*/
|
|
414
|
+
getPlatformFeeRate(): number {
|
|
415
|
+
return this.config.platformFeeRate;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/**
|
|
419
|
+
* Set platform fee rate.
|
|
420
|
+
*/
|
|
421
|
+
setPlatformFeeRate(rate: number): void {
|
|
422
|
+
if (rate < 0 || rate > 1) throw new Error('Fee rate must be between 0 and 1');
|
|
423
|
+
this.config.platformFeeRate = rate;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// ===========================================================================
|
|
427
|
+
// INTERNALS
|
|
428
|
+
// ===========================================================================
|
|
429
|
+
|
|
430
|
+
private getPeriodBounds(period: RevenuePeriod): { start: number; end: number } {
|
|
431
|
+
const now = new Date();
|
|
432
|
+
switch (period) {
|
|
433
|
+
case 'daily': {
|
|
434
|
+
const start = new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
|
435
|
+
return { start: start.getTime(), end: start.getTime() + 86400_000 };
|
|
436
|
+
}
|
|
437
|
+
case 'weekly': {
|
|
438
|
+
const dayOfWeek = now.getDay();
|
|
439
|
+
const start = new Date(now.getFullYear(), now.getMonth(), now.getDate() - dayOfWeek);
|
|
440
|
+
return { start: start.getTime(), end: start.getTime() + 7 * 86400_000 };
|
|
441
|
+
}
|
|
442
|
+
case 'monthly': {
|
|
443
|
+
const start = new Date(now.getFullYear(), now.getMonth(), 1);
|
|
444
|
+
const end = new Date(now.getFullYear(), now.getMonth() + 1, 1);
|
|
445
|
+
return { start: start.getTime(), end: end.getTime() };
|
|
446
|
+
}
|
|
447
|
+
case 'all-time':
|
|
448
|
+
return { start: 0, end: Date.now() + 86400_000 };
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
private emitTelemetry(type: string, data?: Record<string, unknown>): void {
|
|
453
|
+
this.config.telemetry?.record({
|
|
454
|
+
type,
|
|
455
|
+
severity: 'info',
|
|
456
|
+
agentId: 'creator-revenue',
|
|
457
|
+
data,
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InvisibleWallet — Framework stub for zero-friction wallet abstraction.
|
|
3
|
+
*
|
|
4
|
+
* The canonical implementation lives in @holoscript/marketplace-api.
|
|
5
|
+
* This stub provides the type-compatible interface for framework consumers
|
|
6
|
+
* who don't need the full viem/blockchain dependency.
|
|
7
|
+
*
|
|
8
|
+
* For full blockchain operations, use:
|
|
9
|
+
* import { InvisibleWallet } from '@holoscript/marketplace-api';
|
|
10
|
+
*
|
|
11
|
+
* FW-0.6 — Moved wallet interface into framework.
|
|
12
|
+
*
|
|
13
|
+
* @module economy/InvisibleWallet
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// TYPES (compatible with marketplace-api's InvisibleWallet)
|
|
18
|
+
// =============================================================================
|
|
19
|
+
|
|
20
|
+
export type HexAddress = `0x${string}`;
|
|
21
|
+
|
|
22
|
+
export interface InvisibleWalletConfig {
|
|
23
|
+
/** Use testnet instead of mainnet */
|
|
24
|
+
testnet?: boolean;
|
|
25
|
+
/** Custom RPC URL */
|
|
26
|
+
rpcUrl?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface WalletInfo {
|
|
30
|
+
address: HexAddress;
|
|
31
|
+
chainId: number;
|
|
32
|
+
isTestnet: boolean;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// =============================================================================
|
|
36
|
+
// INVISIBLE WALLET STUB
|
|
37
|
+
// =============================================================================
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Lightweight InvisibleWallet for framework consumers.
|
|
41
|
+
*
|
|
42
|
+
* Provides address management and config without blockchain dependencies.
|
|
43
|
+
* For signing transactions, use the full implementation from marketplace-api.
|
|
44
|
+
*/
|
|
45
|
+
export class InvisibleWalletStub {
|
|
46
|
+
private address: HexAddress;
|
|
47
|
+
private chainId: number;
|
|
48
|
+
private isTestnet: boolean;
|
|
49
|
+
|
|
50
|
+
constructor(address: HexAddress, config: InvisibleWalletConfig = {}) {
|
|
51
|
+
this.address = address;
|
|
52
|
+
this.isTestnet = config.testnet ?? false;
|
|
53
|
+
this.chainId = this.isTestnet ? 84531 : 8453; // Base Goerli / Base Mainnet
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Create from an address string (no private key needed for read-only).
|
|
58
|
+
*/
|
|
59
|
+
static fromAddress(address: string, config: InvisibleWalletConfig = {}): InvisibleWalletStub {
|
|
60
|
+
const hex = address.startsWith('0x') ? address : `0x${address}`;
|
|
61
|
+
return new InvisibleWalletStub(hex as HexAddress, config);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Get the wallet address */
|
|
65
|
+
getAddress(): HexAddress {
|
|
66
|
+
return this.address;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Get chain ID */
|
|
70
|
+
getChainId(): number {
|
|
71
|
+
return this.chainId;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Get wallet info */
|
|
75
|
+
getInfo(): WalletInfo {
|
|
76
|
+
return {
|
|
77
|
+
address: this.address,
|
|
78
|
+
chainId: this.chainId,
|
|
79
|
+
isTestnet: this.isTestnet,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|