@cogitator-ai/self-modifying 0.1.0

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 (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +714 -0
  3. package/dist/architecture-evolution/capability-analyzer.d.ts +32 -0
  4. package/dist/architecture-evolution/capability-analyzer.d.ts.map +1 -0
  5. package/dist/architecture-evolution/capability-analyzer.js +264 -0
  6. package/dist/architecture-evolution/capability-analyzer.js.map +1 -0
  7. package/dist/architecture-evolution/evolution-strategy.d.ts +29 -0
  8. package/dist/architecture-evolution/evolution-strategy.d.ts.map +1 -0
  9. package/dist/architecture-evolution/evolution-strategy.js +176 -0
  10. package/dist/architecture-evolution/evolution-strategy.js.map +1 -0
  11. package/dist/architecture-evolution/index.d.ts +5 -0
  12. package/dist/architecture-evolution/index.d.ts.map +1 -0
  13. package/dist/architecture-evolution/index.js +5 -0
  14. package/dist/architecture-evolution/index.js.map +1 -0
  15. package/dist/architecture-evolution/parameter-optimizer.d.ts +67 -0
  16. package/dist/architecture-evolution/parameter-optimizer.d.ts.map +1 -0
  17. package/dist/architecture-evolution/parameter-optimizer.js +341 -0
  18. package/dist/architecture-evolution/parameter-optimizer.js.map +1 -0
  19. package/dist/architecture-evolution/prompts.d.ts +33 -0
  20. package/dist/architecture-evolution/prompts.d.ts.map +1 -0
  21. package/dist/architecture-evolution/prompts.js +169 -0
  22. package/dist/architecture-evolution/prompts.js.map +1 -0
  23. package/dist/constraints/index.d.ts +4 -0
  24. package/dist/constraints/index.d.ts.map +1 -0
  25. package/dist/constraints/index.js +4 -0
  26. package/dist/constraints/index.js.map +1 -0
  27. package/dist/constraints/modification-validator.d.ts +26 -0
  28. package/dist/constraints/modification-validator.d.ts.map +1 -0
  29. package/dist/constraints/modification-validator.js +313 -0
  30. package/dist/constraints/modification-validator.js.map +1 -0
  31. package/dist/constraints/rollback-manager.d.ts +52 -0
  32. package/dist/constraints/rollback-manager.d.ts.map +1 -0
  33. package/dist/constraints/rollback-manager.js +113 -0
  34. package/dist/constraints/rollback-manager.js.map +1 -0
  35. package/dist/constraints/safety-constraints.d.ts +11 -0
  36. package/dist/constraints/safety-constraints.d.ts.map +1 -0
  37. package/dist/constraints/safety-constraints.js +78 -0
  38. package/dist/constraints/safety-constraints.js.map +1 -0
  39. package/dist/events/event-emitter.d.ts +12 -0
  40. package/dist/events/event-emitter.d.ts.map +1 -0
  41. package/dist/events/event-emitter.js +43 -0
  42. package/dist/events/event-emitter.js.map +1 -0
  43. package/dist/events/index.d.ts +2 -0
  44. package/dist/events/index.d.ts.map +1 -0
  45. package/dist/events/index.js +2 -0
  46. package/dist/events/index.js.map +1 -0
  47. package/dist/index.d.ts +8 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +7 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/meta-reasoning/index.d.ts +5 -0
  52. package/dist/meta-reasoning/index.d.ts.map +1 -0
  53. package/dist/meta-reasoning/index.js +5 -0
  54. package/dist/meta-reasoning/index.js.map +1 -0
  55. package/dist/meta-reasoning/meta-reasoner.d.ts +53 -0
  56. package/dist/meta-reasoning/meta-reasoner.d.ts.map +1 -0
  57. package/dist/meta-reasoning/meta-reasoner.js +261 -0
  58. package/dist/meta-reasoning/meta-reasoner.js.map +1 -0
  59. package/dist/meta-reasoning/observation-collector.d.ts +37 -0
  60. package/dist/meta-reasoning/observation-collector.d.ts.map +1 -0
  61. package/dist/meta-reasoning/observation-collector.js +123 -0
  62. package/dist/meta-reasoning/observation-collector.js.map +1 -0
  63. package/dist/meta-reasoning/prompts.d.ts +31 -0
  64. package/dist/meta-reasoning/prompts.d.ts.map +1 -0
  65. package/dist/meta-reasoning/prompts.js +96 -0
  66. package/dist/meta-reasoning/prompts.js.map +1 -0
  67. package/dist/meta-reasoning/strategy-selector.d.ts +27 -0
  68. package/dist/meta-reasoning/strategy-selector.d.ts.map +1 -0
  69. package/dist/meta-reasoning/strategy-selector.js +138 -0
  70. package/dist/meta-reasoning/strategy-selector.js.map +1 -0
  71. package/dist/self-modifying-agent.d.ts +61 -0
  72. package/dist/self-modifying-agent.d.ts.map +1 -0
  73. package/dist/self-modifying-agent.js +449 -0
  74. package/dist/self-modifying-agent.js.map +1 -0
  75. package/dist/tool-generation/gap-analyzer.d.ts +25 -0
  76. package/dist/tool-generation/gap-analyzer.d.ts.map +1 -0
  77. package/dist/tool-generation/gap-analyzer.js +153 -0
  78. package/dist/tool-generation/gap-analyzer.js.map +1 -0
  79. package/dist/tool-generation/generated-tool-store.d.ts +51 -0
  80. package/dist/tool-generation/generated-tool-store.d.ts.map +1 -0
  81. package/dist/tool-generation/generated-tool-store.js +195 -0
  82. package/dist/tool-generation/generated-tool-store.js.map +1 -0
  83. package/dist/tool-generation/index.d.ts +7 -0
  84. package/dist/tool-generation/index.d.ts.map +1 -0
  85. package/dist/tool-generation/index.js +7 -0
  86. package/dist/tool-generation/index.js.map +1 -0
  87. package/dist/tool-generation/prompts.d.ts +28 -0
  88. package/dist/tool-generation/prompts.d.ts.map +1 -0
  89. package/dist/tool-generation/prompts.js +269 -0
  90. package/dist/tool-generation/prompts.js.map +1 -0
  91. package/dist/tool-generation/tool-generator.d.ts +29 -0
  92. package/dist/tool-generation/tool-generator.d.ts.map +1 -0
  93. package/dist/tool-generation/tool-generator.js +169 -0
  94. package/dist/tool-generation/tool-generator.js.map +1 -0
  95. package/dist/tool-generation/tool-sandbox.d.ts +31 -0
  96. package/dist/tool-generation/tool-sandbox.d.ts.map +1 -0
  97. package/dist/tool-generation/tool-sandbox.js +240 -0
  98. package/dist/tool-generation/tool-sandbox.js.map +1 -0
  99. package/dist/tool-generation/tool-validator.d.ts +32 -0
  100. package/dist/tool-generation/tool-validator.d.ts.map +1 -0
  101. package/dist/tool-generation/tool-validator.js +304 -0
  102. package/dist/tool-generation/tool-validator.js.map +1 -0
  103. package/dist/utils/index.d.ts +2 -0
  104. package/dist/utils/index.d.ts.map +1 -0
  105. package/dist/utils/index.js +2 -0
  106. package/dist/utils/index.js.map +1 -0
  107. package/dist/utils/llm-helper.d.ts +6 -0
  108. package/dist/utils/llm-helper.d.ts.map +1 -0
  109. package/dist/utils/llm-helper.js +18 -0
  110. package/dist/utils/llm-helper.js.map +1 -0
  111. package/package.json +61 -0
  112. package/src/__tests__/architecture-evolution.test.ts +368 -0
  113. package/src/__tests__/constraints.test.ts +266 -0
  114. package/src/__tests__/index.test.ts +99 -0
  115. package/src/__tests__/meta-reasoning.test.ts +343 -0
  116. package/src/__tests__/tool-generation.test.ts +455 -0
  117. package/src/architecture-evolution/capability-analyzer.ts +337 -0
  118. package/src/architecture-evolution/evolution-strategy.ts +224 -0
  119. package/src/architecture-evolution/index.ts +26 -0
  120. package/src/architecture-evolution/parameter-optimizer.ts +489 -0
  121. package/src/architecture-evolution/prompts.ts +216 -0
  122. package/src/constraints/index.ts +23 -0
  123. package/src/constraints/modification-validator.ts +402 -0
  124. package/src/constraints/rollback-manager.ts +173 -0
  125. package/src/constraints/safety-constraints.ts +103 -0
  126. package/src/events/event-emitter.ts +62 -0
  127. package/src/events/index.ts +1 -0
  128. package/src/index.ts +112 -0
  129. package/src/meta-reasoning/index.ts +24 -0
  130. package/src/meta-reasoning/meta-reasoner.ts +381 -0
  131. package/src/meta-reasoning/observation-collector.ts +161 -0
  132. package/src/meta-reasoning/prompts.ts +131 -0
  133. package/src/meta-reasoning/strategy-selector.ts +179 -0
  134. package/src/self-modifying-agent.ts +585 -0
  135. package/src/tool-generation/gap-analyzer.ts +234 -0
  136. package/src/tool-generation/generated-tool-store.ts +268 -0
  137. package/src/tool-generation/index.ts +19 -0
  138. package/src/tool-generation/prompts.ts +308 -0
  139. package/src/tool-generation/tool-generator.ts +243 -0
  140. package/src/tool-generation/tool-sandbox.ts +332 -0
  141. package/src/tool-generation/tool-validator.ts +365 -0
  142. package/src/utils/index.ts +1 -0
  143. package/src/utils/llm-helper.ts +24 -0
@@ -0,0 +1,62 @@
1
+ import type {
2
+ SelfModifyingEvent,
3
+ SelfModifyingEventType,
4
+ SelfModifyingEventHandler,
5
+ } from '@cogitator-ai/types';
6
+
7
+ export type { SelfModifyingEventHandler };
8
+
9
+ export class SelfModifyingEventEmitter {
10
+ private handlers = new Map<SelfModifyingEventType | '*', Set<SelfModifyingEventHandler>>();
11
+
12
+ on(event: SelfModifyingEventType | '*', handler: SelfModifyingEventHandler): () => void {
13
+ if (!this.handlers.has(event)) {
14
+ this.handlers.set(event, new Set());
15
+ }
16
+ this.handlers.get(event)!.add(handler);
17
+ return () => this.off(event, handler);
18
+ }
19
+
20
+ off(event: SelfModifyingEventType | '*', handler: SelfModifyingEventHandler): void {
21
+ this.handlers.get(event)?.delete(handler);
22
+ }
23
+
24
+ async emit(event: SelfModifyingEvent): Promise<void> {
25
+ const typeHandlers = this.handlers.get(event.type);
26
+ const wildcardHandlers = this.handlers.get('*');
27
+
28
+ const allHandlers = [
29
+ ...(typeHandlers ? [...typeHandlers] : []),
30
+ ...(wildcardHandlers ? [...wildcardHandlers] : []),
31
+ ];
32
+
33
+ await Promise.all(allHandlers.map((h) => h(event)));
34
+ }
35
+
36
+ createEvent(
37
+ type: SelfModifyingEventType,
38
+ runId: string,
39
+ agentId: string,
40
+ data: unknown
41
+ ): SelfModifyingEvent {
42
+ return {
43
+ type,
44
+ runId,
45
+ agentId,
46
+ timestamp: new Date(),
47
+ data,
48
+ };
49
+ }
50
+
51
+ removeAllListeners(event?: SelfModifyingEventType | '*'): void {
52
+ if (event) {
53
+ this.handlers.delete(event);
54
+ } else {
55
+ this.handlers.clear();
56
+ }
57
+ }
58
+
59
+ listenerCount(event: SelfModifyingEventType | '*'): number {
60
+ return this.handlers.get(event)?.size ?? 0;
61
+ }
62
+ }
@@ -0,0 +1 @@
1
+ export { SelfModifyingEventEmitter, type SelfModifyingEventHandler } from './event-emitter';
package/src/index.ts ADDED
@@ -0,0 +1,112 @@
1
+ export { SelfModifyingAgent, type SelfModifyingAgentOptions, type RunContext } from './self-modifying-agent';
2
+
3
+ export {
4
+ GapAnalyzer,
5
+ ToolGenerator,
6
+ ToolValidator,
7
+ ToolSandbox,
8
+ InMemoryGeneratedToolStore,
9
+ DEFAULT_SANDBOX_CONFIG,
10
+ TOOL_GENERATION_SYSTEM_PROMPT,
11
+ buildGapAnalysisPrompt,
12
+ buildToolGenerationPrompt,
13
+ buildToolValidationPrompt,
14
+ parseGapAnalysisResponse,
15
+ parseToolGenerationResponse,
16
+ type GapAnalyzerOptions,
17
+ type ToolGeneratorOptions,
18
+ type ToolValidatorOptions,
19
+ type GenerationResult,
20
+ type ToolUsageRecord,
21
+ type ToolMetrics,
22
+ } from './tool-generation';
23
+
24
+ export {
25
+ MetaReasoner,
26
+ ObservationCollector,
27
+ StrategySelector,
28
+ DEFAULT_META_REASONING_CONFIG,
29
+ DEFAULT_MODE_PROFILES,
30
+ buildMetaAssessmentPrompt,
31
+ parseMetaAssessmentResponse,
32
+ META_REASONING_SYSTEM_PROMPT,
33
+ type MetaReasonerOptions,
34
+ type StrategySelectorOptions,
35
+ type ActionRecord,
36
+ type ObservationContext,
37
+ type ModeScore,
38
+ } from './meta-reasoning';
39
+
40
+ export {
41
+ CapabilityAnalyzer,
42
+ EvolutionStrategy,
43
+ ParameterOptimizer,
44
+ ARCHITECTURE_ANALYSIS_SYSTEM_PROMPT,
45
+ buildTaskProfilePrompt,
46
+ buildCandidateGenerationPrompt,
47
+ parseTaskProfileResponse,
48
+ parseCandidateGenerationResponse,
49
+ type CapabilityAnalyzerOptions,
50
+ type EvolutionStrategyOptions,
51
+ type ParameterOptimizerOptions,
52
+ type SelectionResult,
53
+ type OptimizationResult,
54
+ } from './architecture-evolution';
55
+
56
+ export {
57
+ ModificationValidator,
58
+ RollbackManager,
59
+ InMemoryCheckpointStore,
60
+ DEFAULT_SAFETY_CONSTRAINTS,
61
+ DEFAULT_CAPABILITY_CONSTRAINTS,
62
+ DEFAULT_RESOURCE_CONSTRAINTS,
63
+ mergeSafetyConstraints,
64
+ mergeCapabilityConstraints,
65
+ mergeResourceConstraints,
66
+ type ModificationValidatorOptions,
67
+ type RollbackManagerOptions,
68
+ type CheckpointStore,
69
+ type CheckpointDiff,
70
+ } from './constraints';
71
+
72
+ export {
73
+ SelfModifyingEventEmitter,
74
+ type SelfModifyingEventHandler,
75
+ } from './events';
76
+
77
+ export type {
78
+ SelfModifyingConfig,
79
+ ToolSelfGenerationConfig,
80
+ MetaReasoningConfig,
81
+ ArchitectureEvolutionConfig,
82
+ ModificationConstraintsConfig,
83
+ ToolGenerationRequest,
84
+ GeneratedTool,
85
+ ToolValidationResult,
86
+ ToolSandboxConfig,
87
+ ToolSandboxResult,
88
+ GeneratedToolStore,
89
+ CapabilityGap,
90
+ GapAnalysisResult,
91
+ ReasoningMode,
92
+ ReasoningModeConfig,
93
+ MetaObservation,
94
+ MetaAssessment,
95
+ MetaAdaptation,
96
+ MetaTrigger,
97
+ TaskProfile,
98
+ ArchitectureConfig,
99
+ EvolutionCandidate,
100
+ EvolutionMetrics,
101
+ EvolutionStrategy as IEvolutionStrategy,
102
+ EvolvableParameter,
103
+ ModificationRequest,
104
+ ModificationConstraints,
105
+ ModificationValidationResult,
106
+ ModificationCheckpoint,
107
+ AppliedModification,
108
+ SafetyConstraint,
109
+ CapabilityConstraint,
110
+ ResourceConstraint,
111
+ SelfModifyingEvent,
112
+ } from '@cogitator-ai/types';
@@ -0,0 +1,24 @@
1
+ export {
2
+ MetaReasoner,
3
+ DEFAULT_META_REASONING_CONFIG,
4
+ type MetaReasonerOptions,
5
+ } from './meta-reasoner';
6
+
7
+ export {
8
+ ObservationCollector,
9
+ type ActionRecord,
10
+ type ObservationContext,
11
+ } from './observation-collector';
12
+
13
+ export {
14
+ StrategySelector,
15
+ DEFAULT_MODE_PROFILES,
16
+ type StrategySelectorOptions,
17
+ type ModeScore,
18
+ } from './strategy-selector';
19
+
20
+ export {
21
+ buildMetaAssessmentPrompt,
22
+ parseMetaAssessmentResponse,
23
+ META_REASONING_SYSTEM_PROMPT,
24
+ } from './prompts';
@@ -0,0 +1,381 @@
1
+ import { nanoid } from 'nanoid';
2
+ import type {
3
+ MetaReasoningConfig,
4
+ MetaObservation,
5
+ MetaAssessment,
6
+ MetaAdaptation,
7
+ MetaRecommendation,
8
+ MetaTrigger,
9
+ ReasoningMode,
10
+ ReasoningModeConfig,
11
+ Insight,
12
+ LLMBackend,
13
+ MetaIssue,
14
+ MetaOpportunity,
15
+ } from '@cogitator-ai/types';
16
+ import { DEFAULT_META_REASONING_CONFIG } from '@cogitator-ai/types';
17
+ import { ObservationCollector, type ActionRecord, type ObservationContext } from './observation-collector';
18
+ import { StrategySelector } from './strategy-selector';
19
+ import {
20
+ buildMetaAssessmentPrompt,
21
+ parseMetaAssessmentResponse,
22
+ META_REASONING_SYSTEM_PROMPT,
23
+ } from './prompts';
24
+
25
+ export { DEFAULT_META_REASONING_CONFIG };
26
+
27
+ export interface MetaReasonerOptions {
28
+ llm: LLMBackend;
29
+ model: string;
30
+ config?: Partial<MetaReasoningConfig>;
31
+ }
32
+
33
+ export class MetaReasoner {
34
+ private llm: LLMBackend;
35
+ private model: string;
36
+ private config: MetaReasoningConfig;
37
+ private collector: ObservationCollector;
38
+ private selector: StrategySelector;
39
+
40
+ private assessments = new Map<string, MetaAssessment[]>();
41
+ private adaptations = new Map<string, MetaAdaptation[]>();
42
+ private currentMode = new Map<string, ReasoningMode>();
43
+
44
+ private lastAssessmentTime = new Map<string, number>();
45
+ private lastAdaptationTime = new Map<string, number>();
46
+
47
+ constructor(options: MetaReasonerOptions) {
48
+ this.llm = options.llm;
49
+ this.model = options.model;
50
+ this.config = { ...DEFAULT_META_REASONING_CONFIG, ...options.config } as MetaReasoningConfig;
51
+
52
+ this.collector = new ObservationCollector();
53
+ this.selector = new StrategySelector({
54
+ allowedModes: this.config.allowedModes,
55
+ modeProfiles: this.config.modeProfiles,
56
+ });
57
+ }
58
+
59
+ initializeRun(runId: string): ReasoningModeConfig {
60
+ this.collector.initializeRun(runId);
61
+ this.assessments.set(runId, []);
62
+ this.adaptations.set(runId, []);
63
+ this.currentMode.set(runId, this.config.defaultMode);
64
+
65
+ return this.getModeConfig(this.config.defaultMode);
66
+ }
67
+
68
+ recordAction(runId: string, action: ActionRecord): void {
69
+ this.collector.recordAction(runId, action);
70
+ }
71
+
72
+ recordConfidence(runId: string, confidence: number): void {
73
+ this.collector.recordConfidence(runId, confidence);
74
+ }
75
+
76
+ shouldTrigger(
77
+ runId: string,
78
+ trigger: MetaTrigger,
79
+ context: {
80
+ iteration: number;
81
+ confidence: number;
82
+ progressDelta: number;
83
+ stagnationCount: number;
84
+ }
85
+ ): boolean {
86
+ if (!this.config.enabled) return false;
87
+
88
+ const lastAssessment = this.lastAssessmentTime.get(runId) ?? 0;
89
+ if (Date.now() - lastAssessment < this.config.metaAssessmentCooldown) {
90
+ return false;
91
+ }
92
+
93
+ const assessmentCount = this.assessments.get(runId)?.length ?? 0;
94
+ if (assessmentCount >= this.config.maxMetaAssessments) {
95
+ return false;
96
+ }
97
+
98
+ switch (trigger) {
99
+ case 'iteration_complete':
100
+ return (
101
+ context.iteration > 0 &&
102
+ context.iteration % this.config.triggerAfterIterations === 0
103
+ );
104
+
105
+ case 'confidence_drop':
106
+ return context.confidence < this.config.triggerOnConfidenceDrop;
107
+
108
+ case 'progress_stall':
109
+ return context.stagnationCount >= this.config.triggerOnProgressStall;
110
+
111
+ case 'tool_call_failed':
112
+ return true;
113
+
114
+ case 'explicit_request':
115
+ return true;
116
+
117
+ default:
118
+ return false;
119
+ }
120
+ }
121
+
122
+ observe(context: ObservationContext, insights: Insight[]): MetaObservation {
123
+ return this.collector.collect(context, insights);
124
+ }
125
+
126
+ async assess(observation: MetaObservation): Promise<MetaAssessment> {
127
+ const startTime = Date.now();
128
+ const currentModeConfig = this.getModeConfig(observation.currentMode);
129
+
130
+ const prompt = buildMetaAssessmentPrompt(observation, {
131
+ allowedModes: this.config.allowedModes,
132
+ currentModeConfig,
133
+ });
134
+
135
+ const response = await this.llm.chat({
136
+ model: this.config.metaModel ?? this.model,
137
+ messages: [
138
+ { role: 'system', content: META_REASONING_SYSTEM_PROMPT },
139
+ { role: 'user', content: prompt },
140
+ ],
141
+ temperature: 0.3,
142
+ maxTokens: this.config.maxMetaTokens,
143
+ });
144
+
145
+ const parsed = parseMetaAssessmentResponse(response.content);
146
+
147
+ const assessment: MetaAssessment = {
148
+ id: `meta_${nanoid(10)}`,
149
+ observationId: `obs_${observation.runId}_${observation.iteration}`,
150
+ timestamp: Date.now(),
151
+
152
+ onTrack: parsed?.onTrack ?? observation.currentConfidence > 0.5,
153
+ confidence: parsed?.confidence ?? 0.5,
154
+ reasoning: parsed?.reasoning ?? 'Assessment unavailable',
155
+
156
+ issues: (parsed?.issues ?? []) as MetaIssue[],
157
+ opportunities: (parsed?.opportunities ?? []).map((o) => ({
158
+ type: o.type as MetaOpportunity['type'],
159
+ confidence: o.expectedImprovement ?? 0.5,
160
+ description: o.description,
161
+ })) as MetaOpportunity[],
162
+
163
+ recommendation: this.buildRecommendation(parsed, observation),
164
+
165
+ assessmentDuration: Date.now() - startTime,
166
+ assessmentCost: (response.usage?.outputTokens ?? 0) * 0.00001,
167
+ };
168
+
169
+ const runAssessments = this.assessments.get(observation.runId) ?? [];
170
+ runAssessments.push(assessment);
171
+ this.lastAssessmentTime.set(observation.runId, Date.now());
172
+
173
+ return assessment;
174
+ }
175
+
176
+ private buildRecommendation(
177
+ parsed: ReturnType<typeof parseMetaAssessmentResponse>,
178
+ observation: MetaObservation
179
+ ): MetaRecommendation {
180
+ if (!parsed?.recommendation) {
181
+ const suggestedMode = this.selector.suggestSwitch(observation);
182
+ if (suggestedMode) {
183
+ return {
184
+ action: 'switch_mode',
185
+ newMode: suggestedMode,
186
+ confidence: 0.6,
187
+ reasoning: 'Heuristic-based mode switch suggestion',
188
+ };
189
+ }
190
+ return {
191
+ action: 'continue',
192
+ confidence: 0.5,
193
+ reasoning: 'Default: continue current approach',
194
+ };
195
+ }
196
+
197
+ return {
198
+ action: parsed.recommendation.action as MetaRecommendation['action'],
199
+ newMode: parsed.recommendation.newMode as ReasoningMode | undefined,
200
+ parameterChanges: parsed.recommendation.parameterChanges as
201
+ | Partial<ReasoningModeConfig>
202
+ | undefined,
203
+ contextAddition: parsed.recommendation.contextAddition,
204
+ confidence: parsed.recommendation.confidence,
205
+ reasoning: parsed.recommendation.reasoning,
206
+ };
207
+ }
208
+
209
+ async adapt(runId: string, assessment: MetaAssessment): Promise<MetaAdaptation | null> {
210
+ const recommendation = assessment.recommendation;
211
+
212
+ if (!recommendation || recommendation.action === 'continue') {
213
+ return null;
214
+ }
215
+
216
+ if (recommendation.confidence < this.config.minConfidenceToAdapt) {
217
+ return null;
218
+ }
219
+
220
+ const lastAdaptation = this.lastAdaptationTime.get(runId) ?? 0;
221
+ if (Date.now() - lastAdaptation < this.config.adaptationCooldown) {
222
+ return null;
223
+ }
224
+
225
+ const adaptationCount = this.adaptations.get(runId)?.length ?? 0;
226
+ if (adaptationCount >= this.config.maxAdaptations) {
227
+ return null;
228
+ }
229
+
230
+ const currentMode = this.currentMode.get(runId) ?? this.config.defaultMode;
231
+ const currentConfig = this.getModeConfig(currentMode);
232
+
233
+ let newConfig: Partial<ReasoningModeConfig> = {};
234
+ let adaptationType: MetaAdaptation['type'] = 'parameter_change';
235
+
236
+ switch (recommendation.action) {
237
+ case 'switch_mode':
238
+ if (
239
+ recommendation.newMode &&
240
+ this.config.allowedModes.includes(recommendation.newMode)
241
+ ) {
242
+ newConfig = this.getModeConfig(recommendation.newMode);
243
+ adaptationType = 'mode_switch';
244
+ this.currentMode.set(runId, recommendation.newMode);
245
+ }
246
+ break;
247
+
248
+ case 'adjust_parameters':
249
+ if (recommendation.parameterChanges) {
250
+ newConfig = { ...currentConfig, ...recommendation.parameterChanges };
251
+ adaptationType = 'parameter_change';
252
+ }
253
+ break;
254
+
255
+ case 'inject_context':
256
+ adaptationType = 'context_injection';
257
+ break;
258
+
259
+ case 'abort':
260
+ return null;
261
+ }
262
+
263
+ const adaptation: MetaAdaptation = {
264
+ id: `adapt_${nanoid(10)}`,
265
+ assessmentId: assessment.id,
266
+ timestamp: Date.now(),
267
+
268
+ type: adaptationType,
269
+ before: currentConfig,
270
+ after: newConfig,
271
+
272
+ rollbackable: this.config.enableRollback,
273
+ rollbackDeadline: this.config.enableRollback
274
+ ? Date.now() + this.config.rollbackWindow
275
+ : undefined,
276
+ };
277
+
278
+ const runAdaptations = this.adaptations.get(runId) ?? [];
279
+ runAdaptations.push(adaptation);
280
+ this.lastAdaptationTime.set(runId, Date.now());
281
+
282
+ return adaptation;
283
+ }
284
+
285
+ rollback(runId: string): MetaAdaptation | null {
286
+ const runAdaptations = this.adaptations.get(runId) ?? [];
287
+ const lastAdaptation = runAdaptations[runAdaptations.length - 1];
288
+
289
+ if (!lastAdaptation || !lastAdaptation.rollbackable) {
290
+ return null;
291
+ }
292
+
293
+ if (
294
+ lastAdaptation.rollbackDeadline &&
295
+ Date.now() > lastAdaptation.rollbackDeadline
296
+ ) {
297
+ return null;
298
+ }
299
+
300
+ const rollback: MetaAdaptation = {
301
+ id: `rollback_${nanoid(10)}`,
302
+ assessmentId: lastAdaptation.assessmentId,
303
+ timestamp: Date.now(),
304
+
305
+ type: 'rollback',
306
+ before: lastAdaptation.after,
307
+ after: lastAdaptation.before,
308
+
309
+ rollbackable: false,
310
+ };
311
+
312
+ if (lastAdaptation.type === 'mode_switch' && lastAdaptation.before.mode) {
313
+ this.currentMode.set(runId, lastAdaptation.before.mode);
314
+ }
315
+
316
+ runAdaptations.push(rollback);
317
+ return rollback;
318
+ }
319
+
320
+ recordOutcome(
321
+ runId: string,
322
+ adaptationId: string,
323
+ outcome: { improved: boolean; progressDelta: number; confidenceDelta: number }
324
+ ): void {
325
+ const runAdaptations = this.adaptations.get(runId) ?? [];
326
+ const adaptation = runAdaptations.find((a) => a.id === adaptationId);
327
+
328
+ if (adaptation) {
329
+ adaptation.outcome = outcome;
330
+
331
+ if (
332
+ this.config.rollbackOnDecline &&
333
+ !outcome.improved &&
334
+ adaptation.rollbackable
335
+ ) {
336
+ this.rollback(runId);
337
+ }
338
+ }
339
+ }
340
+
341
+ getCurrentConfig(runId: string): ReasoningModeConfig {
342
+ const mode = this.currentMode.get(runId) ?? this.config.defaultMode;
343
+ return this.getModeConfig(mode);
344
+ }
345
+
346
+ getCurrentMode(runId: string): ReasoningMode {
347
+ return this.currentMode.get(runId) ?? this.config.defaultMode;
348
+ }
349
+
350
+ getModeConfig(mode: ReasoningMode): ReasoningModeConfig {
351
+ return this.config.modeProfiles[mode];
352
+ }
353
+
354
+ getRunStats(runId: string): {
355
+ observations: number;
356
+ assessments: number;
357
+ adaptations: number;
358
+ currentMode: ReasoningMode;
359
+ successfulAdaptations: number;
360
+ } {
361
+ const runAdaptations = this.adaptations.get(runId) ?? [];
362
+
363
+ return {
364
+ observations: this.collector.getObservations(runId).length,
365
+ assessments: this.assessments.get(runId)?.length ?? 0,
366
+ adaptations: runAdaptations.length,
367
+ currentMode: this.currentMode.get(runId) ?? this.config.defaultMode,
368
+ successfulAdaptations: runAdaptations.filter((a) => a.outcome?.improved).length,
369
+ };
370
+ }
371
+
372
+ cleanupRun(runId: string): void {
373
+ this.collector.cleanupRun(runId);
374
+ this.selector.cleanupRun(runId);
375
+ this.assessments.delete(runId);
376
+ this.adaptations.delete(runId);
377
+ this.currentMode.delete(runId);
378
+ this.lastAssessmentTime.delete(runId);
379
+ this.lastAdaptationTime.delete(runId);
380
+ }
381
+ }