factory-factory 0.1.1 → 0.1.2

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 (137) hide show
  1. package/README.md +4 -0
  2. package/dist/client/assets/_basePickBy-DlAy2gPt.js +1 -0
  3. package/dist/client/assets/_baseUniq-CPsiGaG0.js +1 -0
  4. package/dist/client/assets/{arc-DVq0HXVP.js → arc-1JZNjpJ_.js} +1 -1
  5. package/dist/client/assets/architectureDiagram-VXUJARFQ-CQPIcyoO.js +36 -0
  6. package/dist/client/assets/{blockDiagram-VD42YOAC-BS_PlNQe.js → blockDiagram-VD42YOAC-MmcBB068.js} +1 -1
  7. package/dist/client/assets/{c4Diagram-YG6GDRKO-CXhpBzRl.js → c4Diagram-YG6GDRKO-rLEwaSli.js} +1 -1
  8. package/dist/client/assets/channel-NbT5TRpd.js +1 -0
  9. package/dist/client/assets/{chunk-4BX2VUAB-DYwFxcKG.js → chunk-4BX2VUAB-BpP3xHzh.js} +1 -1
  10. package/dist/client/assets/{chunk-55IACEB6-DSe89z7c.js → chunk-55IACEB6-bhNSTzRt.js} +1 -1
  11. package/dist/client/assets/{chunk-B4BG7PRW-Q-zJEAJ2.js → chunk-B4BG7PRW-C0Ij7L-8.js} +1 -1
  12. package/dist/client/assets/{chunk-DI55MBZ5-514vDiif.js → chunk-DI55MBZ5-BlzMN1zE.js} +1 -1
  13. package/dist/client/assets/{chunk-FMBD7UC4-BRb29JdO.js → chunk-FMBD7UC4-C8tat_tr.js} +1 -1
  14. package/dist/client/assets/{chunk-QN33PNHL-BDmm1KlY.js → chunk-QN33PNHL-Dny9DeCO.js} +1 -1
  15. package/dist/client/assets/{chunk-QZHKN3VN-BPAyDs21.js → chunk-QZHKN3VN-DQ2zbmnL.js} +1 -1
  16. package/dist/client/assets/{chunk-TZMSLE5B-B7TXoVnM.js → chunk-TZMSLE5B-BjcTEJG5.js} +1 -1
  17. package/dist/client/assets/classDiagram-2ON5EDUG-DsshYhcN.js +1 -0
  18. package/dist/client/assets/classDiagram-v2-WZHVMYZB-DsshYhcN.js +1 -0
  19. package/dist/client/assets/clone-Cvh2OAuU.js +1 -0
  20. package/dist/client/assets/{cose-bilkent-S5V4N54A-BsHKMbKi.js → cose-bilkent-S5V4N54A-fICTsOTb.js} +1 -1
  21. package/dist/client/assets/dagre-6UL2VRFP-DobOTWu6.js +4 -0
  22. package/dist/client/assets/diagram-PSM6KHXK-DBWTqTcE.js +24 -0
  23. package/dist/client/assets/diagram-QEK2KX5R-qi6alECI.js +43 -0
  24. package/dist/client/assets/diagram-S2PKOQOG-D5EcU6AG.js +24 -0
  25. package/dist/client/assets/{erDiagram-Q2GNP2WA-DROr2BdA.js → erDiagram-Q2GNP2WA-Dih4JIt2.js} +1 -1
  26. package/dist/client/assets/{flowDiagram-NV44I4VS-CxElmiLh.js → flowDiagram-NV44I4VS-CuDCTnxh.js} +1 -1
  27. package/dist/client/assets/{ganttDiagram-JELNMOA3-BP5HGHDw.js → ganttDiagram-JELNMOA3-CPzDHErk.js} +4 -4
  28. package/dist/client/assets/gitGraphDiagram-NY62KEGX-Cv1AvbyZ.js +65 -0
  29. package/dist/client/assets/graph-Cc4gWRmw.js +1 -0
  30. package/dist/client/assets/{index-CfWUaA_Z.js → index-5MJv0jou.js} +128 -128
  31. package/dist/client/assets/index-YQ6vfX-S.css +1 -0
  32. package/dist/client/assets/infoDiagram-WHAUD3N6-Btdw0Tyi.js +2 -0
  33. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-B2TfCrei.js → journeyDiagram-XKPGCS4Q-DVUAsZwf.js} +1 -1
  34. package/dist/client/assets/{kanban-definition-3W4ZIXB7-De5vZhh6.js → kanban-definition-3W4ZIXB7-CpcsqtK2.js} +1 -1
  35. package/dist/client/assets/layout-yaIlj2KI.js +1 -0
  36. package/dist/client/assets/{linear-Bs4QPHDc.js → linear-BJc8M4HU.js} +1 -1
  37. package/dist/client/assets/{mindmap-definition-VGOIOE7T-zGdeQV40.js → mindmap-definition-VGOIOE7T-D6H5ND7O.js} +3 -3
  38. package/dist/client/assets/pieDiagram-ADFJNKIX-yVvC2gSi.js +30 -0
  39. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-CJkWx-q3.js → quadrantDiagram-AYHSOK5B-CgVAxGtA.js} +1 -1
  40. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-GdLIN21l.js → requirementDiagram-UZGBJVZJ-GaSyCgqs.js} +1 -1
  41. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-Djp9DXsj.js → sankeyDiagram-TZEHDZUN-DJxErFxm.js} +1 -1
  42. package/dist/client/assets/{sequenceDiagram-WL72ISMW-BUrxKS84.js → sequenceDiagram-WL72ISMW-CVYhq23p.js} +1 -1
  43. package/dist/client/assets/stateDiagram-FKZM4ZOC-BWNn_HOS.js +1 -0
  44. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BAVRa6EM.js +1 -0
  45. package/dist/client/assets/{terminal-instance-CCr56Bfx.js → terminal-instance-Zu1T5dur.js} +1 -1
  46. package/dist/client/assets/{timeline-definition-IT6M3QCI-DTfcbDd-.js → timeline-definition-IT6M3QCI-toe2Q26C.js} +1 -1
  47. package/dist/client/assets/treemap-KMMF4GRG-CrSa1h0j.js +128 -0
  48. package/dist/client/assets/{xychartDiagram-PRI3JC2R-BSraPgg_.js → xychartDiagram-PRI3JC2R-Dnal04rK.js} +1 -1
  49. package/dist/client/index.html +2 -2
  50. package/dist/client/working.png +0 -0
  51. package/dist/src/backend/claude/process.d.ts.map +1 -1
  52. package/dist/src/backend/claude/process.js +5 -5
  53. package/dist/src/backend/claude/process.js.map +1 -1
  54. package/dist/src/backend/clients/git.client.d.ts.map +1 -1
  55. package/dist/src/backend/clients/git.client.js +22 -1
  56. package/dist/src/backend/clients/git.client.js.map +1 -1
  57. package/dist/src/backend/lib/ide-helpers.d.ts.map +1 -1
  58. package/dist/src/backend/lib/ide-helpers.js +4 -4
  59. package/dist/src/backend/lib/ide-helpers.js.map +1 -1
  60. package/dist/src/backend/routers/websocket/chat.handler.d.ts +1 -1
  61. package/dist/src/backend/routers/websocket/chat.handler.d.ts.map +1 -1
  62. package/dist/src/backend/routers/websocket/chat.handler.js +23 -3
  63. package/dist/src/backend/routers/websocket/chat.handler.js.map +1 -1
  64. package/dist/src/backend/routers/websocket/terminal.handler.d.ts.map +1 -1
  65. package/dist/src/backend/routers/websocket/terminal.handler.js +20 -4
  66. package/dist/src/backend/routers/websocket/terminal.handler.js.map +1 -1
  67. package/dist/src/backend/schemas/websocket/chat-message.schema.d.ts +69 -0
  68. package/dist/src/backend/schemas/websocket/chat-message.schema.d.ts.map +1 -0
  69. package/dist/src/backend/schemas/websocket/chat-message.schema.js +54 -0
  70. package/dist/src/backend/schemas/websocket/chat-message.schema.js.map +1 -0
  71. package/dist/src/backend/schemas/websocket/index.d.ts +3 -0
  72. package/dist/src/backend/schemas/websocket/index.d.ts.map +1 -0
  73. package/dist/src/backend/schemas/websocket/index.js +3 -0
  74. package/dist/src/backend/schemas/websocket/index.js.map +1 -0
  75. package/dist/src/backend/schemas/websocket/terminal-message.schema.d.ts +25 -0
  76. package/dist/src/backend/schemas/websocket/terminal-message.schema.d.ts.map +1 -0
  77. package/dist/src/backend/schemas/websocket/terminal-message.schema.js +29 -0
  78. package/dist/src/backend/schemas/websocket/terminal-message.schema.js.map +1 -0
  79. package/dist/src/backend/server.d.ts.map +1 -1
  80. package/dist/src/backend/server.js +31 -2
  81. package/dist/src/backend/server.js.map +1 -1
  82. package/dist/src/backend/services/chat-event-forwarder.service.d.ts.map +1 -1
  83. package/dist/src/backend/services/chat-event-forwarder.service.js +25 -15
  84. package/dist/src/backend/services/chat-event-forwarder.service.js.map +1 -1
  85. package/dist/src/backend/services/chat-message-handlers.service.d.ts +10 -27
  86. package/dist/src/backend/services/chat-message-handlers.service.d.ts.map +1 -1
  87. package/dist/src/backend/services/chat-message-handlers.service.js +161 -89
  88. package/dist/src/backend/services/chat-message-handlers.service.js.map +1 -1
  89. package/dist/src/backend/services/index.d.ts +1 -0
  90. package/dist/src/backend/services/index.d.ts.map +1 -1
  91. package/dist/src/backend/services/index.js +1 -0
  92. package/dist/src/backend/services/index.js.map +1 -1
  93. package/dist/src/backend/services/message-state.service.d.ts +43 -0
  94. package/dist/src/backend/services/message-state.service.d.ts.map +1 -0
  95. package/dist/src/backend/services/message-state.service.js +377 -0
  96. package/dist/src/backend/services/message-state.service.js.map +1 -0
  97. package/dist/src/backend/services/message-state.service.test.d.ts +2 -0
  98. package/dist/src/backend/services/message-state.service.test.d.ts.map +1 -0
  99. package/dist/src/backend/services/message-state.service.test.js +517 -0
  100. package/dist/src/backend/services/message-state.service.test.js.map +1 -0
  101. package/dist/src/backend/services/rate-limiter.service.d.ts +9 -0
  102. package/dist/src/backend/services/rate-limiter.service.d.ts.map +1 -1
  103. package/dist/src/backend/services/rate-limiter.service.js +76 -7
  104. package/dist/src/backend/services/rate-limiter.service.js.map +1 -1
  105. package/dist/src/backend/trpc/user-settings.trpc.d.ts.map +1 -1
  106. package/dist/src/backend/trpc/user-settings.trpc.js +6 -6
  107. package/dist/src/backend/trpc/user-settings.trpc.js.map +1 -1
  108. package/dist/src/lib/claude-types.d.ts +70 -8
  109. package/dist/src/lib/claude-types.d.ts.map +1 -1
  110. package/dist/src/lib/claude-types.js +38 -76
  111. package/dist/src/lib/claude-types.js.map +1 -1
  112. package/dist/src/shared/pending-request-types.d.ts +2 -0
  113. package/dist/src/shared/pending-request-types.d.ts.map +1 -1
  114. package/dist/src/shared/pending-request-types.js +1 -1
  115. package/dist/src/shared/pending-request-types.js.map +1 -1
  116. package/dist/tsconfig.backend.tsbuildinfo +1 -1
  117. package/package.json +8 -2
  118. package/dist/client/assets/_baseUniq-B7YPJhsy.js +0 -1
  119. package/dist/client/assets/architectureDiagram-VXUJARFQ-BZS5cfn6.js +0 -36
  120. package/dist/client/assets/channel-CUsyQWZO.js +0 -1
  121. package/dist/client/assets/classDiagram-2ON5EDUG-Ca3-kux2.js +0 -1
  122. package/dist/client/assets/classDiagram-v2-WZHVMYZB-Ca3-kux2.js +0 -1
  123. package/dist/client/assets/clone-CkDCPGSJ.js +0 -1
  124. package/dist/client/assets/dagre-6UL2VRFP-DpFi696C.js +0 -4
  125. package/dist/client/assets/diagram-PSM6KHXK-D9hkYaHu.js +0 -24
  126. package/dist/client/assets/diagram-QEK2KX5R-3SmRS9Z5.js +0 -43
  127. package/dist/client/assets/diagram-S2PKOQOG-IjJEAYjQ.js +0 -24
  128. package/dist/client/assets/gitGraphDiagram-NY62KEGX-B-EXq7SE.js +0 -65
  129. package/dist/client/assets/graph-B1Uf9HNM.js +0 -1
  130. package/dist/client/assets/index-CxiZFewN.css +0 -1
  131. package/dist/client/assets/infoDiagram-WHAUD3N6-B91S7nEk.js +0 -2
  132. package/dist/client/assets/layout-D4YF9LlS.js +0 -1
  133. package/dist/client/assets/min-U19yp9Jh.js +0 -1
  134. package/dist/client/assets/pieDiagram-ADFJNKIX-MD-veORZ.js +0 -30
  135. package/dist/client/assets/stateDiagram-FKZM4ZOC-BmNLxd9m.js +0 -1
  136. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BHlucL45.js +0 -1
  137. package/dist/client/assets/treemap-KMMF4GRG-DlSxlzLb.js +0 -128
@@ -0,0 +1,517 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { isClaudeMessage, isUserMessage, MessageState } from '../../lib/claude-types.js';
3
+ import { messageStateService } from './message-state.service.js';
4
+ vi.mock('./chat-connection.service', () => ({
5
+ chatConnectionService: {
6
+ forwardToSession: vi.fn(),
7
+ },
8
+ }));
9
+ import { chatConnectionService } from './chat-connection.service.js';
10
+ function createTestQueuedMessage(id, text = 'Test message') {
11
+ return {
12
+ id,
13
+ text,
14
+ settings: {
15
+ selectedModel: null,
16
+ thinkingEnabled: false,
17
+ planModeEnabled: false,
18
+ },
19
+ timestamp: new Date().toISOString(),
20
+ };
21
+ }
22
+ function createTestHistoryMessage(type, content, uuid) {
23
+ return {
24
+ type,
25
+ content,
26
+ timestamp: new Date().toISOString(),
27
+ uuid,
28
+ };
29
+ }
30
+ describe('MessageStateService', () => {
31
+ beforeEach(() => {
32
+ messageStateService.clearAllSessions();
33
+ vi.clearAllMocks();
34
+ });
35
+ describe('createUserMessage', () => {
36
+ it('should create a user message in ACCEPTED state', () => {
37
+ const msg = createTestQueuedMessage('msg-1');
38
+ const result = messageStateService.createUserMessage('session-1', msg);
39
+ expect(result.id).toBe('msg-1');
40
+ expect(result.type).toBe('user');
41
+ expect(result.state).toBe(MessageState.ACCEPTED);
42
+ expect(result.text).toBe('Test message');
43
+ });
44
+ it('should assign queue position 0 for first message', () => {
45
+ const msg = createTestQueuedMessage('msg-1');
46
+ const result = messageStateService.createUserMessage('session-1', msg);
47
+ expect(result.queuePosition).toBe(0);
48
+ });
49
+ it('should increment queue position for subsequent ACCEPTED messages', () => {
50
+ const msg1 = createTestQueuedMessage('msg-1');
51
+ const msg2 = createTestQueuedMessage('msg-2');
52
+ const msg3 = createTestQueuedMessage('msg-3');
53
+ const result1 = messageStateService.createUserMessage('session-1', msg1);
54
+ const result2 = messageStateService.createUserMessage('session-1', msg2);
55
+ const result3 = messageStateService.createUserMessage('session-1', msg3);
56
+ expect(result1.queuePosition).toBe(0);
57
+ expect(result2.queuePosition).toBe(1);
58
+ expect(result3.queuePosition).toBe(2);
59
+ });
60
+ it('should not count dispatched messages in queue position', () => {
61
+ const msg1 = createTestQueuedMessage('msg-1');
62
+ const msg2 = createTestQueuedMessage('msg-2');
63
+ messageStateService.createUserMessage('session-1', msg1);
64
+ messageStateService.updateState('session-1', 'msg-1', MessageState.DISPATCHED);
65
+ const result2 = messageStateService.createUserMessage('session-1', msg2);
66
+ expect(result2.queuePosition).toBe(0);
67
+ });
68
+ it('should preserve attachments', () => {
69
+ const msg = {
70
+ id: 'msg-with-attachment',
71
+ text: 'Check this image',
72
+ attachments: [
73
+ { id: 'att-1', name: 'image.png', type: 'image/png', size: 1024, data: 'base64data' },
74
+ ],
75
+ settings: { selectedModel: 'opus', thinkingEnabled: true, planModeEnabled: false },
76
+ timestamp: new Date().toISOString(),
77
+ };
78
+ const result = messageStateService.createUserMessage('session-1', msg);
79
+ expect(result.attachments).toHaveLength(1);
80
+ expect(result.attachments?.[0].name).toBe('image.png');
81
+ });
82
+ it('should emit state change event with full message content', () => {
83
+ const msg = createTestQueuedMessage('msg-1');
84
+ messageStateService.createUserMessage('session-1', msg);
85
+ expect(chatConnectionService.forwardToSession).toHaveBeenCalledWith('session-1', {
86
+ type: 'message_state_changed',
87
+ id: 'msg-1',
88
+ newState: MessageState.ACCEPTED,
89
+ queuePosition: 0,
90
+ errorMessage: undefined,
91
+ userMessage: {
92
+ text: msg.text,
93
+ timestamp: msg.timestamp,
94
+ attachments: msg.attachments,
95
+ settings: msg.settings,
96
+ },
97
+ });
98
+ });
99
+ });
100
+ describe('updateState', () => {
101
+ it('should allow valid user message state transitions', () => {
102
+ const msg = createTestQueuedMessage('msg-1');
103
+ messageStateService.createUserMessage('session-1', msg);
104
+ const result1 = messageStateService.updateState('session-1', 'msg-1', MessageState.DISPATCHED);
105
+ expect(result1).toBe(true);
106
+ expect(messageStateService.getMessage('session-1', 'msg-1')?.state).toBe(MessageState.DISPATCHED);
107
+ const result2 = messageStateService.updateState('session-1', 'msg-1', MessageState.COMMITTED);
108
+ expect(result2).toBe(true);
109
+ expect(messageStateService.getMessage('session-1', 'msg-1')?.state).toBe(MessageState.COMMITTED);
110
+ });
111
+ it('should allow ACCEPTED -> CANCELLED transition', () => {
112
+ const msg = createTestQueuedMessage('msg-1');
113
+ messageStateService.createUserMessage('session-1', msg);
114
+ const result = messageStateService.updateState('session-1', 'msg-1', MessageState.CANCELLED);
115
+ expect(result).toBe(true);
116
+ expect(messageStateService.getMessage('session-1', 'msg-1')?.state).toBe(MessageState.CANCELLED);
117
+ });
118
+ it('should allow DISPATCHED -> FAILED transition', () => {
119
+ const msg = createTestQueuedMessage('msg-1');
120
+ messageStateService.createUserMessage('session-1', msg);
121
+ messageStateService.updateState('session-1', 'msg-1', MessageState.DISPATCHED);
122
+ const result = messageStateService.updateState('session-1', 'msg-1', MessageState.FAILED, {
123
+ errorMessage: 'Something went wrong',
124
+ });
125
+ expect(result).toBe(true);
126
+ const updatedMsg = messageStateService.getMessage('session-1', 'msg-1');
127
+ expect(updatedMsg?.state).toBe(MessageState.FAILED);
128
+ expect(updatedMsg && isUserMessage(updatedMsg) ? updatedMsg.errorMessage : undefined).toBe('Something went wrong');
129
+ });
130
+ it('should reject invalid state transitions', () => {
131
+ const msg = createTestQueuedMessage('msg-1');
132
+ messageStateService.createUserMessage('session-1', msg);
133
+ const result = messageStateService.updateState('session-1', 'msg-1', MessageState.COMMITTED);
134
+ expect(result).toBe(false);
135
+ expect(messageStateService.getMessage('session-1', 'msg-1')?.state).toBe(MessageState.ACCEPTED);
136
+ });
137
+ it('should return false for non-existent message', () => {
138
+ const result = messageStateService.updateState('session-1', 'non-existent', MessageState.DISPATCHED);
139
+ expect(result).toBe(false);
140
+ });
141
+ it('should emit state change event on success', () => {
142
+ const msg = createTestQueuedMessage('msg-1');
143
+ messageStateService.createUserMessage('session-1', msg);
144
+ vi.clearAllMocks();
145
+ messageStateService.updateState('session-1', 'msg-1', MessageState.DISPATCHED);
146
+ expect(chatConnectionService.forwardToSession).toHaveBeenCalledWith('session-1', {
147
+ type: 'message_state_changed',
148
+ id: 'msg-1',
149
+ newState: MessageState.DISPATCHED,
150
+ queuePosition: 0,
151
+ errorMessage: undefined,
152
+ });
153
+ });
154
+ });
155
+ describe('getMessage', () => {
156
+ it('should return message by ID', () => {
157
+ const msg = createTestQueuedMessage('msg-1');
158
+ messageStateService.createUserMessage('session-1', msg);
159
+ const result = messageStateService.getMessage('session-1', 'msg-1');
160
+ expect(result).toBeDefined();
161
+ expect(result?.id).toBe('msg-1');
162
+ });
163
+ it('should return undefined for non-existent message', () => {
164
+ const result = messageStateService.getMessage('session-1', 'non-existent');
165
+ expect(result).toBeUndefined();
166
+ });
167
+ it('should return undefined for non-existent session', () => {
168
+ const result = messageStateService.getMessage('non-existent-session', 'msg-1');
169
+ expect(result).toBeUndefined();
170
+ });
171
+ });
172
+ describe('getAllMessages', () => {
173
+ it('should return empty array for non-existent session', () => {
174
+ const result = messageStateService.getAllMessages('non-existent');
175
+ expect(result).toEqual([]);
176
+ });
177
+ it('should return messages sorted by timestamp', () => {
178
+ const now = Date.now();
179
+ const msg1 = {
180
+ ...createTestQueuedMessage('msg-1'),
181
+ timestamp: new Date(now - 2000).toISOString(),
182
+ };
183
+ const msg2 = {
184
+ ...createTestQueuedMessage('msg-2'),
185
+ timestamp: new Date(now - 1000).toISOString(),
186
+ };
187
+ const msg3 = {
188
+ ...createTestQueuedMessage('msg-3'),
189
+ timestamp: new Date(now).toISOString(),
190
+ };
191
+ messageStateService.createUserMessage('session-1', msg2);
192
+ messageStateService.createUserMessage('session-1', msg3);
193
+ messageStateService.createUserMessage('session-1', msg1);
194
+ const result = messageStateService.getAllMessages('session-1');
195
+ expect(result).toHaveLength(3);
196
+ expect(result[0].id).toBe('msg-1');
197
+ expect(result[1].id).toBe('msg-2');
198
+ expect(result[2].id).toBe('msg-3');
199
+ });
200
+ });
201
+ describe('removeMessage', () => {
202
+ it('should remove message and return true', () => {
203
+ const msg = createTestQueuedMessage('msg-1');
204
+ messageStateService.createUserMessage('session-1', msg);
205
+ const result = messageStateService.removeMessage('session-1', 'msg-1');
206
+ expect(result).toBe(true);
207
+ expect(messageStateService.getMessage('session-1', 'msg-1')).toBeUndefined();
208
+ });
209
+ it('should return false for non-existent message', () => {
210
+ const result = messageStateService.removeMessage('session-1', 'non-existent');
211
+ expect(result).toBe(false);
212
+ });
213
+ it('should return false for non-existent session', () => {
214
+ const result = messageStateService.removeMessage('non-existent', 'msg-1');
215
+ expect(result).toBe(false);
216
+ });
217
+ });
218
+ describe('clearSession', () => {
219
+ it('should remove all messages for a session', () => {
220
+ messageStateService.createUserMessage('session-1', createTestQueuedMessage('msg-1'));
221
+ messageStateService.createUserMessage('session-1', createTestQueuedMessage('msg-2'));
222
+ messageStateService.createUserMessage('session-1', createTestQueuedMessage('msg-3'));
223
+ messageStateService.clearSession('session-1');
224
+ expect(messageStateService.getMessageCount('session-1')).toBe(0);
225
+ expect(messageStateService.getAllMessages('session-1')).toEqual([]);
226
+ });
227
+ it('should not affect other sessions', () => {
228
+ messageStateService.createUserMessage('session-1', createTestQueuedMessage('msg-1'));
229
+ messageStateService.createUserMessage('session-2', createTestQueuedMessage('msg-2'));
230
+ messageStateService.clearSession('session-1');
231
+ expect(messageStateService.getMessageCount('session-1')).toBe(0);
232
+ expect(messageStateService.getMessageCount('session-2')).toBe(1);
233
+ });
234
+ it('should handle clearing non-existent session gracefully', () => {
235
+ expect(() => messageStateService.clearSession('non-existent')).not.toThrow();
236
+ });
237
+ });
238
+ describe('loadFromHistory', () => {
239
+ it('should load user messages from history as COMMITTED', () => {
240
+ const history = [createTestHistoryMessage('user', 'Hello', 'uuid-1')];
241
+ messageStateService.loadFromHistory('session-1', history);
242
+ const messages = messageStateService.getAllMessages('session-1');
243
+ expect(messages).toHaveLength(1);
244
+ expect(messages[0].type).toBe('user');
245
+ expect(messages[0].state).toBe(MessageState.COMMITTED);
246
+ expect(isUserMessage(messages[0]) ? messages[0].text : undefined).toBe('Hello');
247
+ });
248
+ it('should load assistant messages from history as COMPLETE', () => {
249
+ const history = [
250
+ createTestHistoryMessage('assistant', 'Hi there!', 'uuid-1'),
251
+ ];
252
+ messageStateService.loadFromHistory('session-1', history);
253
+ const messages = messageStateService.getAllMessages('session-1');
254
+ expect(messages).toHaveLength(1);
255
+ expect(messages[0].type).toBe('claude');
256
+ expect(messages[0].state).toBe(MessageState.COMPLETE);
257
+ });
258
+ it('should handle tool_use messages', () => {
259
+ const history = [
260
+ {
261
+ type: 'tool_use',
262
+ content: '{}',
263
+ timestamp: new Date().toISOString(),
264
+ uuid: 'uuid-1',
265
+ toolName: 'Read',
266
+ toolId: 'tool-123',
267
+ toolInput: { file_path: '/test.txt' },
268
+ },
269
+ ];
270
+ messageStateService.loadFromHistory('session-1', history);
271
+ const messages = messageStateService.getAllMessages('session-1');
272
+ expect(messages).toHaveLength(1);
273
+ expect(messages[0].type).toBe('claude');
274
+ const claudeMsg = messages[0];
275
+ if (isClaudeMessage(claudeMsg)) {
276
+ expect(claudeMsg.chatMessages).toHaveLength(1);
277
+ const innerMessage = claudeMsg.chatMessages[0].message?.message;
278
+ expect(innerMessage?.content).toEqual([
279
+ { type: 'tool_use', id: 'tool-123', name: 'Read', input: { file_path: '/test.txt' } },
280
+ ]);
281
+ }
282
+ else {
283
+ expect.fail('Expected Claude message');
284
+ }
285
+ });
286
+ it('should handle tool_result messages', () => {
287
+ const history = [
288
+ {
289
+ type: 'tool_result',
290
+ content: 'File contents here',
291
+ timestamp: new Date().toISOString(),
292
+ uuid: 'uuid-1',
293
+ toolId: 'tool-123',
294
+ isError: false,
295
+ },
296
+ ];
297
+ messageStateService.loadFromHistory('session-1', history);
298
+ const messages = messageStateService.getAllMessages('session-1');
299
+ expect(messages).toHaveLength(1);
300
+ expect(messages[0].type).toBe('claude');
301
+ const claudeMsg = messages[0];
302
+ if (isClaudeMessage(claudeMsg)) {
303
+ expect(claudeMsg.chatMessages).toHaveLength(1);
304
+ const innerMessage = claudeMsg.chatMessages[0].message?.message;
305
+ expect(innerMessage?.content).toEqual([
306
+ {
307
+ type: 'tool_result',
308
+ tool_use_id: 'tool-123',
309
+ content: 'File contents here',
310
+ is_error: false,
311
+ },
312
+ ]);
313
+ }
314
+ else {
315
+ expect.fail('Expected Claude message');
316
+ }
317
+ });
318
+ it('should handle thinking messages', () => {
319
+ const history = [
320
+ createTestHistoryMessage('thinking', 'Let me think about this...', 'uuid-1'),
321
+ ];
322
+ messageStateService.loadFromHistory('session-1', history);
323
+ const messages = messageStateService.getAllMessages('session-1');
324
+ expect(messages).toHaveLength(1);
325
+ expect(messages[0].type).toBe('claude');
326
+ const claudeMsg = messages[0];
327
+ if (isClaudeMessage(claudeMsg)) {
328
+ expect(claudeMsg.chatMessages).toHaveLength(1);
329
+ const innerMessage = claudeMsg.chatMessages[0].message?.message;
330
+ expect(innerMessage?.content).toEqual([
331
+ { type: 'thinking', thinking: 'Let me think about this...' },
332
+ ]);
333
+ }
334
+ else {
335
+ expect.fail('Expected Claude message');
336
+ }
337
+ });
338
+ it('should skip loading if session already has messages (race condition protection)', () => {
339
+ messageStateService.createUserMessage('session-1', createTestQueuedMessage('msg-1', 'Existing message'));
340
+ const history = [
341
+ createTestHistoryMessage('user', 'From history', 'uuid-1'),
342
+ ];
343
+ messageStateService.loadFromHistory('session-1', history);
344
+ const messages = messageStateService.getAllMessages('session-1');
345
+ expect(messages).toHaveLength(1);
346
+ expect(isUserMessage(messages[0]) ? messages[0].text : undefined).toBe('Existing message');
347
+ });
348
+ it('should load history when session is empty', () => {
349
+ const history = [
350
+ createTestHistoryMessage('user', 'From history', 'uuid-1'),
351
+ ];
352
+ messageStateService.loadFromHistory('session-1', history);
353
+ const messages = messageStateService.getAllMessages('session-1');
354
+ expect(messages).toHaveLength(1);
355
+ expect(isUserMessage(messages[0]) ? messages[0].text : undefined).toBe('From history');
356
+ });
357
+ it('should not emit state change events (for cold load)', () => {
358
+ vi.clearAllMocks();
359
+ const history = [
360
+ createTestHistoryMessage('user', 'Hello', 'uuid-1'),
361
+ createTestHistoryMessage('assistant', 'Hi!', 'uuid-2'),
362
+ ];
363
+ messageStateService.loadFromHistory('session-1', history);
364
+ expect(chatConnectionService.forwardToSession).not.toHaveBeenCalled();
365
+ });
366
+ it('should generate IDs for messages without UUIDs', () => {
367
+ const history = [
368
+ { type: 'user', content: 'No UUID', timestamp: new Date().toISOString() },
369
+ ];
370
+ messageStateService.loadFromHistory('session-1', history);
371
+ const messages = messageStateService.getAllMessages('session-1');
372
+ expect(messages).toHaveLength(1);
373
+ expect(messages[0].id).toMatch(/^history-/);
374
+ });
375
+ it('should handle concurrent loadFromHistory calls safely', async () => {
376
+ const history = [
377
+ createTestHistoryMessage('user', 'From history', 'uuid-1'),
378
+ ];
379
+ const promises = Array.from({ length: 10 }, () => Promise.resolve().then(() => messageStateService.loadFromHistory('session-1', history)));
380
+ await Promise.all(promises);
381
+ const messages = messageStateService.getAllMessages('session-1');
382
+ expect(messages).toHaveLength(1);
383
+ expect(isUserMessage(messages[0]) ? messages[0].text : undefined).toBe('From history');
384
+ });
385
+ });
386
+ describe('hasMessage', () => {
387
+ it('should return true for existing message', () => {
388
+ const msg = createTestQueuedMessage('msg-1');
389
+ messageStateService.createUserMessage('session-1', msg);
390
+ expect(messageStateService.hasMessage('session-1', 'msg-1')).toBe(true);
391
+ });
392
+ it('should return false for non-existent message', () => {
393
+ expect(messageStateService.hasMessage('session-1', 'non-existent')).toBe(false);
394
+ });
395
+ it('should return false for non-existent session', () => {
396
+ expect(messageStateService.hasMessage('non-existent', 'msg-1')).toBe(false);
397
+ });
398
+ });
399
+ describe('getMessageCount', () => {
400
+ it('should return 0 for non-existent session', () => {
401
+ expect(messageStateService.getMessageCount('non-existent')).toBe(0);
402
+ });
403
+ it('should return correct count', () => {
404
+ expect(messageStateService.getMessageCount('session-1')).toBe(0);
405
+ messageStateService.createUserMessage('session-1', createTestQueuedMessage('msg-1'));
406
+ expect(messageStateService.getMessageCount('session-1')).toBe(1);
407
+ messageStateService.createUserMessage('session-1', createTestQueuedMessage('msg-2'));
408
+ expect(messageStateService.getMessageCount('session-1')).toBe(2);
409
+ messageStateService.removeMessage('session-1', 'msg-1');
410
+ expect(messageStateService.getMessageCount('session-1')).toBe(1);
411
+ });
412
+ });
413
+ describe('sendSnapshot', () => {
414
+ it('should send messages_snapshot event', () => {
415
+ messageStateService.createUserMessage('session-1', createTestQueuedMessage('msg-1'));
416
+ vi.clearAllMocks();
417
+ messageStateService.sendSnapshot('session-1', { phase: 'ready' });
418
+ expect(chatConnectionService.forwardToSession).toHaveBeenCalledWith('session-1', {
419
+ type: 'messages_snapshot',
420
+ messages: expect.any(Array),
421
+ sessionStatus: { phase: 'ready' },
422
+ pendingInteractiveRequest: undefined,
423
+ });
424
+ });
425
+ it('should include pending interactive request if provided', () => {
426
+ const pendingRequest = {
427
+ requestId: 'req-1',
428
+ toolName: 'AskUserQuestion',
429
+ input: { questions: [] },
430
+ timestamp: new Date().toISOString(),
431
+ };
432
+ messageStateService.sendSnapshot('session-1', { phase: 'running' }, pendingRequest);
433
+ expect(chatConnectionService.forwardToSession).toHaveBeenCalledWith('session-1', {
434
+ type: 'messages_snapshot',
435
+ messages: expect.any(Array),
436
+ sessionStatus: { phase: 'running' },
437
+ pendingInteractiveRequest: pendingRequest,
438
+ });
439
+ });
440
+ it('should return sorted messages in snapshot', () => {
441
+ const now = Date.now();
442
+ const msg1 = {
443
+ ...createTestQueuedMessage('msg-1'),
444
+ timestamp: new Date(now - 1000).toISOString(),
445
+ };
446
+ const msg2 = {
447
+ ...createTestQueuedMessage('msg-2'),
448
+ timestamp: new Date(now).toISOString(),
449
+ };
450
+ messageStateService.createUserMessage('session-1', msg2);
451
+ messageStateService.createUserMessage('session-1', msg1);
452
+ vi.clearAllMocks();
453
+ messageStateService.sendSnapshot('session-1', { phase: 'ready' });
454
+ const call = vi.mocked(chatConnectionService.forwardToSession).mock.calls[0];
455
+ const payload = call[1];
456
+ expect(payload.messages[0].id).toBe('msg-1');
457
+ expect(payload.messages[1].id).toBe('msg-2');
458
+ });
459
+ it('should include planContent in pendingInteractiveRequest', () => {
460
+ const pendingRequest = {
461
+ requestId: 'req-plan-123',
462
+ toolName: 'EnterPlanMode',
463
+ input: { someKey: 'someValue' },
464
+ planContent: '# My Plan\n\nStep 1: Do something',
465
+ timestamp: new Date().toISOString(),
466
+ };
467
+ messageStateService.sendSnapshot('session-1', { phase: 'running' }, pendingRequest);
468
+ expect(chatConnectionService.forwardToSession).toHaveBeenCalledWith('session-1', {
469
+ type: 'messages_snapshot',
470
+ messages: [],
471
+ sessionStatus: { phase: 'running' },
472
+ pendingInteractiveRequest: pendingRequest,
473
+ });
474
+ });
475
+ });
476
+ describe('computeSessionStatus', () => {
477
+ it('should return running when client is running', () => {
478
+ const status = messageStateService.computeSessionStatus('session-1', true);
479
+ expect(status).toEqual({ phase: 'running' });
480
+ });
481
+ it('should return ready when client is not running and no queued messages', () => {
482
+ const status = messageStateService.computeSessionStatus('session-1', false);
483
+ expect(status).toEqual({ phase: 'ready' });
484
+ });
485
+ it('should return starting when client is not running but has queued messages', () => {
486
+ messageStateService.createUserMessage('session-1', createTestQueuedMessage('msg-1'));
487
+ const status = messageStateService.computeSessionStatus('session-1', false);
488
+ expect(status).toEqual({ phase: 'starting' });
489
+ });
490
+ it('should return ready when queued message is dispatched', () => {
491
+ messageStateService.createUserMessage('session-1', createTestQueuedMessage('msg-1'));
492
+ messageStateService.updateState('session-1', 'msg-1', MessageState.DISPATCHED);
493
+ const status = messageStateService.computeSessionStatus('session-1', false);
494
+ expect(status).toEqual({ phase: 'ready' });
495
+ });
496
+ });
497
+ describe('session isolation', () => {
498
+ it('should maintain separate message stores for different sessions', () => {
499
+ messageStateService.createUserMessage('session-1', createTestQueuedMessage('s1-msg-1'));
500
+ messageStateService.createUserMessage('session-2', createTestQueuedMessage('s2-msg-1'));
501
+ messageStateService.createUserMessage('session-2', createTestQueuedMessage('s2-msg-2'));
502
+ expect(messageStateService.getMessageCount('session-1')).toBe(1);
503
+ expect(messageStateService.getMessageCount('session-2')).toBe(2);
504
+ expect(messageStateService.hasMessage('session-1', 's1-msg-1')).toBe(true);
505
+ expect(messageStateService.hasMessage('session-1', 's2-msg-1')).toBe(false);
506
+ expect(messageStateService.hasMessage('session-2', 's2-msg-1')).toBe(true);
507
+ });
508
+ it('should not affect other sessions when updating state', () => {
509
+ messageStateService.createUserMessage('session-1', createTestQueuedMessage('msg-1'));
510
+ messageStateService.createUserMessage('session-2', createTestQueuedMessage('msg-1'));
511
+ messageStateService.updateState('session-1', 'msg-1', MessageState.DISPATCHED);
512
+ expect(messageStateService.getMessage('session-1', 'msg-1')?.state).toBe(MessageState.DISPATCHED);
513
+ expect(messageStateService.getMessage('session-2', 'msg-1')?.state).toBe(MessageState.ACCEPTED);
514
+ });
515
+ });
516
+ });
517
+ //# sourceMappingURL=message-state.service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-state.service.test.js","sourceRoot":"","sources":["../../../../src/backend/services/message-state.service.test.ts"],"names":[],"mappings":"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"}
@@ -19,7 +19,15 @@ declare class RateLimiter {
19
19
  private isProcessingQueue;
20
20
  private usageByAgent;
21
21
  private usageByTopLevelTask;
22
+ private cleanupInterval;
23
+ private isShuttingDown;
24
+ private pendingTimeouts;
25
+ private queueProcessingTimeout;
26
+ private queueProcessingResolve;
27
+ private queueProcessingPromise;
28
+ private requestIdCounter;
22
29
  constructor(config?: Partial<RateLimiterConfig>);
30
+ start(): void;
23
31
  private cleanupOldTimestamps;
24
32
  private getRequestsInWindow;
25
33
  isRateLimited(): boolean;
@@ -30,6 +38,7 @@ declare class RateLimiter {
30
38
  getUsageByAgent(): Map<string, number>;
31
39
  getUsageByTopLevelTask(): Map<string, number>;
32
40
  resetUsageStats(): void;
41
+ stop(): Promise<void>;
33
42
  getConfig(): RateLimiterConfig;
34
43
  updateConfig(config: Partial<RateLimiterConfig>): void;
35
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limiter.service.d.ts","sourceRoot":"","sources":["../../../../src/backend/services/rate-limiter.service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAQzE,aAAK,eAAe;IAClB,IAAI,IAAI;IACR,MAAM,IAAI;IACV,GAAG,IAAI;CACR;AAgBD,MAAM,WAAW,aAAa;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;CACxB;AAYD,cAAM,WAAW;IACf,OAAO,CAAC,MAAM,CAAoB;IAGlC,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,aAAa,CAAK;IAG1B,OAAO,CAAC,YAAY,CAAuB;IAG3C,OAAO,CAAC,iBAAiB,CAAS;IAGlC,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,mBAAmB,CAAkC;gBAEjD,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC;IAa/C,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,mBAAmB;IAQ3B,aAAa,IAAI,OAAO;IAcxB,WAAW,CACT,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GAAG,IAAI,EAC7B,QAAQ,GAAE,eAAwC,GACjD,OAAO,CAAC,IAAI,CAAC;IAuDhB,OAAO,CAAC,aAAa;YAoBP,YAAY;IA0B1B,gBAAgB,IAAI,aAAa;IAajC,eAAe,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAOtC,sBAAsB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAO7C,eAAe,IAAI,IAAI;IASvB,SAAS,IAAI,iBAAiB;IAO9B,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI;CAOvD;AAGD,eAAO,MAAM,WAAW,aAAoB,CAAC"}
1
+ {"version":3,"file":"rate-limiter.service.d.ts","sourceRoot":"","sources":["../../../../src/backend/services/rate-limiter.service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAQzE,aAAK,eAAe;IAClB,IAAI,IAAI;IACR,MAAM,IAAI;IACV,GAAG,IAAI;CACR;AAgBD,MAAM,WAAW,aAAa;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;CACxB;AAYD,cAAM,WAAW;IACf,OAAO,CAAC,MAAM,CAAoB;IAGlC,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,aAAa,CAAK;IAG1B,OAAO,CAAC,YAAY,CAAuB;IAG3C,OAAO,CAAC,iBAAiB,CAAS;IAGlC,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,mBAAmB,CAAkC;IAG7D,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,sBAAsB,CAA+B;IAC7D,OAAO,CAAC,sBAAsB,CAA6B;IAC3D,OAAO,CAAC,sBAAsB,CAA8B;IAG5D,OAAO,CAAC,gBAAgB,CAAK;gBAEjB,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC;IAU/C,KAAK,IAAI,IAAI;IAiBb,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,mBAAmB;IAQ3B,aAAa,IAAI,OAAO;IAcxB,WAAW,CACT,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GAAG,IAAI,EAC7B,QAAQ,GAAE,eAAwC,GACjD,OAAO,CAAC,IAAI,CAAC;IAoEhB,OAAO,CAAC,aAAa;YAoBP,YAAY;IAqC1B,gBAAgB,IAAI,aAAa;IAajC,eAAe,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAOtC,sBAAsB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAO7C,eAAe,IAAI,IAAI;IASjB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA0C3B,SAAS,IAAI,iBAAiB;IAO9B,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI;CAOvD;AAGD,eAAO,MAAM,WAAW,aAAoB,CAAC"}