@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.
Files changed (329) hide show
  1. package/ALL-test-results.json +1 -0
  2. package/CHANGELOG.md +8 -0
  3. package/LICENSE +21 -0
  4. package/ROADMAP.md +175 -0
  5. package/dist/AgentManifest-CB4xM-Ma.d.cts +704 -0
  6. package/dist/AgentManifest-CB4xM-Ma.d.ts +704 -0
  7. package/dist/BehaviorTree-BrBFECv5.d.cts +103 -0
  8. package/dist/BehaviorTree-BrBFECv5.d.ts +103 -0
  9. package/dist/InvisibleWallet-BB6tFvRA.d.cts +1732 -0
  10. package/dist/InvisibleWallet-rtRrBOA8.d.ts +1732 -0
  11. package/dist/OrchestratorAgent-BvWgf9uw.d.cts +798 -0
  12. package/dist/OrchestratorAgent-Q_CbVTmO.d.ts +798 -0
  13. package/dist/agents/index.cjs +4790 -0
  14. package/dist/agents/index.d.cts +1788 -0
  15. package/dist/agents/index.d.ts +1788 -0
  16. package/dist/agents/index.js +4695 -0
  17. package/dist/ai/index.cjs +5347 -0
  18. package/dist/ai/index.d.cts +1753 -0
  19. package/dist/ai/index.d.ts +1753 -0
  20. package/dist/ai/index.js +5244 -0
  21. package/dist/behavior.cjs +449 -0
  22. package/dist/behavior.d.cts +130 -0
  23. package/dist/behavior.d.ts +130 -0
  24. package/dist/behavior.js +407 -0
  25. package/dist/economy/index.cjs +3659 -0
  26. package/dist/economy/index.d.cts +747 -0
  27. package/dist/economy/index.d.ts +747 -0
  28. package/dist/economy/index.js +3617 -0
  29. package/dist/implementations-D9T3un9D.d.cts +236 -0
  30. package/dist/implementations-D9T3un9D.d.ts +236 -0
  31. package/dist/index.cjs +24550 -0
  32. package/dist/index.d.cts +1729 -0
  33. package/dist/index.d.ts +1729 -0
  34. package/dist/index.js +24277 -0
  35. package/dist/learning/index.cjs +219 -0
  36. package/dist/learning/index.d.cts +104 -0
  37. package/dist/learning/index.d.ts +104 -0
  38. package/dist/learning/index.js +189 -0
  39. package/dist/negotiation/index.cjs +970 -0
  40. package/dist/negotiation/index.d.cts +610 -0
  41. package/dist/negotiation/index.d.ts +610 -0
  42. package/dist/negotiation/index.js +931 -0
  43. package/dist/skills/index.cjs +1118 -0
  44. package/dist/skills/index.d.cts +289 -0
  45. package/dist/skills/index.d.ts +289 -0
  46. package/dist/skills/index.js +1079 -0
  47. package/dist/swarm/index.cjs +5268 -0
  48. package/dist/swarm/index.d.cts +2433 -0
  49. package/dist/swarm/index.d.ts +2433 -0
  50. package/dist/swarm/index.js +5221 -0
  51. package/dist/training/index.cjs +2745 -0
  52. package/dist/training/index.d.cts +1734 -0
  53. package/dist/training/index.d.ts +1734 -0
  54. package/dist/training/index.js +2687 -0
  55. package/extract-failures.js +10 -0
  56. package/package.json +82 -0
  57. package/src/__tests__/bounty-marketplace.test.ts +374 -0
  58. package/src/__tests__/delegation.test.ts +144 -0
  59. package/src/__tests__/distributed-claimer.test.ts +147 -0
  60. package/src/__tests__/done-log-audit.test.ts +342 -0
  61. package/src/__tests__/framework.test.ts +865 -0
  62. package/src/__tests__/goal-synthesizer.test.ts +236 -0
  63. package/src/__tests__/presence.test.ts +223 -0
  64. package/src/__tests__/protocol-agent.test.ts +254 -0
  65. package/src/__tests__/revenue-splitter.test.ts +114 -0
  66. package/src/__tests__/scenario-driven-todo.test.ts +197 -0
  67. package/src/__tests__/self-improve.test.ts +349 -0
  68. package/src/__tests__/service-lifecycle.test.ts +237 -0
  69. package/src/__tests__/skill-router.test.ts +121 -0
  70. package/src/agents/AgentManifest.ts +493 -0
  71. package/src/agents/AgentRegistry.ts +475 -0
  72. package/src/agents/AgentTypes.ts +585 -0
  73. package/src/agents/AgentWalletRegistry.ts +83 -0
  74. package/src/agents/AuthenticatedCRDT.ts +388 -0
  75. package/src/agents/CapabilityMatcher.ts +453 -0
  76. package/src/agents/CrossRealityHandoff.ts +305 -0
  77. package/src/agents/CulturalMemory.ts +454 -0
  78. package/src/agents/FederatedRegistryAdapter.ts +429 -0
  79. package/src/agents/NormEngine.ts +450 -0
  80. package/src/agents/OrchestratorAgent.ts +414 -0
  81. package/src/agents/SkillWorkflowEngine.ts +472 -0
  82. package/src/agents/TaskDelegationService.ts +551 -0
  83. package/src/agents/__tests__/AgentManifest.prod.test.ts +134 -0
  84. package/src/agents/__tests__/AgentManifest.test.ts +182 -0
  85. package/src/agents/__tests__/AgentModule.test.ts +864 -0
  86. package/src/agents/__tests__/AgentRegistry.prod.test.ts +125 -0
  87. package/src/agents/__tests__/AgentRegistry.test.ts +148 -0
  88. package/src/agents/__tests__/AgentTypes.test.ts +534 -0
  89. package/src/agents/__tests__/AgentWalletRegistry.test.ts +152 -0
  90. package/src/agents/__tests__/AuthenticatedCRDT.test.ts +558 -0
  91. package/src/agents/__tests__/CapabilityMatcher.prod.test.ts +117 -0
  92. package/src/agents/__tests__/CapabilityMatcher.test.ts +178 -0
  93. package/src/agents/__tests__/CrossRealityHandoff.test.ts +402 -0
  94. package/src/agents/__tests__/CulturalMemory.test.ts +200 -0
  95. package/src/agents/__tests__/FederatedRegistryAdapter.test.ts +409 -0
  96. package/src/agents/__tests__/NormEngine.test.ts +276 -0
  97. package/src/agents/__tests__/OrchestratorAgent.test.ts +182 -0
  98. package/src/agents/__tests__/SkillWorkflowEngine.test.ts +357 -0
  99. package/src/agents/__tests__/TaskDelegationService.test.ts +446 -0
  100. package/src/agents/index.ts +107 -0
  101. package/src/agents/spatial-comms/Layer1RealTime.ts +621 -0
  102. package/src/agents/spatial-comms/Layer2A2A.ts +661 -0
  103. package/src/agents/spatial-comms/Layer3MCP.ts +651 -0
  104. package/src/agents/spatial-comms/ProtocolTypes.ts +543 -0
  105. package/src/agents/spatial-comms/SpatialCommClient.ts +483 -0
  106. package/src/agents/spatial-comms/__tests__/performance-benchmark.test.ts +465 -0
  107. package/src/agents/spatial-comms/examples/multi-agent-world-creation.ts +409 -0
  108. package/src/agents/spatial-comms/index.ts +66 -0
  109. package/src/ai/AIAdapter.ts +313 -0
  110. package/src/ai/AICopilot.ts +331 -0
  111. package/src/ai/AIOutputValidator.ts +203 -0
  112. package/src/ai/BTNodes.ts +239 -0
  113. package/src/ai/BehaviorSelector.ts +135 -0
  114. package/src/ai/BehaviorTree.ts +153 -0
  115. package/src/ai/Blackboard.ts +165 -0
  116. package/src/ai/GenerationAnalytics.ts +461 -0
  117. package/src/ai/GenerationCache.ts +265 -0
  118. package/src/ai/GoalPlanner.ts +165 -0
  119. package/src/ai/HoloScriptGenerator.ts +580 -0
  120. package/src/ai/InfluenceMap.ts +180 -0
  121. package/src/ai/NavMesh.ts +168 -0
  122. package/src/ai/PerceptionSystem.ts +178 -0
  123. package/src/ai/PromptTemplates.ts +453 -0
  124. package/src/ai/SemanticSearchService.ts +80 -0
  125. package/src/ai/StateMachine.ts +196 -0
  126. package/src/ai/SteeringBehavior.ts +150 -0
  127. package/src/ai/SteeringBehaviors.ts +244 -0
  128. package/src/ai/TrainingDataGenerator.ts +1082 -0
  129. package/src/ai/UtilityAI.ts +145 -0
  130. package/src/ai/__tests__/AIAdapter.prod.test.ts +259 -0
  131. package/src/ai/__tests__/AIAdapter.test.ts +109 -0
  132. package/src/ai/__tests__/AICopilot.prod.test.ts +341 -0
  133. package/src/ai/__tests__/AICopilot.test.ts +178 -0
  134. package/src/ai/__tests__/AIOutputValidator.prod.test.ts +226 -0
  135. package/src/ai/__tests__/AIOutputValidator.test.ts +138 -0
  136. package/src/ai/__tests__/BTNodes.prod.test.ts +391 -0
  137. package/src/ai/__tests__/BTNodes.test.ts +263 -0
  138. package/src/ai/__tests__/BehaviorSelector.prod.test.ts +129 -0
  139. package/src/ai/__tests__/BehaviorSelector.test.ts +132 -0
  140. package/src/ai/__tests__/BehaviorTree.prod.test.ts +266 -0
  141. package/src/ai/__tests__/BehaviorTree.test.ts +216 -0
  142. package/src/ai/__tests__/Blackboard.prod.test.ts +339 -0
  143. package/src/ai/__tests__/Blackboard.test.ts +183 -0
  144. package/src/ai/__tests__/GenerationAnalytics.prod.test.ts +141 -0
  145. package/src/ai/__tests__/GenerationAnalytics.test.ts +165 -0
  146. package/src/ai/__tests__/GenerationCache.prod.test.ts +144 -0
  147. package/src/ai/__tests__/GenerationCache.test.ts +171 -0
  148. package/src/ai/__tests__/GoalPlanner.prod.test.ts +189 -0
  149. package/src/ai/__tests__/GoalPlanner.test.ts +137 -0
  150. package/src/ai/__tests__/GoalPlannerDepth.prod.test.ts +217 -0
  151. package/src/ai/__tests__/HoloScriptGenerator.test.ts +125 -0
  152. package/src/ai/__tests__/InfluenceMap.prod.test.ts +146 -0
  153. package/src/ai/__tests__/InfluenceMap.test.ts +149 -0
  154. package/src/ai/__tests__/NavMesh.prod.test.ts +141 -0
  155. package/src/ai/__tests__/NavMesh.test.ts +159 -0
  156. package/src/ai/__tests__/PerceptionSystem.prod.test.ts +135 -0
  157. package/src/ai/__tests__/PerceptionSystem.test.ts +250 -0
  158. package/src/ai/__tests__/PromptTemplates.prod.test.ts +313 -0
  159. package/src/ai/__tests__/PromptTemplates.test.ts +146 -0
  160. package/src/ai/__tests__/SemanticSearch.test.ts +37 -0
  161. package/src/ai/__tests__/StateMachine.prod.test.ts +162 -0
  162. package/src/ai/__tests__/StateMachine.test.ts +163 -0
  163. package/src/ai/__tests__/SteeringBehavior.prod.test.ts +251 -0
  164. package/src/ai/__tests__/SteeringBehavior.test.ts +135 -0
  165. package/src/ai/__tests__/SteeringBehaviors.prod.test.ts +133 -0
  166. package/src/ai/__tests__/SteeringBehaviors.test.ts +151 -0
  167. package/src/ai/__tests__/TrainingDataGenerator.prod.test.ts +286 -0
  168. package/src/ai/__tests__/TrainingDataGenerator.test.ts +286 -0
  169. package/src/ai/__tests__/UtilityAI.prod.test.ts +207 -0
  170. package/src/ai/__tests__/UtilityAI.test.ts +155 -0
  171. package/src/ai/__tests__/adapters.prod.test.ts +263 -0
  172. package/src/ai/__tests__/adapters.test.ts +320 -0
  173. package/src/ai/adapters.ts +1585 -0
  174. package/src/ai/index.ts +130 -0
  175. package/src/behavior/BehaviorPresets.ts +140 -0
  176. package/src/behavior/BehaviorTree.ts +236 -0
  177. package/src/behavior/StateMachine.ts +176 -0
  178. package/src/behavior/StateTrait.ts +67 -0
  179. package/src/behavior/index.ts +8 -0
  180. package/src/behavior.ts +8 -0
  181. package/src/board/audit.ts +284 -0
  182. package/src/board/board-ops.ts +336 -0
  183. package/src/board/board-types.ts +302 -0
  184. package/src/board/index.ts +69 -0
  185. package/src/define-agent.ts +46 -0
  186. package/src/define-team.ts +33 -0
  187. package/src/delegation.ts +265 -0
  188. package/src/distributed-claimer.ts +228 -0
  189. package/src/economy/AgentBudgetEnforcer.ts +464 -0
  190. package/src/economy/BountyManager.ts +185 -0
  191. package/src/economy/CreatorRevenueAggregator.ts +460 -0
  192. package/src/economy/InvisibleWallet.ts +82 -0
  193. package/src/economy/KnowledgeMarketplace.ts +193 -0
  194. package/src/economy/PaymentWebhookService.ts +512 -0
  195. package/src/economy/RevenueSplitter.ts +156 -0
  196. package/src/economy/SubscriptionManager.ts +546 -0
  197. package/src/economy/UnifiedBudgetOptimizer.ts +635 -0
  198. package/src/economy/UsageMeter.ts +440 -0
  199. package/src/economy/_core-stubs.ts +219 -0
  200. package/src/economy/index.ts +100 -0
  201. package/src/economy/x402-facilitator.ts +1978 -0
  202. package/src/index.ts +348 -0
  203. package/src/knowledge/__tests__/knowledge-consolidator.test.ts +444 -0
  204. package/src/knowledge/__tests__/knowledge-store-vector.test.ts +291 -0
  205. package/src/knowledge/brain.ts +167 -0
  206. package/src/knowledge/consolidation.ts +581 -0
  207. package/src/knowledge/knowledge-consolidator.ts +510 -0
  208. package/src/knowledge/knowledge-store.ts +616 -0
  209. package/src/learning/MemoryConsolidator.ts +102 -0
  210. package/src/learning/MemoryScorer.ts +69 -0
  211. package/src/learning/ProceduralCompiler.ts +45 -0
  212. package/src/learning/SemanticClusterer.ts +66 -0
  213. package/src/learning/index.ts +8 -0
  214. package/src/llm/llm-adapter.ts +159 -0
  215. package/src/mesh/index.ts +309 -0
  216. package/src/negotiation/NegotiationProtocol.ts +694 -0
  217. package/src/negotiation/NegotiationTypes.ts +473 -0
  218. package/src/negotiation/VotingMechanisms.ts +691 -0
  219. package/src/negotiation/index.ts +49 -0
  220. package/src/protocol/goal-synthesizer.ts +317 -0
  221. package/src/protocol/implementations.ts +474 -0
  222. package/src/protocol/micro-phase-decomposer.ts +299 -0
  223. package/src/protocol/micro-step-decomposer.test.ts +306 -0
  224. package/src/protocol-agent.test.ts +353 -0
  225. package/src/protocol-agent.ts +670 -0
  226. package/src/self-improve/absorb-scanner.ts +252 -0
  227. package/src/self-improve/evolution-engine.ts +149 -0
  228. package/src/self-improve/framework-absorber.ts +214 -0
  229. package/src/self-improve/index.ts +50 -0
  230. package/src/self-improve/prompt-optimizer.ts +212 -0
  231. package/src/self-improve/test-generator.ts +175 -0
  232. package/src/skill-router.ts +186 -0
  233. package/src/skills/index.ts +5 -0
  234. package/src/skills/skill-md-bridge.ts +1699 -0
  235. package/src/swarm/ACOEngine.ts +261 -0
  236. package/src/swarm/CollectiveIntelligence.ts +383 -0
  237. package/src/swarm/ContributionSynthesizer.ts +481 -0
  238. package/src/swarm/LeaderElection.ts +393 -0
  239. package/src/swarm/PSOEngine.ts +206 -0
  240. package/src/swarm/QuorumPolicy.ts +173 -0
  241. package/src/swarm/SwarmCoordinator.ts +335 -0
  242. package/src/swarm/SwarmManager.ts +442 -0
  243. package/src/swarm/SwarmMembership.ts +456 -0
  244. package/src/swarm/VotingRound.ts +255 -0
  245. package/src/swarm/__tests__/ACOEngine.prod.test.ts +164 -0
  246. package/src/swarm/__tests__/ACOEngine.test.ts +117 -0
  247. package/src/swarm/__tests__/CollectiveIntelligence.prod.test.ts +296 -0
  248. package/src/swarm/__tests__/CollectiveIntelligence.test.ts +457 -0
  249. package/src/swarm/__tests__/ContributionSynthesizer.prod.test.ts +269 -0
  250. package/src/swarm/__tests__/ContributionSynthesizer.test.ts +254 -0
  251. package/src/swarm/__tests__/LeaderElection.prod.test.ts +196 -0
  252. package/src/swarm/__tests__/LeaderElection.test.ts +151 -0
  253. package/src/swarm/__tests__/PSOEngine.prod.test.ts +162 -0
  254. package/src/swarm/__tests__/PSOEngine.test.ts +106 -0
  255. package/src/swarm/__tests__/QuorumPolicy.prod.test.ts +216 -0
  256. package/src/swarm/__tests__/QuorumPolicy.test.ts +177 -0
  257. package/src/swarm/__tests__/SwarmCoordinator.prod.test.ts +186 -0
  258. package/src/swarm/__tests__/SwarmCoordinator.test.ts +167 -0
  259. package/src/swarm/__tests__/SwarmManager.prod.test.ts +308 -0
  260. package/src/swarm/__tests__/SwarmManager.test.ts +373 -0
  261. package/src/swarm/__tests__/SwarmMembership.prod.test.ts +273 -0
  262. package/src/swarm/__tests__/SwarmMembership.test.ts +264 -0
  263. package/src/swarm/__tests__/VotingRound.prod.test.ts +233 -0
  264. package/src/swarm/__tests__/VotingRound.test.ts +174 -0
  265. package/src/swarm/analytics/SwarmInspector.ts +476 -0
  266. package/src/swarm/analytics/SwarmMetrics.ts +449 -0
  267. package/src/swarm/analytics/__tests__/SwarmInspector.prod.test.ts +366 -0
  268. package/src/swarm/analytics/__tests__/SwarmInspector.test.ts +454 -0
  269. package/src/swarm/analytics/__tests__/SwarmMetrics.prod.test.ts +254 -0
  270. package/src/swarm/analytics/__tests__/SwarmMetrics.test.ts +370 -0
  271. package/src/swarm/analytics/index.ts +7 -0
  272. package/src/swarm/index.ts +69 -0
  273. package/src/swarm/messaging/BroadcastChannel.ts +509 -0
  274. package/src/swarm/messaging/GossipProtocol.ts +565 -0
  275. package/src/swarm/messaging/SwarmEventBus.ts +443 -0
  276. package/src/swarm/messaging/__tests__/BroadcastChannel.prod.test.ts +331 -0
  277. package/src/swarm/messaging/__tests__/BroadcastChannel.test.ts +333 -0
  278. package/src/swarm/messaging/__tests__/GossipProtocol.prod.test.ts +356 -0
  279. package/src/swarm/messaging/__tests__/GossipProtocol.test.ts +437 -0
  280. package/src/swarm/messaging/__tests__/SwarmEventBus.prod.test.ts +191 -0
  281. package/src/swarm/messaging/__tests__/SwarmEventBus.test.ts +247 -0
  282. package/src/swarm/messaging/index.ts +8 -0
  283. package/src/swarm/spatial/FlockingBehavior.ts +462 -0
  284. package/src/swarm/spatial/FormationController.ts +500 -0
  285. package/src/swarm/spatial/Vector3.ts +170 -0
  286. package/src/swarm/spatial/ZoneClaiming.ts +509 -0
  287. package/src/swarm/spatial/__tests__/FlockingBehavior.prod.test.ts +239 -0
  288. package/src/swarm/spatial/__tests__/FlockingBehavior.test.ts +298 -0
  289. package/src/swarm/spatial/__tests__/FormationController.prod.test.ts +240 -0
  290. package/src/swarm/spatial/__tests__/FormationController.test.ts +297 -0
  291. package/src/swarm/spatial/__tests__/Vector3.prod.test.ts +283 -0
  292. package/src/swarm/spatial/__tests__/Vector3.test.ts +224 -0
  293. package/src/swarm/spatial/__tests__/ZoneClaiming.prod.test.ts +246 -0
  294. package/src/swarm/spatial/__tests__/ZoneClaiming.test.ts +374 -0
  295. package/src/swarm/spatial/index.ts +28 -0
  296. package/src/team.ts +1245 -0
  297. package/src/training/LRScheduler.ts +377 -0
  298. package/src/training/QualityScoringPipeline.ts +139 -0
  299. package/src/training/SoftDedup.ts +461 -0
  300. package/src/training/SparsityMonitor.ts +685 -0
  301. package/src/training/SparsityMonitorTypes.ts +209 -0
  302. package/src/training/SpatialTrainingDataGenerator.ts +1526 -0
  303. package/src/training/SpatialTrainingDataTypes.ts +216 -0
  304. package/src/training/TrainingPipelineConfig.ts +215 -0
  305. package/src/training/constants.ts +94 -0
  306. package/src/training/index.ts +138 -0
  307. package/src/training/schema.ts +147 -0
  308. package/src/training/scripts/generate-novel-use-cases-dataset.ts +272 -0
  309. package/src/training/scripts/generate-spatial-dataset.ts +521 -0
  310. package/src/training/training/data/novel-use-cases.jsonl +153 -0
  311. package/src/training/training/data/spatial-reasoning-10k.jsonl +9354 -0
  312. package/src/training/trainingmonkey/TrainingMonkeyIntegration.ts +477 -0
  313. package/src/training/trainingmonkey/TrainingMonkeyTypes.ts +230 -0
  314. package/src/training/trainingmonkey/index.ts +26 -0
  315. package/src/training/trait-mappings.ts +157 -0
  316. package/src/types/core-stubs.d.ts +113 -0
  317. package/src/types.ts +304 -0
  318. package/test-output.txt +0 -0
  319. package/test-result.json +1 -0
  320. package/tsc-errors.txt +4 -0
  321. package/tsc_output.txt +0 -0
  322. package/tsconfig.json +14 -0
  323. package/tsup-learning-esm.config.ts +12 -0
  324. package/tsup.config.ts +21 -0
  325. package/typescript-errors-2.txt +0 -0
  326. package/typescript-errors.txt +22 -0
  327. package/vitest-log-utf8.txt +268 -0
  328. package/vitest-log.txt +0 -0
  329. 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
+ }