ug-js-sdk 3.0.51 → 3.0.57

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 (71) hide show
  1. package/README.md +3 -3
  2. package/dist/ug-core/__tests__/__mocks__/ErrorRetryHandler.d.ts +7 -0
  3. package/dist/ug-core/__tests__/__mocks__/ErrorRetryHandler.js +16 -0
  4. package/dist/ug-core/__tests__/__mocks__/ErrorRetryHandler.js.map +1 -0
  5. package/dist/ug-core/__tests__/__mocks__/mpg123-decoder.d.ts +10 -0
  6. package/dist/ug-core/__tests__/__mocks__/mpg123-decoder.js +16 -0
  7. package/dist/ug-core/__tests__/__mocks__/mpg123-decoder.js.map +1 -0
  8. package/dist/ug-core/__tests__/__mocks__/uuid.d.ts +2 -0
  9. package/dist/ug-core/__tests__/__mocks__/uuid.js +11 -0
  10. package/dist/ug-core/__tests__/__mocks__/uuid.js.map +1 -0
  11. package/dist/ug-core/__tests__/__mocks__/vad-web.d.ts +11 -0
  12. package/dist/ug-core/__tests__/__mocks__/vad-web.js +19 -0
  13. package/dist/ug-core/__tests__/__mocks__/vad-web.js.map +1 -0
  14. package/dist/ug-core/__tests__/conversation-manager/ConversationCommands.test.d.ts +1 -0
  15. package/dist/ug-core/__tests__/conversation-manager/ConversationCommands.test.js +67 -0
  16. package/dist/ug-core/__tests__/conversation-manager/ConversationCommands.test.js.map +1 -0
  17. package/dist/ug-core/__tests__/conversation-manager/ConversationManager.test.d.ts +1 -0
  18. package/dist/ug-core/__tests__/conversation-manager/ConversationManager.test.js +185 -0
  19. package/dist/ug-core/__tests__/conversation-manager/ConversationManager.test.js.map +1 -0
  20. package/dist/ug-core/__tests__/conversation-manager/ErrorRetryHandler.test.d.ts +1 -0
  21. package/dist/ug-core/__tests__/conversation-manager/ErrorRetryHandler.test.js +168 -0
  22. package/dist/ug-core/__tests__/conversation-manager/ErrorRetryHandler.test.js.map +1 -0
  23. package/dist/ug-core/__tests__/core/EventEmitter.test.d.ts +1 -0
  24. package/dist/ug-core/__tests__/core/EventEmitter.test.js +211 -0
  25. package/dist/ug-core/__tests__/core/EventEmitter.test.js.map +1 -0
  26. package/dist/ug-core/__tests__/core/Logger.test.d.ts +1 -0
  27. package/dist/ug-core/__tests__/core/Logger.test.js +162 -0
  28. package/dist/ug-core/__tests__/core/Logger.test.js.map +1 -0
  29. package/dist/ug-core/__tests__/core/localStorage.test.d.ts +1 -0
  30. package/dist/ug-core/__tests__/core/localStorage.test.js +172 -0
  31. package/dist/ug-core/__tests__/core/localStorage.test.js.map +1 -0
  32. package/dist/ug-core/__tests__/e2e/replicate-test.e2e.d.ts +15 -0
  33. package/dist/ug-core/__tests__/e2e/replicate-test.e2e.js +224 -0
  34. package/dist/ug-core/__tests__/e2e/replicate-test.e2e.js.map +1 -0
  35. package/dist/ug-core/__tests__/network/WebSocketConnection.test.d.ts +1 -0
  36. package/dist/ug-core/__tests__/network/WebSocketConnection.test.js +193 -0
  37. package/dist/ug-core/__tests__/network/WebSocketConnection.test.js.map +1 -0
  38. package/dist/ug-core/__tests__/playback-manager/SubtitleManager.test.d.ts +1 -0
  39. package/dist/ug-core/__tests__/playback-manager/SubtitleManager.test.js +228 -0
  40. package/dist/ug-core/__tests__/playback-manager/SubtitleManager.test.js.map +1 -0
  41. package/dist/ug-core/__tests__/setup.d.ts +4 -0
  42. package/dist/ug-core/__tests__/setup.js +8 -0
  43. package/dist/ug-core/__tests__/setup.js.map +1 -0
  44. package/dist/ug-core/conversation-manager/ConversationManager.js +18 -0
  45. package/dist/ug-core/conversation-manager/ConversationManager.js.map +1 -1
  46. package/dist/ug-core/conversation-manager/ErrorRetryHandler.d.ts +1 -0
  47. package/dist/ug-core/conversation-manager/ErrorRetryHandler.js +3 -0
  48. package/dist/ug-core/conversation-manager/ErrorRetryHandler.js.map +1 -1
  49. package/dist/ug-core/conversation-manager/types.d.ts +51 -6
  50. package/dist/ug-core/network/ConversationNetwork.js +12 -6
  51. package/dist/ug-core/network/ConversationNetwork.js.map +1 -1
  52. package/dist/ug-core/playback-manager/PlaybackManager.d.ts +104 -0
  53. package/dist/ug-core/playback-manager/PlaybackManager.js +121 -4
  54. package/dist/ug-core/playback-manager/PlaybackManager.js.map +1 -1
  55. package/dist/ug-core/playback-manager/audio-player/AudioPlayer.d.ts +156 -0
  56. package/dist/ug-core/playback-manager/audio-player/AudioPlayer.js +156 -0
  57. package/dist/ug-core/playback-manager/audio-player/AudioPlayer.js.map +1 -1
  58. package/dist/ug-core/playback-manager/subtitle-manager/SubtitleManager.js +3 -1
  59. package/dist/ug-core/playback-manager/subtitle-manager/SubtitleManager.js.map +1 -1
  60. package/dist/ug-core/types/index.d.ts +34 -3
  61. package/dist/ug-core/user-input-manager/AudioRecorder.d.ts +49 -0
  62. package/dist/ug-core/user-input-manager/AudioRecorder.js +39 -1
  63. package/dist/ug-core/user-input-manager/AudioRecorder.js.map +1 -1
  64. package/dist/ug-core/user-input-manager/UserInputManager.d.ts +82 -6
  65. package/dist/ug-core/user-input-manager/UserInputManager.js +82 -6
  66. package/dist/ug-core/user-input-manager/UserInputManager.js.map +1 -1
  67. package/dist/ug-core/user-input-manager/VADManager.d.ts +62 -0
  68. package/dist/ug-core/user-input-manager/VADManager.js +99 -8
  69. package/dist/ug-core/user-input-manager/VADManager.js.map +1 -1
  70. package/dist/ug-js-sdk.mjs +1 -1
  71. package/package.json +1 -1
package/README.md CHANGED
@@ -29,13 +29,13 @@ const conversation = new ConversationManager({
29
29
  },
30
30
  })
31
31
 
32
- // Start the conversation
33
- await conversation.start()
32
+ // Initialize the connection
33
+ await conversation.initialize()
34
34
 
35
35
  // Send text input
36
36
  await conversation.sendText('Hello!')
37
37
 
38
- // Or enable voice input
38
+ // Or enable voice input (after initialize)
39
39
  await conversation.startListening()
40
40
  ```
41
41
 
@@ -0,0 +1,7 @@
1
+ export declare class ErrorRetryHandler {
2
+ private config;
3
+ constructor(config: any);
4
+ attemptRecovery(errorType: string): Promise<boolean>;
5
+ resetRetryCount(): void;
6
+ getCurrentRetryCount(): number;
7
+ }
@@ -0,0 +1,16 @@
1
+ // Manual mock for ErrorRetryHandler
2
+ export class ErrorRetryHandler {
3
+ config;
4
+ constructor(config) {
5
+ this.config = config;
6
+ }
7
+ async attemptRecovery(errorType) {
8
+ // Default to not recovering so errors propagate to hooks
9
+ return false;
10
+ }
11
+ resetRetryCount() { }
12
+ getCurrentRetryCount() {
13
+ return 0;
14
+ }
15
+ }
16
+ //# sourceMappingURL=ErrorRetryHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorRetryHandler.js","sourceRoot":"","sources":["../../../../src/ug-core/__tests__/__mocks__/ErrorRetryHandler.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,MAAM,OAAO,iBAAiB;IACR;IAApB,YAAoB,MAAW;QAAX,WAAM,GAAN,MAAM,CAAK;IAAG,CAAC;IAEnC,KAAK,CAAC,eAAe,CAAC,SAAiB;QACrC,yDAAyD;QACzD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,eAAe,KAAU,CAAC;IAE1B,oBAAoB;QAClB,OAAO,CAAC,CAAA;IACV,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ export declare class MPEGDecoder {
2
+ constructor();
3
+ ready(): Promise<void>;
4
+ decode(data: Uint8Array): {
5
+ channelData: Float32Array[];
6
+ sampleRate: number;
7
+ };
8
+ reset(): void;
9
+ free(): void;
10
+ }
@@ -0,0 +1,16 @@
1
+ // Mock implementation of mpg123-decoder
2
+ export class MPEGDecoder {
3
+ constructor() { }
4
+ async ready() {
5
+ return Promise.resolve();
6
+ }
7
+ decode(data) {
8
+ return {
9
+ channelData: [new Float32Array(0)],
10
+ sampleRate: 44100,
11
+ };
12
+ }
13
+ reset() { }
14
+ free() { }
15
+ }
16
+ //# sourceMappingURL=mpg123-decoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mpg123-decoder.js","sourceRoot":"","sources":["../../../../src/ug-core/__tests__/__mocks__/mpg123-decoder.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,MAAM,OAAO,WAAW;IACtB,gBAAe,CAAC;IAEhB,KAAK,CAAC,KAAK;QACT,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;IAC1B,CAAC;IAED,MAAM,CAAC,IAAgB;QACrB,OAAO;YACL,WAAW,EAAE,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;YAClC,UAAU,EAAE,KAAK;SAClB,CAAA;IACH,CAAC;IAED,KAAK,KAAU,CAAC;IAEhB,IAAI,KAAU,CAAC;CAChB"}
@@ -0,0 +1,2 @@
1
+ export declare const v4: () => string;
2
+ export declare const __resetMockUuid: () => void;
@@ -0,0 +1,11 @@
1
+ // Mock implementation of uuid
2
+ let counter = 0;
3
+ export const v4 = () => {
4
+ counter++;
5
+ return `mock-uuid-${counter}`;
6
+ };
7
+ // Reset counter for test isolation
8
+ export const __resetMockUuid = () => {
9
+ counter = 0;
10
+ };
11
+ //# sourceMappingURL=uuid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid.js","sourceRoot":"","sources":["../../../../src/ug-core/__tests__/__mocks__/uuid.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,IAAI,OAAO,GAAG,CAAC,CAAA;AAEf,MAAM,CAAC,MAAM,EAAE,GAAG,GAAW,EAAE;IAC7B,OAAO,EAAE,CAAA;IACT,OAAO,aAAa,OAAO,EAAE,CAAA;AAC/B,CAAC,CAAA;AAED,mCAAmC;AACnC,MAAM,CAAC,MAAM,eAAe,GAAG,GAAS,EAAE;IACxC,OAAO,GAAG,CAAC,CAAA;AACb,CAAC,CAAA"}
@@ -0,0 +1,11 @@
1
+ export declare class MicVAD {
2
+ private options;
3
+ static new(options: any): Promise<MicVAD>;
4
+ constructor(options: any);
5
+ start(): void;
6
+ pause(): void;
7
+ destroy(): void;
8
+ }
9
+ export declare const utils: {
10
+ minFramesForTargetMS: (targetMS: number, frameSamples: number, sampleRate: number) => number;
11
+ };
@@ -0,0 +1,19 @@
1
+ // Mock implementation of @ricky0123/vad-web
2
+ export class MicVAD {
3
+ options;
4
+ static async new(options) {
5
+ return new MicVAD(options);
6
+ }
7
+ constructor(options) {
8
+ this.options = options;
9
+ }
10
+ start() { }
11
+ pause() { }
12
+ destroy() { }
13
+ }
14
+ export const utils = {
15
+ minFramesForTargetMS: (targetMS, frameSamples, sampleRate) => {
16
+ return Math.ceil((targetMS * sampleRate) / (1000 * frameSamples));
17
+ },
18
+ };
19
+ //# sourceMappingURL=vad-web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vad-web.js","sourceRoot":"","sources":["../../../../src/ug-core/__tests__/__mocks__/vad-web.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,MAAM,OAAO,MAAM;IAKG;IAJpB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAY;QAC3B,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;IAED,YAAoB,OAAY;QAAZ,YAAO,GAAP,OAAO,CAAK;IAAG,CAAC;IAEpC,KAAK,KAAU,CAAC;IAEhB,KAAK,KAAU,CAAC;IAEhB,OAAO,KAAU,CAAC;CACnB;AAED,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,oBAAoB,EAAE,CAAC,QAAgB,EAAE,YAAoB,EAAE,UAAkB,EAAU,EAAE;QAC3F,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC,CAAA;IACnE,CAAC;CACF,CAAA"}
@@ -0,0 +1,67 @@
1
+ import { ConversationCommands } from '@/ug-core/conversation-manager/ConversationCommands';
2
+ describe('ConversationCommands', () => {
3
+ let commands;
4
+ beforeEach(() => {
5
+ commands = new ConversationCommands();
6
+ });
7
+ describe('default values', () => {
8
+ it('should have correct static default constants', () => {
9
+ expect(ConversationCommands.DEFAULT_START_COMMAND).toBe('[start conversation]');
10
+ expect(ConversationCommands.DEFAULT_PAUSE_RESUME_COMMAND).toBe('[resume after short pause]');
11
+ expect(ConversationCommands.DEFAULT_LONG_PAUSE_RESUME_COMMAND).toBe('[resume after long break]');
12
+ expect(ConversationCommands.DEFAULT_ERROR_RESUME_COMMAND).toBe('[resume after error]');
13
+ });
14
+ it('should initialize with default values', () => {
15
+ expect(commands.startCommand).toBe(ConversationCommands.DEFAULT_START_COMMAND);
16
+ expect(commands.pauseResumeCommand).toBe(ConversationCommands.DEFAULT_PAUSE_RESUME_COMMAND);
17
+ expect(commands.longPauseResumeCommand).toBe(ConversationCommands.DEFAULT_LONG_PAUSE_RESUME_COMMAND);
18
+ expect(commands.errorResumeCommand).toBe(ConversationCommands.DEFAULT_ERROR_RESUME_COMMAND);
19
+ });
20
+ });
21
+ describe('set()', () => {
22
+ it('should set all command values', () => {
23
+ commands.set('start', 'pause', 'longPause', 'error');
24
+ expect(commands.startCommand).toBe('start');
25
+ expect(commands.pauseResumeCommand).toBe('pause');
26
+ expect(commands.longPauseResumeCommand).toBe('longPause');
27
+ expect(commands.errorResumeCommand).toBe('error');
28
+ });
29
+ it('should use defaults when parameters are undefined', () => {
30
+ commands.set(undefined, undefined, undefined, undefined);
31
+ expect(commands.startCommand).toBe(ConversationCommands.DEFAULT_START_COMMAND);
32
+ expect(commands.pauseResumeCommand).toBe(ConversationCommands.DEFAULT_PAUSE_RESUME_COMMAND);
33
+ expect(commands.longPauseResumeCommand).toBe(ConversationCommands.DEFAULT_LONG_PAUSE_RESUME_COMMAND);
34
+ expect(commands.errorResumeCommand).toBe(ConversationCommands.DEFAULT_ERROR_RESUME_COMMAND);
35
+ });
36
+ it('should allow partial setting with defaults for others', () => {
37
+ commands.set('custom start', undefined, 'custom long pause', undefined);
38
+ expect(commands.startCommand).toBe('custom start');
39
+ expect(commands.pauseResumeCommand).toBe(ConversationCommands.DEFAULT_PAUSE_RESUME_COMMAND);
40
+ expect(commands.longPauseResumeCommand).toBe('custom long pause');
41
+ expect(commands.errorResumeCommand).toBe(ConversationCommands.DEFAULT_ERROR_RESUME_COMMAND);
42
+ });
43
+ it('should handle empty strings as valid values', () => {
44
+ commands.set('', '', '', '');
45
+ expect(commands.startCommand).toBe('');
46
+ expect(commands.pauseResumeCommand).toBe('');
47
+ expect(commands.longPauseResumeCommand).toBe('');
48
+ expect(commands.errorResumeCommand).toBe('');
49
+ });
50
+ });
51
+ describe('setDefault()', () => {
52
+ it('should reset all commands to defaults', () => {
53
+ commands.set('custom1', 'custom2', 'custom3', 'custom4');
54
+ commands.setDefault();
55
+ expect(commands.startCommand).toBe(ConversationCommands.DEFAULT_START_COMMAND);
56
+ expect(commands.pauseResumeCommand).toBe(ConversationCommands.DEFAULT_PAUSE_RESUME_COMMAND);
57
+ expect(commands.longPauseResumeCommand).toBe(ConversationCommands.DEFAULT_LONG_PAUSE_RESUME_COMMAND);
58
+ expect(commands.errorResumeCommand).toBe(ConversationCommands.DEFAULT_ERROR_RESUME_COMMAND);
59
+ });
60
+ it('should be idempotent when called multiple times', () => {
61
+ commands.setDefault();
62
+ commands.setDefault();
63
+ expect(commands.startCommand).toBe(ConversationCommands.DEFAULT_START_COMMAND);
64
+ });
65
+ });
66
+ });
67
+ //# sourceMappingURL=ConversationCommands.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationCommands.test.js","sourceRoot":"","sources":["../../../../src/ug-core/__tests__/conversation-manager/ConversationCommands.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,185 @@
1
+ import { ConversationManager } from '@/ug-core/conversation-manager/ConversationManager';
2
+ // Mock all dependencies using path aliases
3
+ jest.mock('@/ug-core/network/ConversationNetwork');
4
+ jest.mock('@/ug-core/user-input-manager/VADManager');
5
+ jest.mock('@/ug-core/user-input-manager/UserInputManager');
6
+ jest.mock('@/ug-core/playback-manager/PlaybackManager');
7
+ // ErrorRetryHandler is mocked via moduleNameMapper in jest.config.js
8
+ // Import mocked classes to access mock implementations
9
+ import { ConversationNetwork } from '@/ug-core/network/ConversationNetwork';
10
+ import { VADManager } from '@/ug-core/user-input-manager/VADManager';
11
+ import { UserInputManager } from '@/ug-core/user-input-manager/UserInputManager';
12
+ import { PlaybackManager } from '@/ug-core/playback-manager/PlaybackManager';
13
+ const MockedConversationNetwork = ConversationNetwork;
14
+ const MockedVADManager = VADManager;
15
+ const MockedUserInputManager = UserInputManager;
16
+ const MockedPlaybackManager = PlaybackManager;
17
+ describe('ConversationManager', () => {
18
+ let config;
19
+ beforeEach(() => {
20
+ jest.clearAllMocks();
21
+ config = {
22
+ apiUrl: 'https://test.api.com',
23
+ apiKey: 'test-api-key',
24
+ federatedId: 'test-user-123',
25
+ prompt: 'You are a helpful assistant.',
26
+ hooks: {},
27
+ };
28
+ // Setup default mock implementations
29
+ MockedConversationNetwork.prototype.initialize = jest.fn().mockResolvedValue(undefined);
30
+ MockedConversationNetwork.prototype.connect = jest.fn().mockResolvedValue(undefined);
31
+ MockedConversationNetwork.prototype.disconnect = jest.fn().mockResolvedValue(undefined);
32
+ MockedConversationNetwork.prototype.isReady = jest.fn().mockReturnValue(false);
33
+ MockedConversationNetwork.prototype.updateConfig = jest.fn();
34
+ MockedConversationNetwork.prototype.on = jest.fn();
35
+ MockedConversationNetwork.prototype.removeAllListeners = jest.fn();
36
+ MockedVADManager.prototype.on = jest.fn();
37
+ MockedVADManager.prototype.removeAllListeners = jest.fn();
38
+ MockedUserInputManager.prototype.initialize = jest.fn().mockResolvedValue(undefined);
39
+ MockedUserInputManager.prototype.start = jest.fn().mockResolvedValue(undefined);
40
+ MockedUserInputManager.prototype.stop = jest.fn().mockResolvedValue(false);
41
+ MockedUserInputManager.prototype.on = jest.fn();
42
+ MockedUserInputManager.prototype.removeAllListeners = jest.fn();
43
+ MockedPlaybackManager.prototype.initialize = jest.fn().mockResolvedValue(undefined);
44
+ MockedPlaybackManager.prototype.wireVADToAvatar = jest.fn();
45
+ MockedPlaybackManager.prototype.wireConversationStateToAvatar = jest.fn();
46
+ MockedPlaybackManager.prototype.dispose = jest.fn();
47
+ MockedPlaybackManager.prototype.on = jest.fn();
48
+ MockedPlaybackManager.prototype.removeAllListeners = jest.fn();
49
+ });
50
+ describe('constructor', () => {
51
+ it('should create instance with valid config', () => {
52
+ const manager = new ConversationManager(config);
53
+ expect(manager).toBeInstanceOf(ConversationManager);
54
+ });
55
+ it('should initialize with default capabilities when not provided', () => {
56
+ const minimalConfig = {
57
+ apiUrl: 'https://stg.uglabs.app',
58
+ apiKey: 'test-key',
59
+ federatedId: 'test-user',
60
+ hooks: {},
61
+ };
62
+ const manager = new ConversationManager(minimalConfig);
63
+ expect(manager).toBeInstanceOf(ConversationManager);
64
+ });
65
+ it('should create network, VAD manager, user input manager, and playback manager', () => {
66
+ new ConversationManager(config);
67
+ expect(MockedConversationNetwork).toHaveBeenCalledTimes(1);
68
+ expect(MockedVADManager).toHaveBeenCalledTimes(1);
69
+ expect(MockedUserInputManager).toHaveBeenCalledTimes(1);
70
+ expect(MockedPlaybackManager).toHaveBeenCalledTimes(1);
71
+ });
72
+ it('should wire playback manager to avatar', () => {
73
+ const manager = new ConversationManager(config);
74
+ expect(MockedPlaybackManager.prototype.wireVADToAvatar).toHaveBeenCalledWith(manager);
75
+ expect(MockedPlaybackManager.prototype.wireConversationStateToAvatar).toHaveBeenCalledWith(manager);
76
+ });
77
+ it('should setup event listeners on child components', () => {
78
+ new ConversationManager(config);
79
+ // Network events
80
+ expect(MockedConversationNetwork.prototype.on).toHaveBeenCalled();
81
+ // User input events
82
+ expect(MockedUserInputManager.prototype.on).toHaveBeenCalled();
83
+ // Playback events
84
+ expect(MockedPlaybackManager.prototype.on).toHaveBeenCalled();
85
+ });
86
+ });
87
+ describe('initialize()', () => {
88
+ it('should initialize all components in correct order', async () => {
89
+ const manager = new ConversationManager({
90
+ ...config,
91
+ inputCapabilities: { audio: false, text: true }, // Disable audio to skip getUserMedia
92
+ });
93
+ await manager.initialize();
94
+ // Verify initialization order
95
+ expect(MockedConversationNetwork.prototype.initialize).toHaveBeenCalledTimes(1);
96
+ expect(MockedPlaybackManager.prototype.initialize).toHaveBeenCalledTimes(1);
97
+ expect(MockedUserInputManager.prototype.initialize).toHaveBeenCalledTimes(1);
98
+ expect(MockedConversationNetwork.prototype.connect).toHaveBeenCalledTimes(1);
99
+ });
100
+ it('should call onStateChange hook during initialization', async () => {
101
+ const onStateChange = jest.fn();
102
+ const manager = new ConversationManager({
103
+ ...config,
104
+ inputCapabilities: { audio: false, text: true },
105
+ hooks: { onStateChange },
106
+ });
107
+ await manager.initialize();
108
+ // Should transition through: uninitialized -> initializing -> waiting
109
+ expect(onStateChange).toHaveBeenCalledWith('initializing');
110
+ expect(onStateChange).toHaveBeenCalledWith('waiting');
111
+ });
112
+ it('should transition to error state when initialization fails', async () => {
113
+ const onStateChange = jest.fn();
114
+ MockedConversationNetwork.prototype.initialize = jest
115
+ .fn()
116
+ .mockRejectedValue(new Error('Network error'));
117
+ const manager = new ConversationManager({
118
+ ...config,
119
+ inputCapabilities: { audio: false, text: true },
120
+ hooks: { onStateChange },
121
+ });
122
+ await manager.initialize();
123
+ // Should transition to error state when initialization fails
124
+ expect(onStateChange).toHaveBeenCalledWith('error');
125
+ });
126
+ });
127
+ describe('dispose()', () => {
128
+ it('should dispose all resources', async () => {
129
+ const manager = new ConversationManager({
130
+ ...config,
131
+ inputCapabilities: { audio: false, text: true },
132
+ });
133
+ await manager.dispose();
134
+ // Verify all cleanup calls
135
+ expect(MockedUserInputManager.prototype.removeAllListeners).toHaveBeenCalled();
136
+ expect(MockedPlaybackManager.prototype.removeAllListeners).toHaveBeenCalled();
137
+ expect(MockedConversationNetwork.prototype.removeAllListeners).toHaveBeenCalled();
138
+ expect(MockedPlaybackManager.prototype.dispose).toHaveBeenCalled();
139
+ expect(MockedConversationNetwork.prototype.disconnect).toHaveBeenCalled();
140
+ });
141
+ it('should only dispose once when called multiple times', async () => {
142
+ const manager = new ConversationManager({
143
+ ...config,
144
+ inputCapabilities: { audio: false, text: true },
145
+ });
146
+ await manager.dispose();
147
+ await manager.dispose();
148
+ // Should only be called once despite multiple dispose() calls
149
+ expect(MockedPlaybackManager.prototype.dispose).toHaveBeenCalledTimes(1);
150
+ expect(MockedConversationNetwork.prototype.disconnect).toHaveBeenCalledTimes(1);
151
+ });
152
+ it('should be safe to dispose without initializing first', async () => {
153
+ const manager = new ConversationManager({
154
+ ...config,
155
+ inputCapabilities: { audio: false, text: true },
156
+ });
157
+ // Should not throw even though we never called initialize()
158
+ await expect(manager.dispose()).resolves.toBeUndefined();
159
+ });
160
+ it('should handle errors during disposal gracefully', async () => {
161
+ MockedConversationNetwork.prototype.disconnect = jest
162
+ .fn()
163
+ .mockRejectedValue(new Error('Disconnect failed'));
164
+ const manager = new ConversationManager({
165
+ ...config,
166
+ inputCapabilities: { audio: false, text: true },
167
+ });
168
+ // Should not throw, just log warning
169
+ await expect(manager.dispose()).resolves.toBeUndefined();
170
+ });
171
+ });
172
+ describe('isConnected()', () => {
173
+ it('should return false when network is not ready', () => {
174
+ MockedConversationNetwork.prototype.isReady = jest.fn().mockReturnValue(false);
175
+ const manager = new ConversationManager(config);
176
+ expect(manager.isConnected()).toBe(false);
177
+ });
178
+ it('should return true when network is ready', () => {
179
+ MockedConversationNetwork.prototype.isReady = jest.fn().mockReturnValue(true);
180
+ const manager = new ConversationManager(config);
181
+ expect(manager.isConnected()).toBe(true);
182
+ });
183
+ });
184
+ });
185
+ //# sourceMappingURL=ConversationManager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationManager.test.js","sourceRoot":"","sources":["../../../../src/ug-core/__tests__/conversation-manager/ConversationManager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,168 @@
1
+ import { ErrorRetryHandler, } from '@/ug-core/conversation-manager/ErrorRetryHandler';
2
+ import { ConversationCommands } from '@/ug-core/conversation-manager/ConversationCommands';
3
+ describe('ErrorRetryHandler', () => {
4
+ let handler;
5
+ let mockDeps;
6
+ let mockLogger;
7
+ let mockCommands;
8
+ let mockSendText;
9
+ let mockIsConnected;
10
+ beforeEach(() => {
11
+ mockLogger = {
12
+ trace: jest.fn(),
13
+ debug: jest.fn(),
14
+ info: jest.fn(),
15
+ warn: jest.fn(),
16
+ error: jest.fn(),
17
+ };
18
+ mockCommands = new ConversationCommands();
19
+ mockSendText = jest.fn().mockResolvedValue(undefined);
20
+ mockIsConnected = jest.fn().mockReturnValue(true);
21
+ mockDeps = {
22
+ logger: mockLogger,
23
+ conversationCommands: mockCommands,
24
+ sendText: mockSendText,
25
+ clearAudio: jest.fn().mockResolvedValue(undefined),
26
+ isConnected: mockIsConnected,
27
+ maxRetryCount: 3,
28
+ };
29
+ handler = new ErrorRetryHandler(mockDeps);
30
+ });
31
+ describe('constructor', () => {
32
+ it('should use default max retry count when not provided', () => {
33
+ const depsWithoutMax = { ...mockDeps };
34
+ delete depsWithoutMax.maxRetryCount;
35
+ const handlerWithDefaults = new ErrorRetryHandler(depsWithoutMax);
36
+ expect(handlerWithDefaults.getCurrentRetryCount()).toBe(0);
37
+ });
38
+ it('should use provided max retry count', () => {
39
+ const customDeps = { ...mockDeps, maxRetryCount: 5 };
40
+ const customHandler = new ErrorRetryHandler(customDeps);
41
+ // Verify by attempting recovery up to the custom limit
42
+ expect(customHandler.getCurrentRetryCount()).toBe(0);
43
+ });
44
+ });
45
+ describe('attemptRecovery()', () => {
46
+ describe('retryable errors', () => {
47
+ it.each(['network_timeout', 'network_error', 'server_error'])('should attempt recovery for %s error', async (errorType) => {
48
+ const result = await handler.attemptRecovery(errorType);
49
+ expect(result).toBe(true);
50
+ expect(mockDeps.clearAudio).toHaveBeenCalled();
51
+ expect(mockSendText).toHaveBeenCalledWith(mockCommands.errorResumeCommand);
52
+ expect(handler.getCurrentRetryCount()).toBe(1);
53
+ });
54
+ });
55
+ describe('non-retryable errors', () => {
56
+ it.each(['mic_denied', 'decode_error'])('should not attempt recovery for %s error', async (errorType) => {
57
+ const result = await handler.attemptRecovery(errorType);
58
+ expect(result).toBe(false);
59
+ expect(mockSendText).not.toHaveBeenCalled();
60
+ expect(handler.getCurrentRetryCount()).toBe(0);
61
+ });
62
+ });
63
+ describe('network connectivity', () => {
64
+ it('should not retry when network is disconnected', async () => {
65
+ mockIsConnected.mockReturnValue(false);
66
+ const result = await handler.attemptRecovery('network_error');
67
+ expect(result).toBe(false);
68
+ expect(mockSendText).not.toHaveBeenCalled();
69
+ });
70
+ });
71
+ describe('max retry count', () => {
72
+ it('should respect max retry count', async () => {
73
+ // Exhaust retries
74
+ await handler.attemptRecovery('network_error');
75
+ await handler.attemptRecovery('network_error');
76
+ await handler.attemptRecovery('network_error');
77
+ expect(handler.getCurrentRetryCount()).toBe(3);
78
+ // Fourth attempt should fail
79
+ const result = await handler.attemptRecovery('network_error');
80
+ expect(result).toBe(false);
81
+ expect(mockSendText).toHaveBeenCalledTimes(3); // Not called on 4th attempt
82
+ });
83
+ });
84
+ describe('retry failure handling', () => {
85
+ it('should retry recursively when sendText fails', async () => {
86
+ mockSendText
87
+ .mockRejectedValueOnce(new Error('First failure'))
88
+ .mockRejectedValueOnce(new Error('Second failure'))
89
+ .mockResolvedValueOnce(undefined);
90
+ const result = await handler.attemptRecovery('network_error');
91
+ expect(result).toBe(true);
92
+ expect(mockSendText).toHaveBeenCalledTimes(3);
93
+ expect(handler.getCurrentRetryCount()).toBe(3);
94
+ });
95
+ it('should return false when all retries are exhausted', async () => {
96
+ mockSendText.mockRejectedValue(new Error('Always fails'));
97
+ const result = await handler.attemptRecovery('network_error');
98
+ expect(result).toBe(false);
99
+ expect(mockSendText).toHaveBeenCalledTimes(3);
100
+ expect(handler.getCurrentRetryCount()).toBe(3);
101
+ });
102
+ });
103
+ describe('concurrent retry prevention', () => {
104
+ it('should prevent recursive retry attempts', async () => {
105
+ // Create a promise that we can control
106
+ let resolveSendText;
107
+ mockSendText.mockImplementation(() => new Promise((resolve) => {
108
+ resolveSendText = resolve;
109
+ }));
110
+ // Start first recovery
111
+ const firstRecovery = handler.attemptRecovery('network_error');
112
+ // Try second recovery while first is in progress
113
+ const secondRecovery = handler.attemptRecovery('network_error');
114
+ const secondResult = await secondRecovery;
115
+ expect(secondResult).toBe(false);
116
+ // Complete first recovery
117
+ resolveSendText();
118
+ const firstResult = await firstRecovery;
119
+ expect(firstResult).toBe(true);
120
+ expect(mockSendText).toHaveBeenCalledTimes(1);
121
+ });
122
+ });
123
+ });
124
+ describe('resetRetryCount()', () => {
125
+ it('should reset the retry count to zero', async () => {
126
+ await handler.attemptRecovery('network_error');
127
+ await handler.attemptRecovery('network_error');
128
+ expect(handler.getCurrentRetryCount()).toBe(2);
129
+ handler.resetRetryCount();
130
+ expect(handler.getCurrentRetryCount()).toBe(0);
131
+ });
132
+ it('should allow new retries after reset', async () => {
133
+ // Exhaust retries
134
+ await handler.attemptRecovery('network_error');
135
+ await handler.attemptRecovery('network_error');
136
+ await handler.attemptRecovery('network_error');
137
+ // Reset
138
+ handler.resetRetryCount();
139
+ // Should be able to retry again
140
+ const result = await handler.attemptRecovery('network_error');
141
+ expect(result).toBe(true);
142
+ expect(handler.getCurrentRetryCount()).toBe(1);
143
+ });
144
+ });
145
+ describe('getCurrentRetryCount()', () => {
146
+ it('should return 0 initially', () => {
147
+ expect(handler.getCurrentRetryCount()).toBe(0);
148
+ });
149
+ it('should increment with each retry attempt', async () => {
150
+ await handler.attemptRecovery('network_error');
151
+ expect(handler.getCurrentRetryCount()).toBe(1);
152
+ await handler.attemptRecovery('network_error');
153
+ expect(handler.getCurrentRetryCount()).toBe(2);
154
+ });
155
+ });
156
+ describe('logging', () => {
157
+ it('should log info when attempting recovery', async () => {
158
+ await handler.attemptRecovery('network_error');
159
+ expect(mockLogger.info).toHaveBeenCalledWith(expect.stringContaining('Attempting silent recovery'));
160
+ });
161
+ it('should log info when network is not connected', async () => {
162
+ mockIsConnected.mockReturnValue(false);
163
+ await handler.attemptRecovery('network_error');
164
+ expect(mockLogger.info).toHaveBeenCalledWith(expect.stringContaining('Network is not connected'));
165
+ });
166
+ });
167
+ });
168
+ //# sourceMappingURL=ErrorRetryHandler.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorRetryHandler.test.js","sourceRoot":"","sources":["../../../../src/ug-core/__tests__/conversation-manager/ErrorRetryHandler.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};