@framers/agentos 0.1.46 → 0.1.47

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 (211) hide show
  1. package/README.md +7 -7
  2. package/dist/cognitive_substrate/IGMI.d.ts +2 -0
  3. package/dist/cognitive_substrate/IGMI.d.ts.map +1 -1
  4. package/dist/cognitive_substrate/IGMI.js.map +1 -1
  5. package/dist/cognitive_substrate/personas/IPersonaDefinition.d.ts +2 -0
  6. package/dist/cognitive_substrate/personas/IPersonaDefinition.d.ts.map +1 -1
  7. package/dist/core/audio/AdaptiveVAD.d.ts +147 -0
  8. package/dist/core/audio/AdaptiveVAD.d.ts.map +1 -0
  9. package/dist/core/audio/AdaptiveVAD.js +239 -0
  10. package/dist/core/audio/AdaptiveVAD.js.map +1 -0
  11. package/dist/core/audio/AudioProcessor.d.ts +121 -0
  12. package/dist/core/audio/AudioProcessor.d.ts.map +1 -0
  13. package/dist/core/audio/AudioProcessor.js +299 -0
  14. package/dist/core/audio/AudioProcessor.js.map +1 -0
  15. package/dist/core/audio/EnvironmentalCalibrator.d.ts +187 -0
  16. package/dist/core/audio/EnvironmentalCalibrator.d.ts.map +1 -0
  17. package/dist/core/audio/EnvironmentalCalibrator.js +360 -0
  18. package/dist/core/audio/EnvironmentalCalibrator.js.map +1 -0
  19. package/dist/core/audio/SilenceDetector.d.ts +111 -0
  20. package/dist/core/audio/SilenceDetector.d.ts.map +1 -0
  21. package/dist/core/audio/SilenceDetector.js +178 -0
  22. package/dist/core/audio/SilenceDetector.js.map +1 -0
  23. package/dist/core/llm/IPromptEngine.d.ts +2 -0
  24. package/dist/core/llm/IPromptEngine.d.ts.map +1 -1
  25. package/dist/core/llm/IPromptEngine.js.map +1 -1
  26. package/dist/core/llm/providers/implementations/OpenAIProvider.d.ts.map +1 -1
  27. package/dist/core/llm/providers/implementations/OpenAIProvider.js +8 -1
  28. package/dist/core/llm/providers/implementations/OpenAIProvider.js.map +1 -1
  29. package/dist/extensions/ExtensionManager.d.ts.map +1 -1
  30. package/dist/extensions/ExtensionManager.js +9 -1
  31. package/dist/extensions/ExtensionManager.js.map +1 -1
  32. package/dist/extensions/types.d.ts +20 -2
  33. package/dist/extensions/types.d.ts.map +1 -1
  34. package/dist/extensions/types.js +4 -0
  35. package/dist/extensions/types.js.map +1 -1
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +4 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/memory/CognitiveMemoryManager.d.ts +133 -0
  41. package/dist/memory/CognitiveMemoryManager.d.ts.map +1 -0
  42. package/dist/memory/CognitiveMemoryManager.js +519 -0
  43. package/dist/memory/CognitiveMemoryManager.js.map +1 -0
  44. package/dist/memory/config.d.ts +135 -0
  45. package/dist/memory/config.d.ts.map +1 -0
  46. package/dist/memory/config.js +28 -0
  47. package/dist/memory/config.js.map +1 -0
  48. package/dist/memory/consolidation/ConsolidationPipeline.d.ts +70 -0
  49. package/dist/memory/consolidation/ConsolidationPipeline.d.ts.map +1 -0
  50. package/dist/memory/consolidation/ConsolidationPipeline.js +301 -0
  51. package/dist/memory/consolidation/ConsolidationPipeline.js.map +1 -0
  52. package/dist/memory/context/CompactionEngine.d.ts +21 -0
  53. package/dist/memory/context/CompactionEngine.d.ts.map +1 -0
  54. package/dist/memory/context/CompactionEngine.js +35 -0
  55. package/dist/memory/context/CompactionEngine.js.map +1 -0
  56. package/dist/memory/context/CompactionLog.d.ts +50 -0
  57. package/dist/memory/context/CompactionLog.d.ts.map +1 -0
  58. package/dist/memory/context/CompactionLog.js +139 -0
  59. package/dist/memory/context/CompactionLog.js.map +1 -0
  60. package/dist/memory/context/ContextWindowManager.d.ts +114 -0
  61. package/dist/memory/context/ContextWindowManager.d.ts.map +1 -0
  62. package/dist/memory/context/ContextWindowManager.js +225 -0
  63. package/dist/memory/context/ContextWindowManager.js.map +1 -0
  64. package/dist/memory/context/RollingSummaryChain.d.ts +53 -0
  65. package/dist/memory/context/RollingSummaryChain.d.ts.map +1 -0
  66. package/dist/memory/context/RollingSummaryChain.js +193 -0
  67. package/dist/memory/context/RollingSummaryChain.js.map +1 -0
  68. package/dist/memory/context/index.d.ts +15 -0
  69. package/dist/memory/context/index.d.ts.map +1 -0
  70. package/dist/memory/context/index.js +14 -0
  71. package/dist/memory/context/index.js.map +1 -0
  72. package/dist/memory/context/strategies/HierarchicalStrategy.d.ts +25 -0
  73. package/dist/memory/context/strategies/HierarchicalStrategy.d.ts.map +1 -0
  74. package/dist/memory/context/strategies/HierarchicalStrategy.js +240 -0
  75. package/dist/memory/context/strategies/HierarchicalStrategy.js.map +1 -0
  76. package/dist/memory/context/strategies/HybridStrategy.d.ts +26 -0
  77. package/dist/memory/context/strategies/HybridStrategy.d.ts.map +1 -0
  78. package/dist/memory/context/strategies/HybridStrategy.js +245 -0
  79. package/dist/memory/context/strategies/HybridStrategy.js.map +1 -0
  80. package/dist/memory/context/strategies/SlidingSummaryStrategy.d.ts +22 -0
  81. package/dist/memory/context/strategies/SlidingSummaryStrategy.d.ts.map +1 -0
  82. package/dist/memory/context/strategies/SlidingSummaryStrategy.js +203 -0
  83. package/dist/memory/context/strategies/SlidingSummaryStrategy.js.map +1 -0
  84. package/dist/memory/context/types.d.ts +120 -0
  85. package/dist/memory/context/types.d.ts.map +1 -0
  86. package/dist/memory/context/types.js +17 -0
  87. package/dist/memory/context/types.js.map +1 -0
  88. package/dist/memory/decay/DecayModel.d.ts +87 -0
  89. package/dist/memory/decay/DecayModel.d.ts.map +1 -0
  90. package/dist/memory/decay/DecayModel.js +117 -0
  91. package/dist/memory/decay/DecayModel.js.map +1 -0
  92. package/dist/memory/decay/RetrievalPriorityScorer.d.ts +63 -0
  93. package/dist/memory/decay/RetrievalPriorityScorer.d.ts.map +1 -0
  94. package/dist/memory/decay/RetrievalPriorityScorer.js +110 -0
  95. package/dist/memory/decay/RetrievalPriorityScorer.js.map +1 -0
  96. package/dist/memory/encoding/ContentFeatureDetector.d.ts +37 -0
  97. package/dist/memory/encoding/ContentFeatureDetector.d.ts.map +1 -0
  98. package/dist/memory/encoding/ContentFeatureDetector.js +176 -0
  99. package/dist/memory/encoding/ContentFeatureDetector.js.map +1 -0
  100. package/dist/memory/encoding/EncodingModel.d.ts +67 -0
  101. package/dist/memory/encoding/EncodingModel.d.ts.map +1 -0
  102. package/dist/memory/encoding/EncodingModel.js +171 -0
  103. package/dist/memory/encoding/EncodingModel.js.map +1 -0
  104. package/dist/memory/extension/CognitiveMemoryExtension.d.ts +18 -0
  105. package/dist/memory/extension/CognitiveMemoryExtension.d.ts.map +1 -0
  106. package/dist/memory/extension/CognitiveMemoryExtension.js +131 -0
  107. package/dist/memory/extension/CognitiveMemoryExtension.js.map +1 -0
  108. package/dist/memory/graph/GraphologyMemoryGraph.d.ts +29 -0
  109. package/dist/memory/graph/GraphologyMemoryGraph.d.ts.map +1 -0
  110. package/dist/memory/graph/GraphologyMemoryGraph.js +224 -0
  111. package/dist/memory/graph/GraphologyMemoryGraph.js.map +1 -0
  112. package/dist/memory/graph/IMemoryGraph.d.ts +70 -0
  113. package/dist/memory/graph/IMemoryGraph.d.ts.map +1 -0
  114. package/dist/memory/graph/IMemoryGraph.js +15 -0
  115. package/dist/memory/graph/IMemoryGraph.js.map +1 -0
  116. package/dist/memory/graph/KnowledgeGraphMemoryGraph.d.ts +38 -0
  117. package/dist/memory/graph/KnowledgeGraphMemoryGraph.d.ts.map +1 -0
  118. package/dist/memory/graph/KnowledgeGraphMemoryGraph.js +264 -0
  119. package/dist/memory/graph/KnowledgeGraphMemoryGraph.js.map +1 -0
  120. package/dist/memory/graph/SpreadingActivation.d.ts +36 -0
  121. package/dist/memory/graph/SpreadingActivation.d.ts.map +1 -0
  122. package/dist/memory/graph/SpreadingActivation.js +100 -0
  123. package/dist/memory/graph/SpreadingActivation.js.map +1 -0
  124. package/dist/memory/index.d.ts +52 -0
  125. package/dist/memory/index.d.ts.map +1 -0
  126. package/dist/memory/index.js +43 -0
  127. package/dist/memory/index.js.map +1 -0
  128. package/dist/memory/observation/MemoryObserver.d.ts +59 -0
  129. package/dist/memory/observation/MemoryObserver.d.ts.map +1 -0
  130. package/dist/memory/observation/MemoryObserver.js +136 -0
  131. package/dist/memory/observation/MemoryObserver.js.map +1 -0
  132. package/dist/memory/observation/MemoryReflector.d.ts +51 -0
  133. package/dist/memory/observation/MemoryReflector.d.ts.map +1 -0
  134. package/dist/memory/observation/MemoryReflector.js +184 -0
  135. package/dist/memory/observation/MemoryReflector.js.map +1 -0
  136. package/dist/memory/observation/ObservationBuffer.d.ts +51 -0
  137. package/dist/memory/observation/ObservationBuffer.d.ts.map +1 -0
  138. package/dist/memory/observation/ObservationBuffer.js +81 -0
  139. package/dist/memory/observation/ObservationBuffer.js.map +1 -0
  140. package/dist/memory/prompt/MemoryFormatters.d.ts +22 -0
  141. package/dist/memory/prompt/MemoryFormatters.d.ts.map +1 -0
  142. package/dist/memory/prompt/MemoryFormatters.js +113 -0
  143. package/dist/memory/prompt/MemoryFormatters.js.map +1 -0
  144. package/dist/memory/prompt/MemoryPromptAssembler.d.ts +40 -0
  145. package/dist/memory/prompt/MemoryPromptAssembler.d.ts.map +1 -0
  146. package/dist/memory/prompt/MemoryPromptAssembler.js +180 -0
  147. package/dist/memory/prompt/MemoryPromptAssembler.js.map +1 -0
  148. package/dist/memory/prospective/ProspectiveMemoryManager.d.ts +83 -0
  149. package/dist/memory/prospective/ProspectiveMemoryManager.d.ts.map +1 -0
  150. package/dist/memory/prospective/ProspectiveMemoryManager.js +128 -0
  151. package/dist/memory/prospective/ProspectiveMemoryManager.js.map +1 -0
  152. package/dist/memory/store/MemoryStore.d.ts +76 -0
  153. package/dist/memory/store/MemoryStore.d.ts.map +1 -0
  154. package/dist/memory/store/MemoryStore.js +320 -0
  155. package/dist/memory/store/MemoryStore.js.map +1 -0
  156. package/dist/memory/types.d.ts +184 -0
  157. package/dist/memory/types.d.ts.map +1 -0
  158. package/dist/memory/types.js +14 -0
  159. package/dist/memory/types.js.map +1 -0
  160. package/dist/memory/working/CognitiveWorkingMemory.d.ts +87 -0
  161. package/dist/memory/working/CognitiveWorkingMemory.d.ts.map +1 -0
  162. package/dist/memory/working/CognitiveWorkingMemory.js +230 -0
  163. package/dist/memory/working/CognitiveWorkingMemory.js.map +1 -0
  164. package/dist/rag/EmbeddingManager.d.ts.map +1 -1
  165. package/dist/rag/EmbeddingManager.js +8 -1
  166. package/dist/rag/EmbeddingManager.js.map +1 -1
  167. package/dist/speech/SpeechProviderRegistry.d.ts +17 -0
  168. package/dist/speech/SpeechProviderRegistry.d.ts.map +1 -0
  169. package/dist/speech/SpeechProviderRegistry.js +47 -0
  170. package/dist/speech/SpeechProviderRegistry.js.map +1 -0
  171. package/dist/speech/SpeechRuntime.d.ts +28 -0
  172. package/dist/speech/SpeechRuntime.d.ts.map +1 -0
  173. package/dist/speech/SpeechRuntime.js +138 -0
  174. package/dist/speech/SpeechRuntime.js.map +1 -0
  175. package/dist/speech/SpeechSession.d.ts +37 -0
  176. package/dist/speech/SpeechSession.d.ts.map +1 -0
  177. package/dist/speech/SpeechSession.js +285 -0
  178. package/dist/speech/SpeechSession.js.map +1 -0
  179. package/dist/speech/audio.d.ts +3 -0
  180. package/dist/speech/audio.d.ts.map +1 -0
  181. package/dist/speech/audio.js +39 -0
  182. package/dist/speech/audio.js.map +1 -0
  183. package/dist/speech/index.d.ts +11 -0
  184. package/dist/speech/index.d.ts.map +1 -0
  185. package/dist/speech/index.js +11 -0
  186. package/dist/speech/index.js.map +1 -0
  187. package/dist/speech/providerCatalog.d.ts +7 -0
  188. package/dist/speech/providerCatalog.d.ts.map +1 -0
  189. package/dist/speech/providerCatalog.js +243 -0
  190. package/dist/speech/providerCatalog.js.map +1 -0
  191. package/dist/speech/providers/BuiltInAdaptiveVadProvider.d.ts +20 -0
  192. package/dist/speech/providers/BuiltInAdaptiveVadProvider.d.ts.map +1 -0
  193. package/dist/speech/providers/BuiltInAdaptiveVadProvider.js +29 -0
  194. package/dist/speech/providers/BuiltInAdaptiveVadProvider.js.map +1 -0
  195. package/dist/speech/providers/ElevenLabsTextToSpeechProvider.d.ts +20 -0
  196. package/dist/speech/providers/ElevenLabsTextToSpeechProvider.d.ts.map +1 -0
  197. package/dist/speech/providers/ElevenLabsTextToSpeechProvider.js +95 -0
  198. package/dist/speech/providers/ElevenLabsTextToSpeechProvider.js.map +1 -0
  199. package/dist/speech/providers/OpenAITextToSpeechProvider.d.ts +20 -0
  200. package/dist/speech/providers/OpenAITextToSpeechProvider.d.ts.map +1 -0
  201. package/dist/speech/providers/OpenAITextToSpeechProvider.js +75 -0
  202. package/dist/speech/providers/OpenAITextToSpeechProvider.js.map +1 -0
  203. package/dist/speech/providers/OpenAIWhisperSpeechToTextProvider.d.ts +18 -0
  204. package/dist/speech/providers/OpenAIWhisperSpeechToTextProvider.d.ts.map +1 -0
  205. package/dist/speech/providers/OpenAIWhisperSpeechToTextProvider.js +109 -0
  206. package/dist/speech/providers/OpenAIWhisperSpeechToTextProvider.js.map +1 -0
  207. package/dist/speech/types.d.ts +270 -0
  208. package/dist/speech/types.d.ts.map +1 -0
  209. package/dist/speech/types.js +2 -0
  210. package/dist/speech/types.js.map +1 -0
  211. package/package.json +22 -2
@@ -0,0 +1,121 @@
1
+ /**
2
+ * @fileoverview Main audio processing pipeline with environmental adaptation using Web Audio APIs.
3
+ * This component is intended for client-side execution in a web browser.
4
+ * @module agentos/core/audio/AudioProcessor
5
+ */
6
+ import { EventEmitter } from 'events';
7
+ import { NoiseProfile, CalibrationConfig } from './EnvironmentalCalibrator';
8
+ import { VADResult, AdaptiveVADConfig as LogicVADConfig, VADEmitterEvents } from './AdaptiveVAD';
9
+ /**
10
+ * Configuration for the Web Audio API based AudioProcessor.
11
+ * Note: `frameSize` here refers to the ScriptProcessorNode's buffer size.
12
+ * The actual processing frame for VAD/Calibrator might be this size or smaller if sub-chunked.
13
+ */
14
+ export interface WebAudioProcessorConfig {
15
+ /** Sample rate for processing. AudioContext will try to match this. */
16
+ sampleRate?: number;
17
+ /**
18
+ * Buffer size for the ScriptProcessorNode in samples. This determines the frequency of `onaudioprocess`.
19
+ * Common values: 256, 512, 1024, 2048, 4096.
20
+ * This also dictates the size of `audioFrame` given to VAD/Calibrator unless further chunking is done.
21
+ */
22
+ bufferSize?: number;
23
+ /** Enable Automatic Gain Control (AGC) via a GainNode (conceptual placeholder for now). */
24
+ enableAGC?: boolean;
25
+ }
26
+ /**
27
+ * Represents the internal processing state of the AudioProcessor.
28
+ */
29
+ export interface AudioProcessorState {
30
+ isCalibratorCalibrated: boolean;
31
+ isProcessing: boolean;
32
+ currentEnvironmentType: NoiseProfile['environmentType'] | 'unknown';
33
+ lastNoiseProfileUpdateMs: number;
34
+ vadIsSpeaking: boolean;
35
+ }
36
+ /**
37
+ * Represents a complete speech audio chunk captured by the processor.
38
+ */
39
+ export interface SpeechAudioChunk {
40
+ id: string;
41
+ audioData: Float32Array;
42
+ sampleRate: number;
43
+ durationMs: number;
44
+ startTimeMs: number;
45
+ vadResultAtEnd: VADResult;
46
+ noiseProfileContext?: NoiseProfile | null;
47
+ }
48
+ /**
49
+ * Events emitted by the WebAudioProcessor.
50
+ */
51
+ export interface WebAudioProcessorEvents extends VADEmitterEvents {
52
+ 'processor:initialized': () => void;
53
+ 'processor:started': () => void;
54
+ 'processor:stopped': () => void;
55
+ 'processor:error': (error: Error) => void;
56
+ 'processor:disposed': () => void;
57
+ 'calibration:started': () => void;
58
+ 'calibration:complete': (profile: NoiseProfile) => void;
59
+ 'profile:updated': (profile: NoiseProfile) => void;
60
+ 'anomaly:detected': (type: string, details: any, profile: NoiseProfile) => void;
61
+ /** Emitted when a complete speech audio chunk is ready. */
62
+ 'speech_chunk_ready': (chunk: SpeechAudioChunk) => void;
63
+ /** Raw audio frame from onaudioprocess, for debugging or other consumers. */
64
+ 'raw_audio_frame': (frame: Float32Array, sampleRate: number) => void;
65
+ }
66
+ /**
67
+ * AudioProcessor - Central client-side audio processing pipeline using Web Audio APIs.
68
+ * Orchestrates EnvironmentalCalibrator (web-version) and AdaptiveVAD (logic-version).
69
+ */
70
+ export declare class AudioProcessor extends EventEmitter {
71
+ private config;
72
+ private calibrator;
73
+ private vad;
74
+ private audioContext;
75
+ private mediaStream;
76
+ private sourceNode;
77
+ private processorNode;
78
+ private gainNode;
79
+ private isInitialized;
80
+ private _isProcessing;
81
+ private frameDurationMs;
82
+ private speechDataBuffer;
83
+ private currentSpeechStartTimeMs;
84
+ private internalState;
85
+ on<U extends keyof WebAudioProcessorEvents>(event: U, listener: WebAudioProcessorEvents[U]): this;
86
+ emit<U extends keyof WebAudioProcessorEvents>(event: U, ...args: Parameters<WebAudioProcessorEvents[U]>): boolean;
87
+ constructor(config?: WebAudioProcessorConfig, calibrationConfig?: CalibrationConfig, // For web-based EnvironmentalCalibrator
88
+ vadConfig?: LogicVADConfig);
89
+ private setupEventForwarding;
90
+ /**
91
+ * Initialize the audio processing pipeline with a given MediaStream.
92
+ * @param {MediaStream} stream - The user's audio MediaStream.
93
+ * @returns {Promise<void>}
94
+ */
95
+ initialize(stream: MediaStream): Promise<void>;
96
+ /**
97
+ * Start processing audio. Must be called after initialize.
98
+ * Often requires user interaction to start AudioContext.
99
+ */
100
+ start(): Promise<void>;
101
+ /** Stop processing audio. */
102
+ stop(): void;
103
+ private processAudioEvent;
104
+ private isCurrentlySpeakingOrRecentlyEnded;
105
+ private concatenateFloat32Arrays;
106
+ /**
107
+ * Get current processing state.
108
+ * @returns {AudioProcessorState}
109
+ */
110
+ getInternalState(): AudioProcessorState;
111
+ /**
112
+ * Returns true if the audio processor is currently capturing and processing audio.
113
+ */
114
+ get isProcessing(): boolean;
115
+ /**
116
+ * Cleanly dispose of all Web Audio API resources.
117
+ * @returns {Promise<void>}
118
+ */
119
+ dispose(): Promise<void>;
120
+ }
121
+ //# sourceMappingURL=AudioProcessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioProcessor.d.ts","sourceRoot":"","sources":["../../../src/core/audio/AudioProcessor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,299 @@
1
+ // backend/agentos/core/audio/AudioProcessor.ts
2
+ /**
3
+ * @fileoverview Main audio processing pipeline with environmental adaptation using Web Audio APIs.
4
+ * This component is intended for client-side execution in a web browser.
5
+ * @module agentos/core/audio/AudioProcessor
6
+ */
7
+ import { EventEmitter } from 'events';
8
+ // EnvironmentalCalibrator will be your web-based version
9
+ import { EnvironmentalCalibrator } from './EnvironmentalCalibrator.js';
10
+ // AdaptiveVAD is the logic-based one we created
11
+ import { AdaptiveVAD } from './AdaptiveVAD.js';
12
+ /**
13
+ * AudioProcessor - Central client-side audio processing pipeline using Web Audio APIs.
14
+ * Orchestrates EnvironmentalCalibrator (web-version) and AdaptiveVAD (logic-version).
15
+ */
16
+ export class AudioProcessor extends EventEmitter {
17
+ on(event, listener) {
18
+ return super.on(event, listener);
19
+ }
20
+ emit(event, ...args) {
21
+ return super.emit(event, ...args);
22
+ }
23
+ constructor(config = {}, calibrationConfig = {}, // For web-based EnvironmentalCalibrator
24
+ vadConfig = {} // For logic-based AdaptiveVAD
25
+ ) {
26
+ super();
27
+ this.audioContext = null;
28
+ this.mediaStream = null;
29
+ this.sourceNode = null;
30
+ this.processorNode = null;
31
+ this.gainNode = null; // For potential AGC
32
+ this.isInitialized = false;
33
+ this._isProcessing = false;
34
+ this.speechDataBuffer = []; // To accumulate speech frames
35
+ this.currentSpeechStartTimeMs = null;
36
+ this.config = {
37
+ sampleRate: config.sampleRate || 16000,
38
+ bufferSize: config.bufferSize || 4096, // ScriptProcessorNode buffer size
39
+ enableAGC: config.enableAGC ?? false,
40
+ };
41
+ // Calculate frame duration based on ScriptProcessorNode's output
42
+ this.frameDurationMs = (this.config.bufferSize / this.config.sampleRate) * 1000;
43
+ if (this.frameDurationMs <= 0 || !isFinite(this.frameDurationMs)) {
44
+ throw new Error(`AudioProcessor: Invalid frame duration (${this.frameDurationMs}ms). Check bufferSize (${this.config.bufferSize}) and sampleRate (${this.config.sampleRate}).`);
45
+ }
46
+ // Instantiate the WEB-BASED EnvironmentalCalibrator
47
+ // It will use Web Audio APIs for its 'calibrate(stream)' method.
48
+ this.calibrator = new EnvironmentalCalibrator({
49
+ ...calibrationConfig,
50
+ sampleRate: this.config.sampleRate, // It needs sampleRate
51
+ // If its 'calibrate' uses its own AnalyserNode, it might need bufferSize too.
52
+ });
53
+ // Instantiate the LOGIC-BASED AdaptiveVAD
54
+ this.vad = new AdaptiveVAD(vadConfig, this.calibrator, // VAD uses the calibrator instance
55
+ this.frameDurationMs // VAD needs to know the duration of frames it will receive
56
+ );
57
+ this.internalState = {
58
+ isCalibratorCalibrated: false,
59
+ isProcessing: false,
60
+ currentEnvironmentType: 'unknown',
61
+ lastNoiseProfileUpdateMs: 0,
62
+ vadIsSpeaking: false,
63
+ };
64
+ this.setupEventForwarding();
65
+ }
66
+ setupEventForwarding() {
67
+ this.calibrator.on('calibration:started', () => this.emit('calibration:started'));
68
+ this.calibrator.on('calibration:complete', (profile) => {
69
+ this.internalState.isCalibratorCalibrated = true;
70
+ this.internalState.currentEnvironmentType = profile.environmentType;
71
+ this.internalState.lastNoiseProfileUpdateMs = profile.timestamp;
72
+ this.emit('calibration:complete', profile);
73
+ });
74
+ this.calibrator.on('profile:updated', (profile) => {
75
+ this.internalState.currentEnvironmentType = profile.environmentType;
76
+ this.internalState.lastNoiseProfileUpdateMs = profile.timestamp;
77
+ this.emit('profile:updated', profile);
78
+ });
79
+ this.calibrator.on('anomaly:detected', (type, details, profile) => {
80
+ // The web-based calibrator might not pass 'profile' here, adjust if needed based on its signature.
81
+ // Assuming it does based on previous refactor of Node.js version.
82
+ this.emit('anomaly:detected', type, details, profile);
83
+ });
84
+ // VAD Event Handling
85
+ this.vad.on('speech_start', (vadResult) => {
86
+ this.speechDataBuffer = []; // Clear buffer for new speech segment
87
+ this.currentSpeechStartTimeMs = Date.now() - this.frameDurationMs; // Approximate start to previous frame
88
+ this.internalState.vadIsSpeaking = true;
89
+ this.emit('speech_start', vadResult);
90
+ });
91
+ this.vad.on('voice_activity', (vadResult) => {
92
+ // The frame causing this is handled in `processAudioEvent` to be added to buffer
93
+ this.emit('voice_activity', vadResult);
94
+ });
95
+ this.vad.on('speech_end', (vadResult, speechDurationMs) => {
96
+ this.internalState.vadIsSpeaking = false;
97
+ this.emit('speech_end', vadResult, speechDurationMs);
98
+ if (this.speechDataBuffer.length > 0 && this.currentSpeechStartTimeMs !== null) {
99
+ const concatenatedAudio = this.concatenateFloat32Arrays(this.speechDataBuffer);
100
+ const chunk = {
101
+ id: `spch_${Date.now()}`,
102
+ audioData: concatenatedAudio,
103
+ sampleRate: this.config.sampleRate,
104
+ durationMs: speechDurationMs, // Use VAD's calculated duration
105
+ startTimeMs: this.currentSpeechStartTimeMs,
106
+ vadResultAtEnd: vadResult,
107
+ noiseProfileContext: this.calibrator.getCurrentProfile()
108
+ };
109
+ this.emit('speech_chunk_ready', chunk);
110
+ }
111
+ this.speechDataBuffer = []; // Clear buffer
112
+ this.currentSpeechStartTimeMs = null;
113
+ });
114
+ this.vad.on('thresholds_updated', (speech, silence, profile) => {
115
+ this.emit('thresholds_updated', speech, silence, profile);
116
+ });
117
+ }
118
+ /**
119
+ * Initialize the audio processing pipeline with a given MediaStream.
120
+ * @param {MediaStream} stream - The user's audio MediaStream.
121
+ * @returns {Promise<void>}
122
+ */
123
+ async initialize(stream) {
124
+ if (this.isInitialized) {
125
+ console.warn('AudioProcessor already initialized.');
126
+ return;
127
+ }
128
+ console.log('🎙️ Initializing Web AudioProcessor...');
129
+ this.mediaStream = stream;
130
+ try {
131
+ this.audioContext = new (window.AudioContext || window.webkitAudioContext)({
132
+ sampleRate: this.config.sampleRate,
133
+ });
134
+ // Forcing sample rate can be tricky; browser might use its own.
135
+ // It's better to adapt to audioContext.sampleRate if they differ significantly.
136
+ if (Math.abs(this.audioContext.sampleRate - this.config.sampleRate) > 100) {
137
+ console.warn(`AudioContext sample rate (${this.audioContext.sampleRate}Hz) differs significantly from configured (${this.config.sampleRate}Hz). Using AudioContext's rate.`);
138
+ // Re-calculate frameDurationMs if sampleRate changed
139
+ // this.config.sampleRate = this.audioContext.sampleRate; // Update config if we decide to follow context's rate
140
+ // this.frameDurationMs = (this.config.bufferSize / this.config.sampleRate) * 1000;
141
+ // TODO: Decide if VAD needs re-initialization or if its config can adapt.
142
+ }
143
+ this.sourceNode = this.audioContext.createMediaStreamSource(stream);
144
+ this.gainNode = this.audioContext.createGain(); // For potential AGC
145
+ this.processorNode = this.audioContext.createScriptProcessor(this.config.bufferSize, 1, // input channels
146
+ 1 // output channels
147
+ );
148
+ this.sourceNode.connect(this.gainNode);
149
+ this.gainNode.connect(this.processorNode);
150
+ this.processorNode.connect(this.audioContext.destination); // Necessary to keep processing alive
151
+ this.processorNode.onaudioprocess = (event) => {
152
+ if (this._isProcessing) {
153
+ this.processAudioEvent(event);
154
+ }
155
+ };
156
+ // Start environmental calibration using the web-based calibrator
157
+ // This version of 'calibrate' is from the user-provided EnvironmentalCalibrator,
158
+ // which expects a MediaStream. We'll need to ensure it works correctly.
159
+ console.log('🎤 Starting environmental calibration (web)...');
160
+ this.emit('calibration:started'); // Emit our own event
161
+ await this.calibrator.calibrate(stream); // This should internally use the stream
162
+ // and emit 'calibration:complete' itself.
163
+ this.isInitialized = true;
164
+ this.emit('processor:initialized');
165
+ console.log('✅ Web AudioProcessor initialized.');
166
+ }
167
+ catch (error) {
168
+ console.error('❌ Failed to initialize Web AudioProcessor:', error);
169
+ this.emit('processor:error', error);
170
+ await this.dispose();
171
+ throw error;
172
+ }
173
+ }
174
+ /**
175
+ * Start processing audio. Must be called after initialize.
176
+ * Often requires user interaction to start AudioContext.
177
+ */
178
+ async start() {
179
+ if (!this.isInitialized) {
180
+ throw new Error('AudioProcessor not initialized. Call initialize() first.');
181
+ }
182
+ if (this._isProcessing) {
183
+ console.warn('AudioProcessor is already processing.');
184
+ return;
185
+ }
186
+ if (this.audioContext && this.audioContext.state === 'suspended') {
187
+ try {
188
+ await this.audioContext.resume();
189
+ console.log('AudioContext resumed successfully.');
190
+ }
191
+ catch (err) {
192
+ console.error('Error resuming AudioContext:', err);
193
+ this.emit('processor:error', new Error('Failed to resume AudioContext. User interaction might be required.'));
194
+ return;
195
+ }
196
+ }
197
+ this._isProcessing = true;
198
+ this.internalState.isProcessing = true;
199
+ this.vad.resetState(); // Reset VAD state when starting
200
+ console.log('▶️ Web Audio processing started.');
201
+ this.emit('processor:started');
202
+ }
203
+ /** Stop processing audio. */
204
+ stop() {
205
+ if (!this._isProcessing)
206
+ return;
207
+ this._isProcessing = false;
208
+ this.internalState.isProcessing = false;
209
+ console.log('⏹️ Web Audio processing stopped.');
210
+ this.emit('processor:stopped');
211
+ }
212
+ processAudioEvent(event) {
213
+ const audioFrame = new Float32Array(event.inputBuffer.getChannelData(0)); // Get a copy
214
+ this.emit('raw_audio_frame', audioFrame, this.audioContext?.sampleRate ?? this.config.sampleRate);
215
+ // 1. Pass frame to EnvironmentalCalibrator for continuous adaptation
216
+ // The web-based calibrator's `continuousAdaptation` takes a Float32Array.
217
+ if (this.internalState.isCalibratorCalibrated) { // Only adapt after initial calibration
218
+ this.calibrator.continuousAdaptation(audioFrame);
219
+ }
220
+ // 2. Pass frame to AdaptiveVAD
221
+ const vadResult = this.vad.processFrame(audioFrame);
222
+ this.internalState.vadIsSpeaking = this.vad.getCurrentState().isSpeaking; // Update internal state
223
+ // 3. Buffer audio if VAD indicates speech
224
+ if (this.internalState.vadIsSpeaking || this.speechDataBuffer.length > 0) {
225
+ // Add to buffer if VAD says it's speech, OR if we were accumulating and it might be the tail end.
226
+ // The VAD's speech_end logic will determine if the buffer forms a valid chunk.
227
+ const vadConfig = this.vad.getConfig();
228
+ if (vadResult.isSpeech || (this.isCurrentlySpeakingOrRecentlyEnded() && this.speechDataBuffer.length < ((this.vad.getCurrentState().consecutiveSilenceFrames * this.frameDurationMs) < vadConfig.maxSilenceDurationMsInSpeech ? 100 : 0))) { // Heuristic to grab trailing audio frames
229
+ this.speechDataBuffer.push(audioFrame.slice()); // Store a copy
230
+ }
231
+ }
232
+ }
233
+ // Helper to check if VAD is speaking or was speaking very recently (within one frame)
234
+ isCurrentlySpeakingOrRecentlyEnded() {
235
+ const vadState = this.vad.getCurrentState();
236
+ return vadState.isSpeaking || (vadState.consecutiveSilenceFrames * this.frameDurationMs < this.frameDurationMs * 2);
237
+ }
238
+ concatenateFloat32Arrays(arrays) {
239
+ let totalLength = 0;
240
+ for (const arr of arrays) {
241
+ totalLength += arr.length;
242
+ }
243
+ const result = new Float32Array(totalLength);
244
+ let offset = 0;
245
+ for (const arr of arrays) {
246
+ result.set(arr, offset);
247
+ offset += arr.length;
248
+ }
249
+ return result;
250
+ }
251
+ /**
252
+ * Get current processing state.
253
+ * @returns {AudioProcessorState}
254
+ */
255
+ getInternalState() {
256
+ return { ...this.internalState, vadIsSpeaking: this.vad.getCurrentState().isSpeaking };
257
+ }
258
+ /**
259
+ * Returns true if the audio processor is currently capturing and processing audio.
260
+ */
261
+ get isProcessing() {
262
+ return this._isProcessing;
263
+ }
264
+ /**
265
+ * Cleanly dispose of all Web Audio API resources.
266
+ * @returns {Promise<void>}
267
+ */
268
+ async dispose() {
269
+ console.log('🗑️ Disposing Web AudioProcessor...');
270
+ this.stop();
271
+ if (this.processorNode) {
272
+ this.processorNode.disconnect();
273
+ this.processorNode.onaudioprocess = null;
274
+ }
275
+ if (this.gainNode)
276
+ this.gainNode.disconnect();
277
+ if (this.sourceNode)
278
+ this.sourceNode.disconnect();
279
+ this.mediaStream?.getTracks().forEach(track => track.stop());
280
+ if (this.audioContext && this.audioContext.state !== 'closed') {
281
+ try {
282
+ await this.audioContext.close();
283
+ }
284
+ catch (e) {
285
+ console.warn("Error closing AudioContext:", e);
286
+ }
287
+ }
288
+ this.audioContext = null;
289
+ this.sourceNode = null;
290
+ this.processorNode = null;
291
+ this.gainNode = null;
292
+ this.mediaStream = null;
293
+ this.isInitialized = false;
294
+ this.speechDataBuffer = [];
295
+ console.log('🚮 Web AudioProcessor disposed.');
296
+ this.emit('processor:disposed');
297
+ }
298
+ }
299
+ //# sourceMappingURL=AudioProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioProcessor.js","sourceRoot":"","sources":["../../../src/core/audio/AudioProcessor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,187 @@
1
+ import { EventEmitter } from 'events';
2
+ /**
3
+ * @fileoverview Environmental noise calibration and adaptation system for Web Browsers.
4
+ * This module uses Web Audio APIs to understand the acoustic properties of the
5
+ * environment by analyzing an input MediaStream for initial calibration, and then
6
+ * processing raw audio frames (Float32Array) for continuous adaptation.
7
+ * @module agentos/core/audio/EnvironmentalCalibrator
8
+ */
9
+ /**
10
+ * Represents the acoustic profile of the environment.
11
+ * This profile is used by other audio components (like VAD) to adjust their sensitivity.
12
+ */
13
+ export interface NoiseProfile {
14
+ /** Root Mean Square of the baseline ambient noise, calculated using a percentile. */
15
+ baselineRMS: number;
16
+ /** Peak Root Mean Square detected during an observation window. */
17
+ peakRMS: number;
18
+ /** Standard deviation of RMS values, indicating noise floor stability. */
19
+ noiseStdDev: number;
20
+ /**
21
+ * Optional frequency spectrum analysis (e.g., 32 bands).
22
+ * Populated if `enableFrequencyAnalysis` is true.
23
+ */
24
+ frequencyProfile?: Float32Array;
25
+ /** Classified type of the acoustic environment. */
26
+ environmentType: 'quiet' | 'normal' | 'noisy' | 'very_noisy';
27
+ /** Confidence in the profile (0-1), based on data quantity and stability. */
28
+ confidenceScore: number;
29
+ /** Timestamp (Unix epoch ms) of when this profile was last calculated. */
30
+ timestamp: number;
31
+ /** Suggested speech detection threshold (RMS value) based on this profile. */
32
+ suggestedSpeechThreshold: number;
33
+ /** Suggested silence detection threshold (RMS value) based on this profile. */
34
+ suggestedSilenceThreshold: number;
35
+ /** Number of audio frames/buffers analyzed to generate or update this profile. */
36
+ framesAnalyzedCount: number;
37
+ }
38
+ /**
39
+ * Configuration for environmental calibration using Web Audio APIs.
40
+ */
41
+ export interface CalibrationConfig {
42
+ /**
43
+ * Duration in milliseconds for the initial calibration phase via MediaStream.
44
+ * @default 3000
45
+ */
46
+ initialCalibrationMs?: number;
47
+ /**
48
+ * Buffer size for the ScriptProcessorNode used during initial calibration.
49
+ * Affects how often audio data is analyzed during calibration.
50
+ * @default 4096
51
+ */
52
+ calibrationBufferSize?: number;
53
+ /**
54
+ * Minimum number of RMS samples (from processed frames) required for a meaningful profile update
55
+ * during continuous adaptation (when `processAudioFrame` is called).
56
+ * @default 50
57
+ */
58
+ minRmsSamplesForContinuousUpdate?: number;
59
+ /**
60
+ * Initial interval in milliseconds for continuous adaptation checks if no voice activity.
61
+ * This applies when `processAudioFrame` is used for continuous updates.
62
+ * @default 1000
63
+ */
64
+ initialUpdateIntervalMs?: number;
65
+ /**
66
+ * Multiplier for the exponential backoff strategy during continuous adaptation.
67
+ * @default 1.5
68
+ */
69
+ backoffMultiplier?: number;
70
+ /**
71
+ * Maximum interval in milliseconds for continuous adaptation checks.
72
+ * @default 30000
73
+ */
74
+ maxBackoffIntervalMs?: number;
75
+ /**
76
+ * Minimum interval in milliseconds for continuous adaptation checks after activity or change.
77
+ * @default 500
78
+ */
79
+ minBackoffIntervalMs?: number;
80
+ /**
81
+ * Number of recent RMS values (from processed frames) to store in a buffer for continuous adaptation.
82
+ * @default 50
83
+ */
84
+ rmsHistoryBufferSize?: number;
85
+ /**
86
+ * Sensitivity adjustment factor for calculating speech/silence thresholds.
87
+ * @default 1.0
88
+ */
89
+ thresholdSensitivityFactor?: number;
90
+ /**
91
+ * Enable frequency analysis using AnalyserNode during initial calibration.
92
+ * @default true
93
+ */
94
+ enableFrequencyAnalysis?: boolean;
95
+ /**
96
+ * FFT size for the AnalyserNode. Must be a power of 2.
97
+ * `frequencyBinCount` will be `fftSize / 2`.
98
+ * @default 256 (yields 128 frequency bins)
99
+ */
100
+ fftSize?: number;
101
+ /**
102
+ * Sample rate of the audio. The calibrator will try to use this for its internal AudioContext.
103
+ * If the input MediaStream has a different rate, resampling might occur or the stream's rate is used.
104
+ * @default 16000
105
+ */
106
+ sampleRate?: number;
107
+ }
108
+ /**
109
+ * Events emitted by the EnvironmentalCalibrator.
110
+ */
111
+ export interface CalibrationEvents {
112
+ 'profile:updated': (profile: NoiseProfile) => void;
113
+ 'environment:changed': (newEnvironment: NoiseProfile['environmentType'], oldEnvironment: NoiseProfile['environmentType'], profile: NoiseProfile) => void;
114
+ 'calibration:progress': (progress: number, currentRms: number) => void;
115
+ 'calibration:complete': (profile: NoiseProfile) => void;
116
+ 'calibration:started': () => void;
117
+ 'calibration:error': (error: Error) => void;
118
+ 'anomaly:detected': (type: string, details: any, profile: NoiseProfile | null) => void;
119
+ }
120
+ export declare interface EnvironmentalCalibrator {
121
+ on<U extends keyof CalibrationEvents>(event: U, listener: CalibrationEvents[U]): this;
122
+ emit<U extends keyof CalibrationEvents>(event: U, ...args: Parameters<CalibrationEvents[U]>): boolean;
123
+ }
124
+ /**
125
+ * EnvironmentalCalibrator (Web Version) - Adapts to acoustic environment in real-time
126
+ * using Web Audio APIs for initial calibration and processing raw frames for continuous updates.
127
+ */
128
+ export declare class EnvironmentalCalibrator extends EventEmitter {
129
+ private config;
130
+ private currentProfile;
131
+ private profileHistory;
132
+ private rmsValuesForContinuousAdapt;
133
+ private currentBackoffIntervalMs;
134
+ private lastProfileUpdateTimeMs;
135
+ private lastVoiceActivityTimeMs;
136
+ private isDuringInitialCalibration;
137
+ private anomalyDetector;
138
+ private calibrationAudioContext;
139
+ private calibrationSourceNode;
140
+ private calibrationProcessorNode;
141
+ private calibrationAnalyserNode;
142
+ /**
143
+ * Creates a new EnvironmentalCalibrator instance.
144
+ * @param {CalibrationConfig} config - Configuration options.
145
+ */
146
+ constructor(config?: CalibrationConfig);
147
+ /**
148
+ * Performs initial environment calibration using a MediaStream.
149
+ * Sets up a temporary Web Audio pipeline to analyze the stream.
150
+ * @param {MediaStream} audioStream - The live audio input stream for calibration.
151
+ * @returns {Promise<NoiseProfile>} A promise that resolves with the initial noise profile,
152
+ * or rejects if calibration fails.
153
+ */
154
+ calibrate(audioStream: MediaStream): Promise<NoiseProfile>;
155
+ /** Cleans up Web Audio nodes used specifically for initial calibration. */
156
+ private cleanupCalibrationAudioNodes;
157
+ /**
158
+ * Analyzes collected RMS and frequency samples to generate a NoiseProfile.
159
+ * @param rmsSamples - Array of RMS values from calibration.
160
+ * @param frequencySamples - Array of frequency data arrays from calibration.
161
+ * @returns {NoiseProfile} The calculated noise profile.
162
+ */
163
+ private analyzeCalibrationSamples;
164
+ /**
165
+ * Processes a single audio frame for continuous adaptation after initial calibration.
166
+ * @param {Float32Array} audioFrame - A chunk of raw audio data (PCM).
167
+ */
168
+ continuousAdaptation(audioFrame: Float32Array): void;
169
+ /**
170
+ * Helper to update profile based on current RMS history (primarily for continuous adaptation).
171
+ */
172
+ private updateProfileFromRmsHistory;
173
+ /** Classifies the environment based on noise characteristics. */
174
+ private classifyEnvironment;
175
+ /** Calculates adaptive speech and silence thresholds. */
176
+ private calculateAdaptiveThresholds;
177
+ private detectAnomalies;
178
+ /** Records voice activity detection to reset backoff. */
179
+ onVoiceActivityDetected(): void;
180
+ getCurrentProfile(): NoiseProfile | null;
181
+ private addToRmsHistory;
182
+ private calculateRMS;
183
+ private calculatePercentile;
184
+ private calculateStdDev;
185
+ private calculateConfidence;
186
+ }
187
+ //# sourceMappingURL=EnvironmentalCalibrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EnvironmentalCalibrator.d.ts","sourceRoot":"","sources":["../../../src/core/audio/EnvironmentalCalibrator.ts"],"names":[],"mappings":"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"}