@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,616 @@
1
+ /**
2
+ * Knowledge Store — Local-first with remote federation
3
+ *
4
+ * Local mode: in-memory Map + optional JSON persistence (default)
5
+ * Remote mode: delegates to MCP Orchestrator knowledge/query + knowledge/sync
6
+ *
7
+ * The store shape aligns with MeshKnowledgeEntry from holomesh/types.ts.
8
+ * W/P/G taxonomy follows agent-protocol's PWGEntry format.
9
+ */
10
+
11
+ import type { KnowledgeConfig, KnowledgeInsight } from '../types';
12
+ import { applyHalfLifeDecay, computeExcitability } from './brain';
13
+ import type { KnowledgeDomain, ExcitabilityMetadata } from './brain';
14
+ import { KnowledgeMarketplace } from '../economy/KnowledgeMarketplace';
15
+ import type { KnowledgeListing, PurchaseResult, ListingResult } from '../economy/KnowledgeMarketplace';
16
+
17
+ export interface StoredEntry extends KnowledgeInsight {
18
+ id: string;
19
+ queryCount: number;
20
+ reuseCount: number;
21
+ createdAt: string;
22
+ authorAgent: string;
23
+ taskId?: string;
24
+ cycleId?: string;
25
+ verifierId?: string;
26
+ /** Provenance hash — chain of custody */
27
+ provenanceHash?: string;
28
+ /** Excitability metadata for brain-aware ranking */
29
+ excitability?: ExcitabilityMetadata;
30
+ }
31
+
32
+ /** Result from the vector embedding pipeline. */
33
+ export interface EmbedResult {
34
+ entryId: string;
35
+ synced: boolean;
36
+ /** Remote entry ID returned by orchestrator (if synced). */
37
+ remoteId?: string;
38
+ }
39
+
40
+ /** Options for semantic search. */
41
+ export interface SemanticSearchOptions {
42
+ limit?: number;
43
+ type?: 'wisdom' | 'pattern' | 'gotcha';
44
+ /** Minimum confidence threshold (0-1). */
45
+ minConfidence?: number;
46
+ /** When true, merge remote results with local keyword fallback. */
47
+ hybridSearch?: boolean;
48
+ }
49
+
50
+ export class KnowledgeStore {
51
+ private entries: Map<string, StoredEntry> = new Map();
52
+ private config: KnowledgeConfig;
53
+ private nextId = 1;
54
+
55
+ constructor(config: KnowledgeConfig) {
56
+ this.config = config;
57
+ if (config.persist && config.path) {
58
+ this.loadFromDisk();
59
+ }
60
+ }
61
+
62
+ /** Publish a knowledge entry. Deduplicates by normalized content. */
63
+ publish(
64
+ insight: KnowledgeInsight,
65
+ authorAgent: string,
66
+ provenance?: { taskId?: string; cycleId?: string; verifierId?: string; provenanceHash?: string }
67
+ ): StoredEntry {
68
+ const prefix = insight.type === 'wisdom' ? 'W' : insight.type === 'pattern' ? 'P' : 'G';
69
+ const domain = insight.domain.toUpperCase().replace(/[^A-Z0-9]/g, '').slice(0, 8);
70
+ const id = `${prefix}.${domain}.${String(this.nextId++).padStart(3, '0')}`;
71
+
72
+ const norm = insight.content.toLowerCase().replace(/[^a-z0-9]+/g, ' ').trim().slice(0, 100);
73
+ for (const existing of this.entries.values()) {
74
+ const existingNorm = existing.content.toLowerCase().replace(/[^a-z0-9]+/g, ' ').trim().slice(0, 100);
75
+ if (existingNorm === norm) return existing;
76
+ }
77
+
78
+ const entry: StoredEntry = {
79
+ ...insight,
80
+ id,
81
+ queryCount: 0,
82
+ reuseCount: 0,
83
+ createdAt: new Date().toISOString(),
84
+ authorAgent,
85
+ taskId: provenance?.taskId,
86
+ cycleId: provenance?.cycleId,
87
+ verifierId: provenance?.verifierId,
88
+ provenanceHash: provenance?.provenanceHash,
89
+ };
90
+ this.entries.set(id, entry);
91
+ this.persistIfEnabled();
92
+ return entry;
93
+ }
94
+
95
+ /** Search entries by keyword with excitability + half-life decay ranking. */
96
+ search(query: string, limit = 10): StoredEntry[] {
97
+ const keywords = query.toLowerCase().split(/\s+/).filter(w => w.length > 2);
98
+ if (keywords.length === 0) return this.recent(limit);
99
+
100
+ const now = Date.now();
101
+ const scored: Array<{ entry: StoredEntry; score: number }> = [];
102
+ for (const entry of this.entries.values()) {
103
+ const text = `${entry.content} ${entry.domain} ${entry.type}`.toLowerCase();
104
+ let score = 0;
105
+ for (const kw of keywords) {
106
+ if (text.includes(kw)) score += 1;
107
+ }
108
+ if (score > 0) {
109
+ score += entry.confidence * 0.5;
110
+ score += Math.min(entry.reuseCount, 10) * 0.1;
111
+
112
+ // Excitability boost (neuroscience model)
113
+ if (entry.excitability) {
114
+ score += computeExcitability(entry.excitability) * 0.01;
115
+ }
116
+
117
+ // Half-life decay — older entries in fast-decay domains score lower
118
+ const domain = entry.domain as KnowledgeDomain;
119
+ const ageMs = now - new Date(entry.createdAt).getTime();
120
+ if (ageMs > 0) {
121
+ score = applyHalfLifeDecay(score, ageMs, domain);
122
+ }
123
+
124
+ entry.queryCount++;
125
+ // Update excitability on retrieval
126
+ if (entry.excitability) {
127
+ entry.excitability.queryCount++;
128
+ entry.excitability.lastRetrievedAt = now;
129
+ entry.excitability.excitability = computeExcitability(entry.excitability);
130
+ }
131
+
132
+ scored.push({ entry, score });
133
+ }
134
+ }
135
+
136
+ return scored
137
+ .sort((a, b) => b.score - a.score)
138
+ .slice(0, limit)
139
+ .map(s => s.entry);
140
+ }
141
+
142
+ /** Search remote knowledge store (MCP Orchestrator). */
143
+ async searchRemote(query: string, limit = 10): Promise<StoredEntry[]> {
144
+ if (!this.config.remoteUrl) return [];
145
+ try {
146
+ const res = await fetch(`${this.config.remoteUrl}/knowledge/query`, {
147
+ method: 'POST',
148
+ headers: {
149
+ 'Content-Type': 'application/json',
150
+ ...(this.config.remoteApiKey ? { 'x-mcp-api-key': this.config.remoteApiKey } : {}),
151
+ },
152
+ body: JSON.stringify({ search: query, limit, workspace_id: 'ai-ecosystem' }),
153
+ signal: AbortSignal.timeout(10_000),
154
+ });
155
+ if (!res.ok) return [];
156
+ const data = await res.json() as Array<Record<string, unknown>>;
157
+ return (Array.isArray(data) ? data : []).map(e => this.mapRemoteEntry(e));
158
+ } catch {
159
+ return [];
160
+ }
161
+ }
162
+
163
+ /** Sync local entries to remote knowledge store. */
164
+ async syncToRemote(): Promise<number> {
165
+ if (!this.config.remoteUrl || !this.config.remoteApiKey) return 0;
166
+ const entries = this.all().map(e => ({
167
+ id: e.id,
168
+ workspace_id: 'ai-ecosystem',
169
+ type: e.type,
170
+ content: e.content,
171
+ provenanceHash: e.provenanceHash || '',
172
+ metadata: {
173
+ domain: e.domain,
174
+ confidence: e.confidence,
175
+ source: e.authorAgent,
176
+ taskId: e.taskId,
177
+ cycleId: e.cycleId,
178
+ verifierId: e.verifierId
179
+ },
180
+ }));
181
+ if (entries.length === 0) return 0;
182
+ try {
183
+ const res = await fetch(`${this.config.remoteUrl}/knowledge/sync`, {
184
+ method: 'POST',
185
+ headers: {
186
+ 'Content-Type': 'application/json',
187
+ 'x-mcp-api-key': this.config.remoteApiKey,
188
+ },
189
+ body: JSON.stringify({ workspace_id: 'ai-ecosystem', entries }),
190
+ signal: AbortSignal.timeout(15_000),
191
+ });
192
+ if (!res.ok) return 0;
193
+ const data = await res.json() as { synced?: number };
194
+ return data.synced ?? entries.length;
195
+ } catch {
196
+ return 0;
197
+ }
198
+ }
199
+
200
+ // ── Vector Embedding Pipeline ──
201
+
202
+ /**
203
+ * Embed and store a knowledge entry.
204
+ *
205
+ * 1. Publishes locally (dedup, ID generation).
206
+ * 2. Syncs to MCP Orchestrator pgvector endpoint for vector embedding.
207
+ *
208
+ * The orchestrator generates embeddings server-side and stores them
209
+ * in pgvector for semantic similarity search via `/knowledge/query`.
210
+ */
211
+ async embedAndStore(
212
+ insight: KnowledgeInsight,
213
+ authorAgent: string,
214
+ provenance?: { taskId?: string; cycleId?: string; verifierId?: string; provenanceHash?: string }
215
+ ): Promise<EmbedResult> {
216
+ // Step 1: Local publish (dedup + ID assignment)
217
+ const entry = this.publish(insight, authorAgent, provenance);
218
+
219
+ // Step 2: Sync to remote for vector embedding
220
+ if (!this.config.remoteUrl || !this.config.remoteApiKey) {
221
+ return { entryId: entry.id, synced: false };
222
+ }
223
+
224
+ try {
225
+ const payload = {
226
+ workspace_id: 'ai-ecosystem',
227
+ entries: [{
228
+ id: entry.id,
229
+ workspace_id: 'ai-ecosystem',
230
+ type: entry.type,
231
+ content: entry.content,
232
+ provenanceHash: entry.provenanceHash || '',
233
+ metadata: {
234
+ domain: entry.domain,
235
+ confidence: entry.confidence,
236
+ source: entry.authorAgent,
237
+ taskId: entry.taskId,
238
+ cycleId: entry.cycleId,
239
+ verifierId: entry.verifierId,
240
+ },
241
+ }],
242
+ };
243
+
244
+ const res = await fetch(`${this.config.remoteUrl}/knowledge/sync`, {
245
+ method: 'POST',
246
+ headers: {
247
+ 'Content-Type': 'application/json',
248
+ 'x-mcp-api-key': this.config.remoteApiKey,
249
+ },
250
+ body: JSON.stringify(payload),
251
+ signal: AbortSignal.timeout(10_000),
252
+ });
253
+
254
+ if (!res.ok) {
255
+ return { entryId: entry.id, synced: false };
256
+ }
257
+
258
+ const data = await res.json() as { synced?: number; ids?: string[] };
259
+ return {
260
+ entryId: entry.id,
261
+ synced: (data.synced ?? 0) > 0,
262
+ remoteId: data.ids?.[0],
263
+ };
264
+ } catch {
265
+ return { entryId: entry.id, synced: false };
266
+ }
267
+ }
268
+
269
+ /**
270
+ * Semantic search via MCP Orchestrator pgvector.
271
+ *
272
+ * Sends the query to the orchestrator `/knowledge/query` endpoint which
273
+ * generates an embedding for the query and performs cosine similarity
274
+ * search against stored vectors.
275
+ *
276
+ * Falls back to local keyword search when remote is unavailable.
277
+ * When `hybridSearch` is true, merges remote + local results (deduped by ID).
278
+ */
279
+ async semanticSearch(query: string, options?: SemanticSearchOptions): Promise<StoredEntry[]> {
280
+ const limit = options?.limit ?? 10;
281
+ const hybridSearch = options?.hybridSearch ?? false;
282
+
283
+ // Try remote semantic search first
284
+ let remoteResults: StoredEntry[] = [];
285
+ if (this.config.remoteUrl && this.config.remoteApiKey) {
286
+ try {
287
+ const body: Record<string, unknown> = {
288
+ search: query,
289
+ limit,
290
+ workspace_id: 'ai-ecosystem',
291
+ };
292
+ if (options?.type) body.type = options.type;
293
+
294
+ const res = await fetch(`${this.config.remoteUrl}/knowledge/query`, {
295
+ method: 'POST',
296
+ headers: {
297
+ 'Content-Type': 'application/json',
298
+ 'x-mcp-api-key': this.config.remoteApiKey,
299
+ },
300
+ body: JSON.stringify(body),
301
+ signal: AbortSignal.timeout(10_000),
302
+ });
303
+
304
+ if (res.ok) {
305
+ const data = await res.json() as Array<Record<string, unknown>>;
306
+ remoteResults = (Array.isArray(data) ? data : []).map(e => this.mapRemoteEntry(e));
307
+
308
+ // Apply confidence filter
309
+ if (options?.minConfidence !== undefined) {
310
+ remoteResults = remoteResults.filter(e => e.confidence >= (options.minConfidence ?? 0));
311
+ }
312
+ }
313
+ } catch {
314
+ // Remote unavailable — fall through to local
315
+ }
316
+ }
317
+
318
+ // If we got remote results and hybrid is off, return them
319
+ if (remoteResults.length > 0 && !hybridSearch) {
320
+ return remoteResults.slice(0, limit);
321
+ }
322
+
323
+ // Local keyword search (fallback or hybrid merge)
324
+ const localResults = this.search(query, limit);
325
+
326
+ if (!hybridSearch) {
327
+ // Pure fallback — remote failed, use local
328
+ return localResults;
329
+ }
330
+
331
+ // Hybrid: merge remote + local, dedup by ID, remote wins on conflict
332
+ const seen = new Set<string>();
333
+ const merged: StoredEntry[] = [];
334
+
335
+ for (const entry of remoteResults) {
336
+ if (!seen.has(entry.id)) {
337
+ seen.add(entry.id);
338
+ merged.push(entry);
339
+ }
340
+ }
341
+ for (const entry of localResults) {
342
+ if (!seen.has(entry.id)) {
343
+ seen.add(entry.id);
344
+ merged.push(entry);
345
+ }
346
+ }
347
+
348
+ return merged.slice(0, limit);
349
+ }
350
+
351
+ /** Map a remote API response object to a StoredEntry. */
352
+ private mapRemoteEntry(e: Record<string, unknown>): StoredEntry {
353
+ const meta = (e.metadata || {}) as Record<string, unknown>;
354
+ return {
355
+ id: String(e.id || ''),
356
+ type: (e.type as StoredEntry['type']) || 'wisdom',
357
+ content: String(e.content || ''),
358
+ domain: String(e.domain || meta.domain || 'general'),
359
+ confidence: Number(e.confidence || meta.confidence || 0.5),
360
+ source: String(e.authorName || meta.source || 'remote'),
361
+ queryCount: Number(e.queryCount || 0),
362
+ reuseCount: Number(e.reuseCount || 0),
363
+ createdAt: String(e.createdAt || new Date().toISOString()),
364
+ authorAgent: String(e.authorName || meta.source || 'remote'),
365
+ taskId: e.taskId ? String(e.taskId) : (meta.taskId ? String(meta.taskId) : undefined),
366
+ cycleId: e.cycleId ? String(e.cycleId) : (meta.cycleId ? String(meta.cycleId) : undefined),
367
+ verifierId: e.verifierId ? String(e.verifierId) : (meta.verifierId ? String(meta.verifierId) : undefined),
368
+ provenanceHash: e.provenanceHash ? String(e.provenanceHash) : (meta.provenanceHash ? String(meta.provenanceHash) : undefined),
369
+ };
370
+ }
371
+
372
+ recent(limit = 10): StoredEntry[] {
373
+ return Array.from(this.entries.values())
374
+ .sort((a, b) => b.createdAt.localeCompare(a.createdAt))
375
+ .slice(0, limit);
376
+ }
377
+
378
+ byType(type: 'wisdom' | 'pattern' | 'gotcha'): StoredEntry[] {
379
+ return Array.from(this.entries.values()).filter(e => e.type === type);
380
+ }
381
+
382
+ byDomain(domain: string): StoredEntry[] {
383
+ const d = domain.toLowerCase();
384
+ return Array.from(this.entries.values()).filter(e => e.domain.toLowerCase() === d);
385
+ }
386
+
387
+ markReused(id: string): void {
388
+ const entry = this.entries.get(id);
389
+ if (entry) {
390
+ entry.reuseCount++;
391
+ this.persistIfEnabled();
392
+ }
393
+ }
394
+
395
+ get size(): number {
396
+ return this.entries.size;
397
+ }
398
+
399
+ all(): StoredEntry[] {
400
+ return Array.from(this.entries.values());
401
+ }
402
+
403
+ /** Cross-reference new insights against existing knowledge. */
404
+ compound(newInsights: KnowledgeInsight[]): number {
405
+ let crossRefs = 0;
406
+ for (const insight of newInsights) {
407
+ const related = this.search(insight.content, 3);
408
+ for (const rel of related) {
409
+ if (rel.domain !== insight.domain) {
410
+ crossRefs++;
411
+ rel.reuseCount++;
412
+ }
413
+ }
414
+ }
415
+ this.persistIfEnabled();
416
+ return crossRefs;
417
+ }
418
+
419
+ // ── Persistence ──
420
+
421
+ private persistIfEnabled(): void {
422
+ if (!this.config.persist || !this.config.path) return;
423
+ try {
424
+ const fs = require('fs') as typeof import('fs');
425
+ const dir = require('path').dirname(this.config.path) as string;
426
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
427
+ const data = {
428
+ version: 1,
429
+ nextId: this.nextId,
430
+ entries: Array.from(this.entries.values()),
431
+ };
432
+ fs.writeFileSync(this.config.path, JSON.stringify(data, null, 2), 'utf8');
433
+ } catch {
434
+ // Best-effort
435
+ }
436
+ }
437
+
438
+ private loadFromDisk(): void {
439
+ try {
440
+ const fs = require('fs') as typeof import('fs');
441
+ if (!this.config.path || !fs.existsSync(this.config.path)) return;
442
+ const raw = fs.readFileSync(this.config.path, 'utf8');
443
+ const data = JSON.parse(raw);
444
+ this.nextId = data.nextId || 1;
445
+ for (const entry of data.entries || []) {
446
+ this.entries.set(entry.id, entry);
447
+ }
448
+ } catch {
449
+ // Non-fatal
450
+ }
451
+ }
452
+
453
+ // ── Consolidation Cycle (Sleep → Promote/Evict) ──
454
+
455
+ /**
456
+ * Sleep consolidation: Move dormant hot-buffer entries to cold store.
457
+ * Entries with age > 24h and queryCount < threshold are archived.
458
+ */
459
+ async sleep(archivePath?: string): Promise<{ archived: number; evicted: number }> {
460
+ const now = Date.now();
461
+ const ARCHIVE_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours
462
+ const QUERY_THRESHOLD = 2; // Entries queried < 2 times in 24h go cold
463
+
464
+ const archived: StoredEntry[] = [];
465
+ const evicted: StoredEntry[] = [];
466
+
467
+ for (const [id, entry] of this.entries) {
468
+ const ageMs = now - new Date(entry.createdAt).getTime();
469
+ if (ageMs > ARCHIVE_AGE_MS && entry.queryCount < QUERY_THRESHOLD) {
470
+ archived.push(entry);
471
+ if (!archivePath) {
472
+ // No cold store configured; hard evict
473
+ this.entries.delete(id);
474
+ evicted.push(entry);
475
+ }
476
+ }
477
+ }
478
+
479
+ // Persist archived entries to cold store (optional DB/file)
480
+ if (archivePath && archived.length > 0) {
481
+ try {
482
+ const fs = require('fs') as typeof import('fs');
483
+ const path = require('path');
484
+ const dir = path.dirname(archivePath);
485
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
486
+ const existing = fs.existsSync(archivePath)
487
+ ? JSON.parse(fs.readFileSync(archivePath, 'utf8'))
488
+ : [];
489
+ const updated = [...existing, ...archived];
490
+ fs.writeFileSync(archivePath, JSON.stringify(updated, null, 2), 'utf8');
491
+ // Remove from hot buffer
492
+ archived.forEach(e => this.entries.delete(e.id));
493
+ } catch {
494
+ // Cold store unavailable; keep in hot buffer
495
+ }
496
+ }
497
+
498
+ return { archived: archived.length, evicted: evicted.length };
499
+ }
500
+
501
+ /**
502
+ * Wake consolidation: Restore archived entries back to hot buffer on query.
503
+ * Called by search() when a query hits cold store.
504
+ */
505
+ async wake(archivePath: string, query: string): Promise<StoredEntry[]> {
506
+ if (!archivePath) return [];
507
+ try {
508
+ const fs = require('fs') as typeof import('fs');
509
+ if (!fs.existsSync(archivePath)) return [];
510
+ const archived = JSON.parse(fs.readFileSync(archivePath, 'utf8')) as StoredEntry[];
511
+ const keywords = query.toLowerCase().split(/\s+/).filter(w => w.length > 2);
512
+
513
+ const restored: StoredEntry[] = [];
514
+ for (const entry of archived) {
515
+ const text = `${entry.content} ${entry.domain} ${entry.type}`.toLowerCase();
516
+ for (const kw of keywords) {
517
+ if (text.includes(kw)) {
518
+ this.entries.set(entry.id, entry);
519
+ entry.queryCount++;
520
+ restored.push(entry);
521
+ break;
522
+ }
523
+ }
524
+ }
525
+
526
+ // Update cold store (remove restored)
527
+ if (restored.length > 0) {
528
+ const remaining = archived.filter(e => !restored.find(r => r.id === e.id));
529
+ fs.writeFileSync(archivePath, JSON.stringify(remaining, null, 2), 'utf8');
530
+ }
531
+
532
+ return restored;
533
+ } catch {
534
+ return [];
535
+ }
536
+ }
537
+
538
+ /**
539
+ * Promote: Move a dormant entry back to hot buffer and boost its score.
540
+ * Called when an archived entry is cited or reused directly.
541
+ */
542
+ promote(id: string): boolean {
543
+ const entry = this.entries.get(id);
544
+ if (entry) {
545
+ entry.reuseCount += 2; // Promotion boost
546
+ entry.queryCount += 1;
547
+ this.persistIfEnabled();
548
+ return true;
549
+ }
550
+ return false;
551
+ }
552
+
553
+ /**
554
+ * Evict: Permanently remove an entry from both hot and cold stores.
555
+ * Called during cleanup or when an entry is marked as stale/wrong.
556
+ */
557
+ evict(id: string, archivePath?: string): boolean {
558
+ const existed = this.entries.delete(id);
559
+ if (existed) {
560
+ this.persistIfEnabled();
561
+ // TODO: Also remove from cold store if archivePath provided
562
+ }
563
+ return existed;
564
+ }
565
+
566
+ /**
567
+ * Consolidate: Full sleep+wake cycle (once per agent work session).
568
+ * Moves stale entries to cold store, restores hot entries on demand.
569
+ */
570
+ async consolidate(archivePath?: string): Promise<{ slept: number; woke: number }> {
571
+ const sleepResult = await this.sleep(archivePath);
572
+ // Wake comes on-demand via search(), not here
573
+ return { slept: sleepResult.archived + sleepResult.evicted, woke: 0 };
574
+ }
575
+
576
+ // ── Knowledge Marketplace (FW-0.6) ──
577
+
578
+ private _marketplace?: KnowledgeMarketplace;
579
+
580
+ /** Get or create the marketplace instance. */
581
+ get marketplace(): KnowledgeMarketplace {
582
+ if (!this._marketplace) {
583
+ this._marketplace = new KnowledgeMarketplace();
584
+ }
585
+ return this._marketplace;
586
+ }
587
+
588
+ /** Price a knowledge entry for sale. */
589
+ priceEntry(id: string): number | null {
590
+ const entry = this.entries.get(id);
591
+ if (!entry) return null;
592
+ return this.marketplace.priceKnowledge(entry);
593
+ }
594
+
595
+ /** List a knowledge entry for sale on the marketplace. */
596
+ listForSale(id: string, seller: string, price?: number, currency?: 'USDC' | 'credits'): ListingResult {
597
+ const entry = this.entries.get(id);
598
+ if (!entry) return { success: false, listingId: '', error: 'Entry not found' };
599
+ const finalPrice = price ?? this.marketplace.priceKnowledge(entry);
600
+ return this.marketplace.sellKnowledge(entry, finalPrice, seller, currency);
601
+ }
602
+
603
+ /** Buy a listed knowledge entry. Returns the full StoredEntry on success. */
604
+ buyListed(listingId: string, buyer: string): { purchase: PurchaseResult; entry?: StoredEntry } {
605
+ const purchase = this.marketplace.buyKnowledge(listingId, buyer);
606
+ if (!purchase.success || !purchase.entryId) return { purchase };
607
+ const entry = this.entries.get(purchase.entryId);
608
+ if (entry) entry.reuseCount++;
609
+ return { purchase, entry };
610
+ }
611
+
612
+ /** Get active marketplace listings. */
613
+ activeListings(): KnowledgeListing[] {
614
+ return this.marketplace.activeListings();
615
+ }
616
+ }