@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,252 @@
1
+ /**
2
+ * Absorb Scanner — Framework scans its own codebase for improvements.
3
+ *
4
+ * Queries the MCP Orchestrator knowledge store for framework-related
5
+ * insights, and scans local source files for TODO/FIXME markers.
6
+ *
7
+ * Does NOT depend on the absorb service being up — the orchestrator's
8
+ * knowledge store is the source of truth (always available).
9
+ */
10
+
11
+ import { execSync } from 'child_process';
12
+ import { resolve } from 'path';
13
+
14
+ export interface AbsorbScanConfig {
15
+ /** MCP Orchestrator URL (default: production) */
16
+ orchestratorUrl?: string;
17
+ /** MCP API key for orchestrator auth */
18
+ mcpApiKey?: string;
19
+ /** Workspace ID for knowledge queries (default: ai-ecosystem) */
20
+ workspaceId?: string;
21
+ /** Max improvement tasks to generate */
22
+ maxTasks?: number;
23
+ /** Search query for knowledge store */
24
+ searchQuery?: string;
25
+ }
26
+
27
+ export interface ScanResult {
28
+ scanned: boolean;
29
+ filesAnalyzed: number;
30
+ issuesFound: number;
31
+ improvements: ImprovementTask[];
32
+ knowledge: ExtractedKnowledge[];
33
+ error?: string;
34
+ }
35
+
36
+ export interface ImprovementTask {
37
+ title: string;
38
+ description: string;
39
+ priority: number;
40
+ category: 'refactor' | 'test' | 'docs' | 'performance' | 'type-safety';
41
+ file?: string;
42
+ line?: number;
43
+ }
44
+
45
+ export interface ExtractedKnowledge {
46
+ type: 'wisdom' | 'pattern' | 'gotcha';
47
+ content: string;
48
+ domain: string;
49
+ confidence: number;
50
+ }
51
+
52
+ const DEFAULT_ORCHESTRATOR_URL = 'https://mcp-orchestrator-production-45f9.up.railway.app';
53
+ const DEFAULT_WORKSPACE_ID = 'ai-ecosystem';
54
+
55
+ /** Orchestrator knowledge entry shape */
56
+ interface KnowledgeEntry {
57
+ id?: string;
58
+ type?: 'wisdom' | 'pattern' | 'gotcha';
59
+ content?: string;
60
+ metadata?: {
61
+ domain?: string;
62
+ confidence?: number;
63
+ source?: string;
64
+ };
65
+ }
66
+
67
+ /**
68
+ * Scan the framework via the MCP Orchestrator knowledge store.
69
+ * Returns improvement tasks + extracted knowledge.
70
+ * Falls back gracefully if the orchestrator is unreachable.
71
+ */
72
+ export async function scanFramework(config: AbsorbScanConfig = {}): Promise<ScanResult> {
73
+ const orchestratorUrl = config.orchestratorUrl || DEFAULT_ORCHESTRATOR_URL;
74
+ const apiKey = config.mcpApiKey || process.env.MCP_API_KEY || '';
75
+ const workspaceId = config.workspaceId || DEFAULT_WORKSPACE_ID;
76
+ const maxTasks = config.maxTasks || 20;
77
+ const searchQuery = config.searchQuery ||
78
+ 'framework improvement opportunities type-safety test-coverage refactoring agents';
79
+
80
+ if (!apiKey) {
81
+ return {
82
+ scanned: false,
83
+ filesAnalyzed: 0,
84
+ issuesFound: 0,
85
+ improvements: [],
86
+ knowledge: [],
87
+ error: 'MCP_API_KEY required for knowledge store query',
88
+ };
89
+ }
90
+
91
+ try {
92
+ const queryRes = await fetch(`${orchestratorUrl}/knowledge/query`, {
93
+ method: 'POST',
94
+ headers: {
95
+ 'Content-Type': 'application/json',
96
+ 'x-mcp-api-key': apiKey,
97
+ },
98
+ body: JSON.stringify({
99
+ search: searchQuery,
100
+ limit: maxTasks,
101
+ workspace_id: workspaceId,
102
+ }),
103
+ signal: AbortSignal.timeout(15_000),
104
+ });
105
+
106
+ const improvements: ImprovementTask[] = [];
107
+ const knowledge: ExtractedKnowledge[] = [];
108
+ let filesAnalyzed = 0;
109
+
110
+ if (queryRes.ok) {
111
+ const data = await queryRes.json() as {
112
+ results?: KnowledgeEntry[];
113
+ entries?: KnowledgeEntry[];
114
+ };
115
+ const entries = data.results || data.entries || [];
116
+ filesAnalyzed = entries.length;
117
+
118
+ for (const entry of entries.slice(0, maxTasks)) {
119
+ const content = entry.content || '';
120
+ const entryType = entry.type || 'pattern';
121
+ const domain = entry.metadata?.domain || 'framework';
122
+ const confidence = entry.metadata?.confidence ?? 0.5;
123
+
124
+ // Skip gated entries that we can't read
125
+ if (content.includes('[Requires API key')) continue;
126
+
127
+ // Gotchas become improvement tasks (things to fix)
128
+ if (entryType === 'gotcha') {
129
+ improvements.push({
130
+ title: content.slice(0, 120),
131
+ description: `Knowledge store gotcha (${domain}): ${content.slice(0, 300)}`,
132
+ priority: 2,
133
+ category: categorizeContent(content),
134
+ });
135
+ }
136
+
137
+ // All entries become extracted knowledge
138
+ knowledge.push({
139
+ type: entryType,
140
+ content: content.slice(0, 500),
141
+ domain,
142
+ confidence,
143
+ });
144
+ }
145
+ }
146
+
147
+ return {
148
+ scanned: true,
149
+ filesAnalyzed,
150
+ issuesFound: improvements.length,
151
+ improvements,
152
+ knowledge,
153
+ };
154
+ } catch (err) {
155
+ return {
156
+ scanned: false,
157
+ filesAnalyzed: 0,
158
+ issuesFound: 0,
159
+ improvements: [],
160
+ knowledge: [],
161
+ error: err instanceof Error ? err.message : String(err),
162
+ };
163
+ }
164
+ }
165
+
166
+ /**
167
+ * Scan local source files for TODO/FIXME/HACK markers.
168
+ * Returns improvement tasks derived from code comments.
169
+ */
170
+ export async function scanTodos(codebasePath: string): Promise<ScanResult> {
171
+ const absPath = resolve(codebasePath);
172
+ const improvements: ImprovementTask[] = [];
173
+
174
+ try {
175
+ // Use grep to find TODO/FIXME/HACK across .ts/.tsx files
176
+ // grep returns exit code 1 when no matches (not an error)
177
+ let grepOutput = '';
178
+ try {
179
+ grepOutput = execSync(
180
+ `grep -rn --include="*.ts" --include="*.tsx" -E "(TODO|FIXME|HACK):" "${absPath}"`,
181
+ { encoding: 'utf-8', timeout: 10_000, maxBuffer: 1024 * 1024 }
182
+ );
183
+ } catch (grepErr: unknown) {
184
+ // grep exits 1 when no matches — that's fine
185
+ const execErr = grepErr as { status?: number; stdout?: string };
186
+ if (execErr.status === 1) {
187
+ grepOutput = execErr.stdout || '';
188
+ } else {
189
+ throw grepErr;
190
+ }
191
+ }
192
+
193
+ const lines = grepOutput.split('\n').filter(Boolean);
194
+
195
+ for (const line of lines) {
196
+ // Format: filepath:linenum:content
197
+ const match = line.match(/^(.+?):(\d+):(.+)$/);
198
+ if (!match) continue;
199
+
200
+ const [, filePath, lineStr, content] = match;
201
+ const lineNum = parseInt(lineStr, 10);
202
+ const trimmed = content.trim();
203
+
204
+ // Extract the marker type
205
+ const isFixme = trimmed.includes('FIXME');
206
+ const isHack = trimmed.includes('HACK');
207
+
208
+ // Extract the comment text after the marker
209
+ const markerMatch = trimmed.match(/(?:TODO|FIXME|HACK):\s*(.+)/);
210
+ const commentText = markerMatch ? markerMatch[1].trim() : trimmed;
211
+
212
+ // Relativize path for readability
213
+ const relPath = filePath.replace(absPath, '').replace(/^[\\/]/, '');
214
+
215
+ improvements.push({
216
+ title: commentText.slice(0, 120),
217
+ description: `${isFixme ? 'FIXME' : isHack ? 'HACK' : 'TODO'} in ${relPath}:${lineNum}`,
218
+ priority: isFixme ? 1 : isHack ? 2 : 3,
219
+ category: categorizeContent(commentText),
220
+ file: relPath,
221
+ line: lineNum,
222
+ });
223
+ }
224
+
225
+ return {
226
+ scanned: true,
227
+ filesAnalyzed: lines.length,
228
+ issuesFound: improvements.length,
229
+ improvements,
230
+ knowledge: [],
231
+ };
232
+ } catch (err) {
233
+ return {
234
+ scanned: false,
235
+ filesAnalyzed: 0,
236
+ issuesFound: 0,
237
+ improvements: [],
238
+ knowledge: [],
239
+ error: err instanceof Error ? err.message : String(err),
240
+ };
241
+ }
242
+ }
243
+
244
+ /** Categorize content into an improvement category based on keywords. */
245
+ function categorizeContent(content: string): ImprovementTask['category'] {
246
+ const lower = content.toLowerCase();
247
+ if (lower.includes('test') || lower.includes('coverage') || lower.includes('spec')) return 'test';
248
+ if (lower.includes('perf') || lower.includes('slow') || lower.includes('optim')) return 'performance';
249
+ if (lower.includes('doc') || lower.includes('readme') || lower.includes('comment')) return 'docs';
250
+ if (lower.includes('type') || lower.includes('any') || lower.includes('cast')) return 'type-safety';
251
+ return 'refactor';
252
+ }
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Evolution Engine — The framework improves itself.
3
+ *
4
+ * The pipeline:
5
+ * 1. SCAN: Query orchestrator knowledge store + scan local TODOs
6
+ * 2. PROPOSE: Convert findings to improvement suggestions
7
+ * 3. VOTE: Team agents vote on which improvements matter
8
+ * 4. EXECUTE: Winning suggestions become board tasks
9
+ * 5. COMPOUND: Knowledge from execution feeds back into the store
10
+ *
11
+ * This is the v1.0 singularity point — the framework's own agents
12
+ * can propose, vote on, and ship improvements to themselves.
13
+ */
14
+
15
+ import type { Team } from '../team';
16
+ import type { KnowledgeInsight } from '../types';
17
+ import { scanFramework, scanTodos } from './absorb-scanner';
18
+ import type { AbsorbScanConfig, ScanResult, ImprovementTask } from './absorb-scanner';
19
+
20
+ export interface EvolutionConfig {
21
+ /** Absorb scan configuration */
22
+ absorb?: AbsorbScanConfig;
23
+ /** Path to scan for TODOs (default: none — skip TODO scan) */
24
+ codebasePath?: string;
25
+ /** Auto-propose improvements as suggestions (default: true) */
26
+ autoPropose?: boolean;
27
+ /** Auto-add high-priority improvements to board (default: false) */
28
+ autoBoard?: boolean;
29
+ /** Minimum priority to auto-board (1=critical, default: 2) */
30
+ autoBoardMinPriority?: number;
31
+ }
32
+
33
+ export interface EvolutionResult {
34
+ scan: ScanResult;
35
+ todoScan?: ScanResult;
36
+ suggestionsCreated: number;
37
+ tasksCreated: number;
38
+ knowledgePublished: number;
39
+ }
40
+
41
+ /**
42
+ * Merge two ScanResults by combining their improvements and knowledge.
43
+ */
44
+ function mergeScanResults(a: ScanResult, b: ScanResult): ScanResult {
45
+ return {
46
+ scanned: a.scanned || b.scanned,
47
+ filesAnalyzed: a.filesAnalyzed + b.filesAnalyzed,
48
+ issuesFound: a.issuesFound + b.issuesFound,
49
+ improvements: [...a.improvements, ...b.improvements],
50
+ knowledge: [...a.knowledge, ...b.knowledge],
51
+ error: a.error && b.error ? `${a.error}; ${b.error}` : a.error || b.error,
52
+ };
53
+ }
54
+
55
+ /**
56
+ * Run one evolution cycle on a team.
57
+ *
58
+ * Scans the orchestrator knowledge store and local TODOs,
59
+ * proposes improvements as suggestions, publishes extracted knowledge,
60
+ * and optionally adds high-priority items directly to the board.
61
+ */
62
+ export async function evolve(team: Team, config: EvolutionConfig = {}): Promise<EvolutionResult> {
63
+ const autoPropose = config.autoPropose !== false;
64
+ const autoBoard = config.autoBoard ?? false;
65
+ const autoBoardMinPriority = config.autoBoardMinPriority ?? 2;
66
+
67
+ // Step 1: Scan knowledge store
68
+ const knowledgeScan = await scanFramework(config.absorb);
69
+
70
+ // Step 1b: Scan local TODOs if codebasePath provided
71
+ let todoScan: ScanResult | undefined;
72
+ if (config.codebasePath) {
73
+ todoScan = await scanTodos(config.codebasePath);
74
+ }
75
+
76
+ // Merge results for unified processing
77
+ const scan = todoScan ? mergeScanResults(knowledgeScan, todoScan) : knowledgeScan;
78
+
79
+ if (!scan.scanned || (scan.improvements.length === 0 && scan.knowledge.length === 0)) {
80
+ return { scan, todoScan, suggestionsCreated: 0, tasksCreated: 0, knowledgePublished: 0 };
81
+ }
82
+
83
+ let suggestionsCreated = 0;
84
+ let tasksCreated = 0;
85
+ let knowledgePublished = 0;
86
+
87
+ // Step 2: Propose improvements as suggestions
88
+ if (autoPropose && team.isRemote) {
89
+ for (const imp of scan.improvements) {
90
+ try {
91
+ await team.suggest(imp.title, {
92
+ description: imp.description,
93
+ category: mapCategory(imp.category),
94
+ evidence: imp.file ? `Detected in ${imp.file}${imp.line ? `:${imp.line}` : ''}` : undefined,
95
+ });
96
+ suggestionsCreated++;
97
+ } catch {
98
+ // Suggestion may already exist (dedup)
99
+ }
100
+ }
101
+ }
102
+
103
+ // Step 3: Auto-board critical items
104
+ if (autoBoard) {
105
+ const critical = scan.improvements.filter(imp => imp.priority <= autoBoardMinPriority);
106
+ if (critical.length > 0) {
107
+ const tasks = critical.map(imp => ({
108
+ title: imp.title,
109
+ description: `[Self-improvement] ${imp.description}`,
110
+ priority: imp.priority,
111
+ source: 'evolution:self-scan',
112
+ role: 'coder' as const,
113
+ }));
114
+ const added = await team.addTasks(tasks);
115
+ tasksCreated = added.length;
116
+ }
117
+ }
118
+
119
+ // Step 4: Publish extracted knowledge
120
+ for (const k of scan.knowledge) {
121
+ team.knowledge.publish(
122
+ { type: k.type, content: k.content, domain: k.domain, confidence: k.confidence, source: 'evolution:self-scan' },
123
+ 'evolution-engine'
124
+ );
125
+ knowledgePublished++;
126
+ }
127
+
128
+ // Step 5: Compound
129
+ team.knowledge.compound(scan.knowledge.map(k => ({
130
+ type: k.type,
131
+ content: k.content,
132
+ domain: k.domain,
133
+ confidence: k.confidence,
134
+ source: 'evolution:self-scan',
135
+ })));
136
+
137
+ return { scan, todoScan, suggestionsCreated, tasksCreated, knowledgePublished };
138
+ }
139
+
140
+ function mapCategory(cat: ImprovementTask['category']): 'process' | 'tooling' | 'architecture' | 'testing' | 'docs' | 'performance' | 'other' {
141
+ switch (cat) {
142
+ case 'refactor': return 'architecture';
143
+ case 'test': return 'testing';
144
+ case 'docs': return 'docs';
145
+ case 'performance': return 'performance';
146
+ case 'type-safety': return 'tooling';
147
+ default: return 'other';
148
+ }
149
+ }
@@ -0,0 +1,214 @@
1
+ // STATUS: Scaffold — requires absorb service connection and LLM provider for production use
2
+ /**
3
+ * FrameworkAbsorber — Class-based absorb integration for framework self-scanning.
4
+ *
5
+ * @experimental
6
+ *
7
+ * Wraps the absorb service (https://absorb.holoscript.net) to scan the
8
+ * framework codebase, query for code health, and surface improvements.
9
+ * Falls back to the MCP Orchestrator knowledge store when the absorb
10
+ * service is unreachable.
11
+ */
12
+
13
+ import type { AbsorbScanConfig, ScanResult, ImprovementTask, ExtractedKnowledge } from './absorb-scanner';
14
+ import { scanFramework, scanTodos } from './absorb-scanner';
15
+
16
+ export interface CodebaseGraph {
17
+ /** Number of files in the graph */
18
+ fileCount: number;
19
+ /** Number of edges (dependencies) between files */
20
+ edgeCount: number;
21
+ /** Top-level modules detected */
22
+ modules: string[];
23
+ /** Raw graph data from absorb (opaque — shape depends on service version) */
24
+ raw?: unknown;
25
+ }
26
+
27
+ export interface Improvement {
28
+ id: string;
29
+ title: string;
30
+ description: string;
31
+ priority: number;
32
+ category: ImprovementTask['category'];
33
+ file?: string;
34
+ line?: number;
35
+ /** Confidence score from absorb analysis (0-1) */
36
+ confidence: number;
37
+ }
38
+
39
+ export interface AbsorberConfig extends AbsorbScanConfig {
40
+ /** Absorb service URL (default: production) */
41
+ absorbUrl?: string;
42
+ /** Absorb API key (default: ABSORB_API_KEY env var) */
43
+ absorbApiKey?: string;
44
+ /** Path to scan for local TODOs */
45
+ codebasePath?: string;
46
+ }
47
+
48
+ const DEFAULT_ABSORB_URL = 'https://absorb.holoscript.net';
49
+
50
+ /**
51
+ * FrameworkAbsorber — scans the framework codebase for improvements.
52
+ *
53
+ * @experimental
54
+ *
55
+ * Usage:
56
+ * ```ts
57
+ * const absorber = new FrameworkAbsorber({ codebasePath: 'packages/framework' });
58
+ * const graph = await absorber.scanSelf();
59
+ * const improvements = await absorber.findImprovements();
60
+ * ```
61
+ */
62
+ export class FrameworkAbsorber {
63
+ private readonly config: AbsorberConfig;
64
+ private lastScan: ScanResult | null = null;
65
+
66
+ constructor(config: AbsorberConfig = {}) {
67
+ this.config = {
68
+ absorbUrl: config.absorbUrl || DEFAULT_ABSORB_URL,
69
+ absorbApiKey: config.absorbApiKey || process.env.ABSORB_API_KEY || '',
70
+ ...config,
71
+ };
72
+ }
73
+
74
+ /**
75
+ * Scan the framework codebase via the absorb service.
76
+ * Returns a CodebaseGraph with module/dependency info.
77
+ *
78
+ * Calls absorb_run_absorb MCP tool via JSON-RPC for full graph analysis.
79
+ * Falls back to knowledge store scan if the absorb service is unreachable.
80
+ */
81
+ async scanSelf(): Promise<CodebaseGraph> {
82
+ const absorbUrl = this.config.absorbUrl || DEFAULT_ABSORB_URL;
83
+ const apiKey = this.config.absorbApiKey || '';
84
+
85
+ // Try absorb service via MCP JSON-RPC
86
+ if (apiKey) {
87
+ try {
88
+ const repoUrl = this.config.codebasePath || 'packages/framework';
89
+ const rpcPayload = {
90
+ jsonrpc: '2.0' as const,
91
+ id: `absorb-scan-${Date.now()}`,
92
+ method: 'tools/call',
93
+ params: {
94
+ name: 'absorb_run_absorb',
95
+ arguments: { repo_url: repoUrl },
96
+ },
97
+ };
98
+
99
+ const res = await fetch(`${absorbUrl}/mcp`, {
100
+ method: 'POST',
101
+ headers: {
102
+ 'Content-Type': 'application/json',
103
+ Authorization: `Bearer ${apiKey}`,
104
+ },
105
+ body: JSON.stringify(rpcPayload),
106
+ signal: AbortSignal.timeout(30_000),
107
+ });
108
+
109
+ if (res.ok) {
110
+ const rpcResult = (await res.json()) as {
111
+ result?: {
112
+ content?: Array<{ text?: string }>;
113
+ };
114
+ error?: { message?: string };
115
+ };
116
+
117
+ if (rpcResult.result?.content) {
118
+ // Parse the absorb graph from the MCP response
119
+ const raw = rpcResult.result.content;
120
+ const textContent = raw.find(c => c.text)?.text;
121
+ let parsed: Record<string, unknown> = {};
122
+ if (textContent) {
123
+ try {
124
+ parsed = JSON.parse(textContent) as Record<string, unknown>;
125
+ } catch {
126
+ // Text response not JSON — use as-is
127
+ parsed = { text: textContent };
128
+ }
129
+ }
130
+
131
+ return {
132
+ fileCount: typeof parsed.file_count === 'number'
133
+ ? parsed.file_count
134
+ : typeof parsed.files === 'number'
135
+ ? parsed.files
136
+ : 0,
137
+ edgeCount: typeof parsed.edge_count === 'number'
138
+ ? parsed.edge_count
139
+ : typeof parsed.edges === 'number'
140
+ ? parsed.edges
141
+ : 0,
142
+ modules: Array.isArray(parsed.modules)
143
+ ? parsed.modules as string[]
144
+ : [],
145
+ raw: parsed,
146
+ };
147
+ }
148
+ }
149
+ } catch {
150
+ // Absorb service unreachable — fall through to knowledge store
151
+ }
152
+ }
153
+
154
+ // Fallback: scan via knowledge store
155
+ const scan = await scanFramework(this.config);
156
+ this.lastScan = scan;
157
+
158
+ return {
159
+ fileCount: scan.filesAnalyzed,
160
+ edgeCount: 0,
161
+ modules: [],
162
+ };
163
+ }
164
+
165
+ /**
166
+ * Find improvements by scanning knowledge store + local TODOs.
167
+ * Returns ranked improvement list with confidence scores.
168
+ */
169
+ async findImprovements(): Promise<Improvement[]> {
170
+ const scan = this.lastScan || await this.runFullScan();
171
+ return scan.improvements.map((imp, i) => ({
172
+ id: `fw-imp-${i}-${Date.now()}`,
173
+ title: imp.title,
174
+ description: imp.description,
175
+ priority: imp.priority,
176
+ category: imp.category,
177
+ file: imp.file,
178
+ line: imp.line,
179
+ confidence: 0.5 + (imp.priority <= 2 ? 0.3 : 0),
180
+ }));
181
+ }
182
+
183
+ /**
184
+ * Get extracted knowledge from the last scan.
185
+ */
186
+ getKnowledge(): ExtractedKnowledge[] {
187
+ return this.lastScan?.knowledge || [];
188
+ }
189
+
190
+ /**
191
+ * Run a full scan (knowledge store + local TODOs).
192
+ */
193
+ private async runFullScan(): Promise<ScanResult> {
194
+ const knowledgeScan = await scanFramework(this.config);
195
+ let todoScan: ScanResult | undefined;
196
+
197
+ if (this.config.codebasePath) {
198
+ todoScan = await scanTodos(this.config.codebasePath);
199
+ }
200
+
201
+ const merged: ScanResult = todoScan
202
+ ? {
203
+ scanned: knowledgeScan.scanned || todoScan.scanned,
204
+ filesAnalyzed: knowledgeScan.filesAnalyzed + todoScan.filesAnalyzed,
205
+ issuesFound: knowledgeScan.issuesFound + todoScan.issuesFound,
206
+ improvements: [...knowledgeScan.improvements, ...todoScan.improvements],
207
+ knowledge: [...knowledgeScan.knowledge, ...todoScan.knowledge],
208
+ }
209
+ : knowledgeScan;
210
+
211
+ this.lastScan = merged;
212
+ return merged;
213
+ }
214
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Self-Improvement Module — The framework evolves itself.
3
+ *
4
+ * @experimental All exports in this module are scaffolds (FW-1.0).
5
+ * They compile and have correct type signatures but require a live
6
+ * absorb service connection and/or LLM provider to do real work.
7
+ * Do not treat these as production-ready.
8
+ *
9
+ * FW-1.0: absorb integration, self-evolution, auto-test generation,
10
+ * prompt optimization via A/B testing.
11
+ */
12
+
13
+ export {
14
+ type AbsorbScanConfig,
15
+ type ScanResult,
16
+ type ImprovementTask,
17
+ type ExtractedKnowledge,
18
+ scanFramework,
19
+ scanTodos,
20
+ } from './absorb-scanner';
21
+
22
+ export {
23
+ type EvolutionConfig,
24
+ type EvolutionResult,
25
+ evolve,
26
+ } from './evolution-engine';
27
+
28
+ // FW-1.0: Class-based absorb integration
29
+ export {
30
+ FrameworkAbsorber,
31
+ type AbsorberConfig,
32
+ type CodebaseGraph,
33
+ type Improvement,
34
+ } from './framework-absorber';
35
+
36
+ // FW-1.0: Auto-test generation via LLM
37
+ export {
38
+ TestGenerator,
39
+ type TestGeneratorConfig,
40
+ type GeneratedTest,
41
+ } from './test-generator';
42
+
43
+ // FW-1.0: Prompt optimization via A/B testing
44
+ export {
45
+ PromptOptimizer,
46
+ type ABTestConfig,
47
+ type ABTestResult,
48
+ type PromptVariantResult,
49
+ type EvaluationCriteria,
50
+ } from './prompt-optimizer';