@holoscript/framework 6.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ALL-test-results.json +1 -0
- package/CHANGELOG.md +8 -0
- package/LICENSE +21 -0
- package/ROADMAP.md +175 -0
- package/dist/AgentManifest-CB4xM-Ma.d.cts +704 -0
- package/dist/AgentManifest-CB4xM-Ma.d.ts +704 -0
- package/dist/BehaviorTree-BrBFECv5.d.cts +103 -0
- package/dist/BehaviorTree-BrBFECv5.d.ts +103 -0
- package/dist/InvisibleWallet-BB6tFvRA.d.cts +1732 -0
- package/dist/InvisibleWallet-rtRrBOA8.d.ts +1732 -0
- package/dist/OrchestratorAgent-BvWgf9uw.d.cts +798 -0
- package/dist/OrchestratorAgent-Q_CbVTmO.d.ts +798 -0
- package/dist/agents/index.cjs +4790 -0
- package/dist/agents/index.d.cts +1788 -0
- package/dist/agents/index.d.ts +1788 -0
- package/dist/agents/index.js +4695 -0
- package/dist/ai/index.cjs +5347 -0
- package/dist/ai/index.d.cts +1753 -0
- package/dist/ai/index.d.ts +1753 -0
- package/dist/ai/index.js +5244 -0
- package/dist/behavior.cjs +449 -0
- package/dist/behavior.d.cts +130 -0
- package/dist/behavior.d.ts +130 -0
- package/dist/behavior.js +407 -0
- package/dist/economy/index.cjs +3659 -0
- package/dist/economy/index.d.cts +747 -0
- package/dist/economy/index.d.ts +747 -0
- package/dist/economy/index.js +3617 -0
- package/dist/implementations-D9T3un9D.d.cts +236 -0
- package/dist/implementations-D9T3un9D.d.ts +236 -0
- package/dist/index.cjs +24550 -0
- package/dist/index.d.cts +1729 -0
- package/dist/index.d.ts +1729 -0
- package/dist/index.js +24277 -0
- package/dist/learning/index.cjs +219 -0
- package/dist/learning/index.d.cts +104 -0
- package/dist/learning/index.d.ts +104 -0
- package/dist/learning/index.js +189 -0
- package/dist/negotiation/index.cjs +970 -0
- package/dist/negotiation/index.d.cts +610 -0
- package/dist/negotiation/index.d.ts +610 -0
- package/dist/negotiation/index.js +931 -0
- package/dist/skills/index.cjs +1118 -0
- package/dist/skills/index.d.cts +289 -0
- package/dist/skills/index.d.ts +289 -0
- package/dist/skills/index.js +1079 -0
- package/dist/swarm/index.cjs +5268 -0
- package/dist/swarm/index.d.cts +2433 -0
- package/dist/swarm/index.d.ts +2433 -0
- package/dist/swarm/index.js +5221 -0
- package/dist/training/index.cjs +2745 -0
- package/dist/training/index.d.cts +1734 -0
- package/dist/training/index.d.ts +1734 -0
- package/dist/training/index.js +2687 -0
- package/extract-failures.js +10 -0
- package/package.json +82 -0
- package/src/__tests__/bounty-marketplace.test.ts +374 -0
- package/src/__tests__/delegation.test.ts +144 -0
- package/src/__tests__/distributed-claimer.test.ts +147 -0
- package/src/__tests__/done-log-audit.test.ts +342 -0
- package/src/__tests__/framework.test.ts +865 -0
- package/src/__tests__/goal-synthesizer.test.ts +236 -0
- package/src/__tests__/presence.test.ts +223 -0
- package/src/__tests__/protocol-agent.test.ts +254 -0
- package/src/__tests__/revenue-splitter.test.ts +114 -0
- package/src/__tests__/scenario-driven-todo.test.ts +197 -0
- package/src/__tests__/self-improve.test.ts +349 -0
- package/src/__tests__/service-lifecycle.test.ts +237 -0
- package/src/__tests__/skill-router.test.ts +121 -0
- package/src/agents/AgentManifest.ts +493 -0
- package/src/agents/AgentRegistry.ts +475 -0
- package/src/agents/AgentTypes.ts +585 -0
- package/src/agents/AgentWalletRegistry.ts +83 -0
- package/src/agents/AuthenticatedCRDT.ts +388 -0
- package/src/agents/CapabilityMatcher.ts +453 -0
- package/src/agents/CrossRealityHandoff.ts +305 -0
- package/src/agents/CulturalMemory.ts +454 -0
- package/src/agents/FederatedRegistryAdapter.ts +429 -0
- package/src/agents/NormEngine.ts +450 -0
- package/src/agents/OrchestratorAgent.ts +414 -0
- package/src/agents/SkillWorkflowEngine.ts +472 -0
- package/src/agents/TaskDelegationService.ts +551 -0
- package/src/agents/__tests__/AgentManifest.prod.test.ts +134 -0
- package/src/agents/__tests__/AgentManifest.test.ts +182 -0
- package/src/agents/__tests__/AgentModule.test.ts +864 -0
- package/src/agents/__tests__/AgentRegistry.prod.test.ts +125 -0
- package/src/agents/__tests__/AgentRegistry.test.ts +148 -0
- package/src/agents/__tests__/AgentTypes.test.ts +534 -0
- package/src/agents/__tests__/AgentWalletRegistry.test.ts +152 -0
- package/src/agents/__tests__/AuthenticatedCRDT.test.ts +558 -0
- package/src/agents/__tests__/CapabilityMatcher.prod.test.ts +117 -0
- package/src/agents/__tests__/CapabilityMatcher.test.ts +178 -0
- package/src/agents/__tests__/CrossRealityHandoff.test.ts +402 -0
- package/src/agents/__tests__/CulturalMemory.test.ts +200 -0
- package/src/agents/__tests__/FederatedRegistryAdapter.test.ts +409 -0
- package/src/agents/__tests__/NormEngine.test.ts +276 -0
- package/src/agents/__tests__/OrchestratorAgent.test.ts +182 -0
- package/src/agents/__tests__/SkillWorkflowEngine.test.ts +357 -0
- package/src/agents/__tests__/TaskDelegationService.test.ts +446 -0
- package/src/agents/index.ts +107 -0
- package/src/agents/spatial-comms/Layer1RealTime.ts +621 -0
- package/src/agents/spatial-comms/Layer2A2A.ts +661 -0
- package/src/agents/spatial-comms/Layer3MCP.ts +651 -0
- package/src/agents/spatial-comms/ProtocolTypes.ts +543 -0
- package/src/agents/spatial-comms/SpatialCommClient.ts +483 -0
- package/src/agents/spatial-comms/__tests__/performance-benchmark.test.ts +465 -0
- package/src/agents/spatial-comms/examples/multi-agent-world-creation.ts +409 -0
- package/src/agents/spatial-comms/index.ts +66 -0
- package/src/ai/AIAdapter.ts +313 -0
- package/src/ai/AICopilot.ts +331 -0
- package/src/ai/AIOutputValidator.ts +203 -0
- package/src/ai/BTNodes.ts +239 -0
- package/src/ai/BehaviorSelector.ts +135 -0
- package/src/ai/BehaviorTree.ts +153 -0
- package/src/ai/Blackboard.ts +165 -0
- package/src/ai/GenerationAnalytics.ts +461 -0
- package/src/ai/GenerationCache.ts +265 -0
- package/src/ai/GoalPlanner.ts +165 -0
- package/src/ai/HoloScriptGenerator.ts +580 -0
- package/src/ai/InfluenceMap.ts +180 -0
- package/src/ai/NavMesh.ts +168 -0
- package/src/ai/PerceptionSystem.ts +178 -0
- package/src/ai/PromptTemplates.ts +453 -0
- package/src/ai/SemanticSearchService.ts +80 -0
- package/src/ai/StateMachine.ts +196 -0
- package/src/ai/SteeringBehavior.ts +150 -0
- package/src/ai/SteeringBehaviors.ts +244 -0
- package/src/ai/TrainingDataGenerator.ts +1082 -0
- package/src/ai/UtilityAI.ts +145 -0
- package/src/ai/__tests__/AIAdapter.prod.test.ts +259 -0
- package/src/ai/__tests__/AIAdapter.test.ts +109 -0
- package/src/ai/__tests__/AICopilot.prod.test.ts +341 -0
- package/src/ai/__tests__/AICopilot.test.ts +178 -0
- package/src/ai/__tests__/AIOutputValidator.prod.test.ts +226 -0
- package/src/ai/__tests__/AIOutputValidator.test.ts +138 -0
- package/src/ai/__tests__/BTNodes.prod.test.ts +391 -0
- package/src/ai/__tests__/BTNodes.test.ts +263 -0
- package/src/ai/__tests__/BehaviorSelector.prod.test.ts +129 -0
- package/src/ai/__tests__/BehaviorSelector.test.ts +132 -0
- package/src/ai/__tests__/BehaviorTree.prod.test.ts +266 -0
- package/src/ai/__tests__/BehaviorTree.test.ts +216 -0
- package/src/ai/__tests__/Blackboard.prod.test.ts +339 -0
- package/src/ai/__tests__/Blackboard.test.ts +183 -0
- package/src/ai/__tests__/GenerationAnalytics.prod.test.ts +141 -0
- package/src/ai/__tests__/GenerationAnalytics.test.ts +165 -0
- package/src/ai/__tests__/GenerationCache.prod.test.ts +144 -0
- package/src/ai/__tests__/GenerationCache.test.ts +171 -0
- package/src/ai/__tests__/GoalPlanner.prod.test.ts +189 -0
- package/src/ai/__tests__/GoalPlanner.test.ts +137 -0
- package/src/ai/__tests__/GoalPlannerDepth.prod.test.ts +217 -0
- package/src/ai/__tests__/HoloScriptGenerator.test.ts +125 -0
- package/src/ai/__tests__/InfluenceMap.prod.test.ts +146 -0
- package/src/ai/__tests__/InfluenceMap.test.ts +149 -0
- package/src/ai/__tests__/NavMesh.prod.test.ts +141 -0
- package/src/ai/__tests__/NavMesh.test.ts +159 -0
- package/src/ai/__tests__/PerceptionSystem.prod.test.ts +135 -0
- package/src/ai/__tests__/PerceptionSystem.test.ts +250 -0
- package/src/ai/__tests__/PromptTemplates.prod.test.ts +313 -0
- package/src/ai/__tests__/PromptTemplates.test.ts +146 -0
- package/src/ai/__tests__/SemanticSearch.test.ts +37 -0
- package/src/ai/__tests__/StateMachine.prod.test.ts +162 -0
- package/src/ai/__tests__/StateMachine.test.ts +163 -0
- package/src/ai/__tests__/SteeringBehavior.prod.test.ts +251 -0
- package/src/ai/__tests__/SteeringBehavior.test.ts +135 -0
- package/src/ai/__tests__/SteeringBehaviors.prod.test.ts +133 -0
- package/src/ai/__tests__/SteeringBehaviors.test.ts +151 -0
- package/src/ai/__tests__/TrainingDataGenerator.prod.test.ts +286 -0
- package/src/ai/__tests__/TrainingDataGenerator.test.ts +286 -0
- package/src/ai/__tests__/UtilityAI.prod.test.ts +207 -0
- package/src/ai/__tests__/UtilityAI.test.ts +155 -0
- package/src/ai/__tests__/adapters.prod.test.ts +263 -0
- package/src/ai/__tests__/adapters.test.ts +320 -0
- package/src/ai/adapters.ts +1585 -0
- package/src/ai/index.ts +130 -0
- package/src/behavior/BehaviorPresets.ts +140 -0
- package/src/behavior/BehaviorTree.ts +236 -0
- package/src/behavior/StateMachine.ts +176 -0
- package/src/behavior/StateTrait.ts +67 -0
- package/src/behavior/index.ts +8 -0
- package/src/behavior.ts +8 -0
- package/src/board/audit.ts +284 -0
- package/src/board/board-ops.ts +336 -0
- package/src/board/board-types.ts +302 -0
- package/src/board/index.ts +69 -0
- package/src/define-agent.ts +46 -0
- package/src/define-team.ts +33 -0
- package/src/delegation.ts +265 -0
- package/src/distributed-claimer.ts +228 -0
- package/src/economy/AgentBudgetEnforcer.ts +464 -0
- package/src/economy/BountyManager.ts +185 -0
- package/src/economy/CreatorRevenueAggregator.ts +460 -0
- package/src/economy/InvisibleWallet.ts +82 -0
- package/src/economy/KnowledgeMarketplace.ts +193 -0
- package/src/economy/PaymentWebhookService.ts +512 -0
- package/src/economy/RevenueSplitter.ts +156 -0
- package/src/economy/SubscriptionManager.ts +546 -0
- package/src/economy/UnifiedBudgetOptimizer.ts +635 -0
- package/src/economy/UsageMeter.ts +440 -0
- package/src/economy/_core-stubs.ts +219 -0
- package/src/economy/index.ts +100 -0
- package/src/economy/x402-facilitator.ts +1978 -0
- package/src/index.ts +348 -0
- package/src/knowledge/__tests__/knowledge-consolidator.test.ts +444 -0
- package/src/knowledge/__tests__/knowledge-store-vector.test.ts +291 -0
- package/src/knowledge/brain.ts +167 -0
- package/src/knowledge/consolidation.ts +581 -0
- package/src/knowledge/knowledge-consolidator.ts +510 -0
- package/src/knowledge/knowledge-store.ts +616 -0
- package/src/learning/MemoryConsolidator.ts +102 -0
- package/src/learning/MemoryScorer.ts +69 -0
- package/src/learning/ProceduralCompiler.ts +45 -0
- package/src/learning/SemanticClusterer.ts +66 -0
- package/src/learning/index.ts +8 -0
- package/src/llm/llm-adapter.ts +159 -0
- package/src/mesh/index.ts +309 -0
- package/src/negotiation/NegotiationProtocol.ts +694 -0
- package/src/negotiation/NegotiationTypes.ts +473 -0
- package/src/negotiation/VotingMechanisms.ts +691 -0
- package/src/negotiation/index.ts +49 -0
- package/src/protocol/goal-synthesizer.ts +317 -0
- package/src/protocol/implementations.ts +474 -0
- package/src/protocol/micro-phase-decomposer.ts +299 -0
- package/src/protocol/micro-step-decomposer.test.ts +306 -0
- package/src/protocol-agent.test.ts +353 -0
- package/src/protocol-agent.ts +670 -0
- package/src/self-improve/absorb-scanner.ts +252 -0
- package/src/self-improve/evolution-engine.ts +149 -0
- package/src/self-improve/framework-absorber.ts +214 -0
- package/src/self-improve/index.ts +50 -0
- package/src/self-improve/prompt-optimizer.ts +212 -0
- package/src/self-improve/test-generator.ts +175 -0
- package/src/skill-router.ts +186 -0
- package/src/skills/index.ts +5 -0
- package/src/skills/skill-md-bridge.ts +1699 -0
- package/src/swarm/ACOEngine.ts +261 -0
- package/src/swarm/CollectiveIntelligence.ts +383 -0
- package/src/swarm/ContributionSynthesizer.ts +481 -0
- package/src/swarm/LeaderElection.ts +393 -0
- package/src/swarm/PSOEngine.ts +206 -0
- package/src/swarm/QuorumPolicy.ts +173 -0
- package/src/swarm/SwarmCoordinator.ts +335 -0
- package/src/swarm/SwarmManager.ts +442 -0
- package/src/swarm/SwarmMembership.ts +456 -0
- package/src/swarm/VotingRound.ts +255 -0
- package/src/swarm/__tests__/ACOEngine.prod.test.ts +164 -0
- package/src/swarm/__tests__/ACOEngine.test.ts +117 -0
- package/src/swarm/__tests__/CollectiveIntelligence.prod.test.ts +296 -0
- package/src/swarm/__tests__/CollectiveIntelligence.test.ts +457 -0
- package/src/swarm/__tests__/ContributionSynthesizer.prod.test.ts +269 -0
- package/src/swarm/__tests__/ContributionSynthesizer.test.ts +254 -0
- package/src/swarm/__tests__/LeaderElection.prod.test.ts +196 -0
- package/src/swarm/__tests__/LeaderElection.test.ts +151 -0
- package/src/swarm/__tests__/PSOEngine.prod.test.ts +162 -0
- package/src/swarm/__tests__/PSOEngine.test.ts +106 -0
- package/src/swarm/__tests__/QuorumPolicy.prod.test.ts +216 -0
- package/src/swarm/__tests__/QuorumPolicy.test.ts +177 -0
- package/src/swarm/__tests__/SwarmCoordinator.prod.test.ts +186 -0
- package/src/swarm/__tests__/SwarmCoordinator.test.ts +167 -0
- package/src/swarm/__tests__/SwarmManager.prod.test.ts +308 -0
- package/src/swarm/__tests__/SwarmManager.test.ts +373 -0
- package/src/swarm/__tests__/SwarmMembership.prod.test.ts +273 -0
- package/src/swarm/__tests__/SwarmMembership.test.ts +264 -0
- package/src/swarm/__tests__/VotingRound.prod.test.ts +233 -0
- package/src/swarm/__tests__/VotingRound.test.ts +174 -0
- package/src/swarm/analytics/SwarmInspector.ts +476 -0
- package/src/swarm/analytics/SwarmMetrics.ts +449 -0
- package/src/swarm/analytics/__tests__/SwarmInspector.prod.test.ts +366 -0
- package/src/swarm/analytics/__tests__/SwarmInspector.test.ts +454 -0
- package/src/swarm/analytics/__tests__/SwarmMetrics.prod.test.ts +254 -0
- package/src/swarm/analytics/__tests__/SwarmMetrics.test.ts +370 -0
- package/src/swarm/analytics/index.ts +7 -0
- package/src/swarm/index.ts +69 -0
- package/src/swarm/messaging/BroadcastChannel.ts +509 -0
- package/src/swarm/messaging/GossipProtocol.ts +565 -0
- package/src/swarm/messaging/SwarmEventBus.ts +443 -0
- package/src/swarm/messaging/__tests__/BroadcastChannel.prod.test.ts +331 -0
- package/src/swarm/messaging/__tests__/BroadcastChannel.test.ts +333 -0
- package/src/swarm/messaging/__tests__/GossipProtocol.prod.test.ts +356 -0
- package/src/swarm/messaging/__tests__/GossipProtocol.test.ts +437 -0
- package/src/swarm/messaging/__tests__/SwarmEventBus.prod.test.ts +191 -0
- package/src/swarm/messaging/__tests__/SwarmEventBus.test.ts +247 -0
- package/src/swarm/messaging/index.ts +8 -0
- package/src/swarm/spatial/FlockingBehavior.ts +462 -0
- package/src/swarm/spatial/FormationController.ts +500 -0
- package/src/swarm/spatial/Vector3.ts +170 -0
- package/src/swarm/spatial/ZoneClaiming.ts +509 -0
- package/src/swarm/spatial/__tests__/FlockingBehavior.prod.test.ts +239 -0
- package/src/swarm/spatial/__tests__/FlockingBehavior.test.ts +298 -0
- package/src/swarm/spatial/__tests__/FormationController.prod.test.ts +240 -0
- package/src/swarm/spatial/__tests__/FormationController.test.ts +297 -0
- package/src/swarm/spatial/__tests__/Vector3.prod.test.ts +283 -0
- package/src/swarm/spatial/__tests__/Vector3.test.ts +224 -0
- package/src/swarm/spatial/__tests__/ZoneClaiming.prod.test.ts +246 -0
- package/src/swarm/spatial/__tests__/ZoneClaiming.test.ts +374 -0
- package/src/swarm/spatial/index.ts +28 -0
- package/src/team.ts +1245 -0
- package/src/training/LRScheduler.ts +377 -0
- package/src/training/QualityScoringPipeline.ts +139 -0
- package/src/training/SoftDedup.ts +461 -0
- package/src/training/SparsityMonitor.ts +685 -0
- package/src/training/SparsityMonitorTypes.ts +209 -0
- package/src/training/SpatialTrainingDataGenerator.ts +1526 -0
- package/src/training/SpatialTrainingDataTypes.ts +216 -0
- package/src/training/TrainingPipelineConfig.ts +215 -0
- package/src/training/constants.ts +94 -0
- package/src/training/index.ts +138 -0
- package/src/training/schema.ts +147 -0
- package/src/training/scripts/generate-novel-use-cases-dataset.ts +272 -0
- package/src/training/scripts/generate-spatial-dataset.ts +521 -0
- package/src/training/training/data/novel-use-cases.jsonl +153 -0
- package/src/training/training/data/spatial-reasoning-10k.jsonl +9354 -0
- package/src/training/trainingmonkey/TrainingMonkeyIntegration.ts +477 -0
- package/src/training/trainingmonkey/TrainingMonkeyTypes.ts +230 -0
- package/src/training/trainingmonkey/index.ts +26 -0
- package/src/training/trait-mappings.ts +157 -0
- package/src/types/core-stubs.d.ts +113 -0
- package/src/types.ts +304 -0
- package/test-output.txt +0 -0
- package/test-result.json +1 -0
- package/tsc-errors.txt +4 -0
- package/tsc_output.txt +0 -0
- package/tsconfig.json +14 -0
- package/tsup-learning-esm.config.ts +12 -0
- package/tsup.config.ts +21 -0
- package/typescript-errors-2.txt +0 -0
- package/typescript-errors.txt +22 -0
- package/vitest-log-utf8.txt +268 -0
- package/vitest-log.txt +0 -0
- package/vitest.config.ts +8 -0
|
@@ -0,0 +1,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';
|