@auto-engineer/cli 0.8.14 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -55,10 +55,10 @@
55
55
  "socket.io": "^4.7.5",
56
56
  "test": "^3.3.0",
57
57
  "yaml": "^2.6.1",
58
- "@auto-engineer/message-bus": "0.8.14",
59
- "@auto-engineer/file-store": "0.8.14",
60
- "@auto-engineer/message-store": "0.8.14",
61
- "@auto-engineer/flow": "0.8.14"
58
+ "@auto-engineer/message-bus": "0.9.1",
59
+ "@auto-engineer/file-store": "0.9.1",
60
+ "@auto-engineer/message-store": "0.9.1",
61
+ "@auto-engineer/flow": "0.9.1"
62
62
  },
63
63
  "devDependencies": {
64
64
  "@types/cors": "^2.8.0",
@@ -73,7 +73,7 @@
73
73
  "node-fetch": "^3.3.2",
74
74
  "tsx": "^4.20.3"
75
75
  },
76
- "version": "0.8.14",
76
+ "version": "0.9.1",
77
77
  "scripts": {
78
78
  "build": "tsc && tsx ../../scripts/fix-esm-imports.ts && chmod +x dist/bin/auto.js && cp -r src/server/*.html src/server/*.svg dist/src/server/ 2>/dev/null || true",
79
79
  "test": "vitest run --reporter=dot",
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=message-store.integration.specs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"message-store.integration.specs.d.ts","sourceRoot":"","sources":["../../../src/server/message-store.integration.specs.js"],"names":[],"mappings":""}
@@ -1,302 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
- import { MessageBusServer } from './server.js';
3
- import { MemoryMessageStore } from '@auto-engineer/message-store';
4
- import fetch from 'node-fetch';
5
- import getPort from 'get-port';
6
- describe('Message Store Integration', async () => {
7
- let server;
8
- let messageStore;
9
- let port;
10
- let baseUrl;
11
- beforeEach(async () => {
12
- port = await getPort();
13
- baseUrl = `http://localhost:${port}`;
14
- messageStore = new MemoryMessageStore();
15
- server = new MessageBusServer({
16
- port,
17
- messageStore,
18
- enableFileSync: false,
19
- });
20
- try {
21
- await server.start();
22
- server.registerCommandHandlers([
23
- {
24
- name: 'test-command',
25
- handle: async (command) => {
26
- return {
27
- type: 'test-event',
28
- data: {
29
- commandId: command.requestId,
30
- processedAt: new Date().toISOString(),
31
- originalData: command.data,
32
- },
33
- correlationId: command.correlationId,
34
- requestId: `evt-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`,
35
- };
36
- },
37
- },
38
- ]);
39
- }
40
- catch (error) {
41
- console.error('Failed to start server:', error);
42
- throw error;
43
- }
44
- });
45
- afterEach(async () => {
46
- try {
47
- await server?.stop();
48
- await new Promise((resolve) => setTimeout(resolve, 100));
49
- }
50
- catch (error) {
51
- console.error('Error stopping server:', error);
52
- }
53
- });
54
- it('should store commands and events in message store and serve via HTTP endpoints', async () => {
55
- const command = {
56
- type: 'test-command',
57
- data: { message: 'Hello World', userId: 'test-user' },
58
- requestId: 'test-req-123',
59
- };
60
- const commandResponse = await fetch(`${baseUrl}/command`, {
61
- method: 'POST',
62
- headers: { 'Content-Type': 'application/json' },
63
- body: JSON.stringify(command),
64
- });
65
- if (!commandResponse.ok) {
66
- const errorText = await commandResponse.text();
67
- console.error('Command response error:', errorText);
68
- throw new Error(`Command failed with status ${commandResponse.status}: ${errorText}`);
69
- }
70
- expect(commandResponse.ok).toBe(true);
71
- const commandResult = await commandResponse.json();
72
- expect(commandResult.status).toBe('ack');
73
- expect(commandResult.commandId).toBe('test-req-123');
74
- const messagesResponse = await fetch(`${baseUrl}/messages`);
75
- if (!messagesResponse.ok) {
76
- const errorText = await messagesResponse.text();
77
- console.error('Messages response error:', errorText);
78
- throw new Error(`Messages failed with status ${messagesResponse.status}: ${errorText}`);
79
- }
80
- expect(messagesResponse.ok).toBe(true);
81
- const messages = await messagesResponse.json();
82
- console.log('Received messages:', typeof messages, Array.isArray(messages), messages);
83
- expect(Array.isArray(messages)).toBe(true);
84
- expect(messages.length).toBeGreaterThanOrEqual(2);
85
- const storedCommand = messages.find((m) => m.messageType === 'command' && m.message.type === 'test-command' && m.message.requestId === 'test-req-123');
86
- expect(storedCommand).toBeDefined();
87
- expect(storedCommand.message.data.message).toBe('Hello World');
88
- expect(storedCommand.message.data.userId).toBe('test-user');
89
- expect(storedCommand.message.correlationId).toBeDefined();
90
- const storedEvent = messages.find((m) => m.messageType === 'event' && m.message.type === 'test-event');
91
- expect(storedEvent).toBeDefined();
92
- expect(storedEvent.message.data.commandId).toBe('test-req-123');
93
- expect(storedEvent.message.data.originalData.message).toBe('Hello World');
94
- expect(storedEvent.message.correlationId).toBeDefined();
95
- expect(storedEvent.message.correlationId).toBe(storedCommand.message.correlationId);
96
- const commandsResponse = await fetch(`${baseUrl}/commands`);
97
- expect(commandsResponse.ok).toBe(true);
98
- const commands = await commandsResponse.json();
99
- const commandMessages = commands.filter((m) => m.messageType === 'command');
100
- expect(commandMessages.length).toBeGreaterThan(0);
101
- expect(commands.every((m) => m.messageType === 'command')).toBe(true);
102
- const eventsResponse = await fetch(`${baseUrl}/events`);
103
- expect(eventsResponse.ok).toBe(true);
104
- const events = await eventsResponse.json();
105
- expect(Array.isArray(events)).toBe(true);
106
- expect(events.length).toBeGreaterThan(0);
107
- const filteredResponse = await fetch(`${baseUrl}/messages?messageType=command`);
108
- expect(filteredResponse.ok).toBe(true);
109
- const filteredMessages = await filteredResponse.json();
110
- expect(filteredMessages.every((m) => m.messageType === 'command')).toBe(true);
111
- const jsonFilterResponse = await fetch(`${baseUrl}/messages?jsonFilter=${encodeURIComponent('{"userId":"test-user"}')}`);
112
- expect(jsonFilterResponse.ok).toBe(true);
113
- const jsonFilteredMessages = await jsonFilterResponse.json();
114
- expect(jsonFilteredMessages.length).toBeGreaterThan(0);
115
- expect(jsonFilteredMessages.some((m) => m.message.data !== null &&
116
- m.message.data !== undefined &&
117
- 'userId' in m.message.data &&
118
- m.message.data.userId === 'test-user')).toBe(true);
119
- const sessionsResponse = await fetch(`${baseUrl}/sessions`);
120
- expect(sessionsResponse.ok).toBe(true);
121
- const sessions = await sessionsResponse.json();
122
- expect(Array.isArray(sessions)).toBe(true);
123
- expect(sessions.length).toBeGreaterThan(0);
124
- const currentSession = sessions[0];
125
- expect(currentSession.sessionId).toBeDefined();
126
- expect(currentSession.messageCount).toBeGreaterThan(0);
127
- expect(currentSession.commandCount).toBeGreaterThan(0);
128
- expect(currentSession.eventCount).toBeGreaterThan(0);
129
- const streamsResponse = await fetch(`${baseUrl}/streams`);
130
- expect(streamsResponse.ok).toBe(true);
131
- const streams = await streamsResponse.json();
132
- expect(Array.isArray(streams)).toBe(true);
133
- expect(streams).toContain('$all');
134
- expect(streams.some((stream) => stream.startsWith('session-'))).toBe(true); // session stream exists
135
- // Test the single $all stream contains both commands and events
136
- const allStreamResponse = await fetch(`${baseUrl}/streams/$all`);
137
- expect(allStreamResponse.ok).toBe(true);
138
- const allStreamMessages = await allStreamResponse.json();
139
- expect(allStreamMessages.some((m) => m.messageType === 'command')).toBe(true);
140
- expect(allStreamMessages.some((m) => m.messageType === 'event')).toBe(true);
141
- const statsResponse = await fetch(`${baseUrl}/stats`);
142
- expect(statsResponse.ok).toBe(true);
143
- const stats = await statsResponse.json();
144
- expect(stats.totalMessages).toBeGreaterThan(0);
145
- expect(stats.totalCommands).toBeGreaterThan(0);
146
- expect(stats.totalEvents).toBeGreaterThan(0);
147
- expect(stats.totalStreams).toBeGreaterThan(0);
148
- expect(stats.totalSessions).toBe(1);
149
- });
150
- it('should handle multiple commands with proper correlation ID tracking', async () => {
151
- const command1 = {
152
- type: 'test-command',
153
- data: { step: 1 },
154
- requestId: 'req-1',
155
- correlationId: 'correlation-123',
156
- };
157
- const response1 = await fetch(`${baseUrl}/command`, {
158
- method: 'POST',
159
- headers: { 'Content-Type': 'application/json' },
160
- body: JSON.stringify(command1),
161
- });
162
- if (!response1.ok) {
163
- const errorText = await response1.text();
164
- console.error('First command failed:', errorText);
165
- throw new Error(`First command failed with status ${response1.status}: ${errorText}`);
166
- }
167
- const command2 = {
168
- type: 'test-command',
169
- data: { step: 2 },
170
- requestId: 'req-2',
171
- correlationId: 'correlation-123',
172
- };
173
- await fetch(`${baseUrl}/command`, {
174
- method: 'POST',
175
- headers: { 'Content-Type': 'application/json' },
176
- body: JSON.stringify(command2),
177
- });
178
- await new Promise((resolve) => setTimeout(resolve, 100));
179
- const correlatedResponse = await fetch(`${baseUrl}/messages?correlationId=correlation-123`);
180
- expect(correlatedResponse.ok).toBe(true);
181
- const correlatedMessages = await correlatedResponse.json();
182
- expect(correlatedMessages.length).toBeGreaterThanOrEqual(4);
183
- expect(correlatedMessages.length).toBeLessThanOrEqual(16);
184
- expect(correlatedMessages.every((m) => m.message.correlationId === 'correlation-123')).toBe(true);
185
- const commands = correlatedMessages.filter((m) => m.messageType === 'command');
186
- const events = correlatedMessages.filter((m) => m.messageType === 'event');
187
- expect(commands.length).toBeGreaterThanOrEqual(2);
188
- expect(events.length).toBeGreaterThanOrEqual(2);
189
- const uniqueCommands = new Set(commands.map((cmd) => cmd.message.requestId));
190
- const uniqueEvents = new Set(events.map((evt) => evt.message.requestId));
191
- expect(uniqueCommands.size).toBe(2);
192
- expect(uniqueEvents.size).toBe(2);
193
- });
194
- it('should generate correlation IDs when not provided', async () => {
195
- const command = {
196
- type: 'test-command',
197
- data: { test: 'auto-correlation' },
198
- };
199
- await fetch(`${baseUrl}/command`, {
200
- method: 'POST',
201
- headers: { 'Content-Type': 'application/json' },
202
- body: JSON.stringify(command),
203
- });
204
- await new Promise((resolve) => setTimeout(resolve, 100));
205
- const messagesResponse = await fetch(`${baseUrl}/messages`);
206
- const messages = await messagesResponse.json();
207
- const testCommand = messages.find((m) => m.messageType === 'command' &&
208
- m.message.data !== null &&
209
- m.message.data !== undefined &&
210
- 'test' in m.message.data &&
211
- m.message.data.test === 'auto-correlation');
212
- expect(testCommand).toBeDefined();
213
- expect(testCommand.message.correlationId).toBeDefined();
214
- expect(testCommand.message.correlationId).toMatch(/^corr-/);
215
- expect(testCommand.message.requestId).toBeDefined();
216
- expect(testCommand.message.requestId).toMatch(/^req-/);
217
- });
218
- it('should process and emit commands and events in interleaved order', async () => {
219
- const commands = [
220
- {
221
- type: 'test-command',
222
- data: { commandIndex: 1 },
223
- requestId: 'cmd-1',
224
- correlationId: 'interleaved-test',
225
- },
226
- {
227
- type: 'test-command',
228
- data: { commandIndex: 2 },
229
- requestId: 'cmd-2',
230
- correlationId: 'interleaved-test',
231
- },
232
- {
233
- type: 'test-command',
234
- data: { commandIndex: 3 },
235
- requestId: 'cmd-3',
236
- correlationId: 'interleaved-test',
237
- },
238
- {
239
- type: 'test-command',
240
- data: { commandIndex: 4 },
241
- requestId: 'cmd-4',
242
- correlationId: 'interleaved-test',
243
- },
244
- {
245
- type: 'test-command',
246
- data: { commandIndex: 5 },
247
- requestId: 'cmd-5',
248
- correlationId: 'interleaved-test',
249
- },
250
- ];
251
- for (const command of commands) {
252
- const response = await fetch(`${baseUrl}/command`, {
253
- method: 'POST',
254
- headers: { 'Content-Type': 'application/json' },
255
- body: JSON.stringify(command),
256
- });
257
- if (!response.ok) {
258
- const errorText = await response.text();
259
- throw new Error(`Command failed with status ${response.status}: ${errorText}`);
260
- }
261
- }
262
- await new Promise((resolve) => setTimeout(resolve, 200));
263
- const messagesResponse = await fetch(`${baseUrl}/messages`);
264
- expect(messagesResponse.ok).toBe(true);
265
- const messages = await messagesResponse.json();
266
- // In the new architecture, all messages are in the $all stream, so we filter by streamId
267
- const sessionMessages = messages.filter((m) => m.streamId === '$all');
268
- sessionMessages.sort((a, b) => parseInt(a.position) - parseInt(b.position));
269
- const uniqueMessages = sessionMessages.filter((msg, index, arr) => {
270
- if (index === 0)
271
- return true;
272
- const prev = arr[index - 1];
273
- return !(msg.messageType === prev.messageType && msg.message.requestId === prev.message.requestId);
274
- });
275
- expect(uniqueMessages.length).toBe(10);
276
- const expectedOrder = [
277
- { type: 'command', requestId: 'cmd-1' },
278
- { type: 'event', commandId: 'cmd-1' },
279
- { type: 'command', requestId: 'cmd-2' },
280
- { type: 'event', commandId: 'cmd-2' },
281
- { type: 'command', requestId: 'cmd-3' },
282
- { type: 'event', commandId: 'cmd-3' },
283
- { type: 'command', requestId: 'cmd-4' },
284
- { type: 'event', commandId: 'cmd-4' },
285
- { type: 'command', requestId: 'cmd-5' },
286
- { type: 'event', commandId: 'cmd-5' },
287
- ];
288
- for (let i = 0; i < expectedOrder.length; i++) {
289
- const expected = expectedOrder[i];
290
- const actual = uniqueMessages[i];
291
- if (expected.type === 'command') {
292
- expect(actual.messageType).toBe('command');
293
- expect(actual.message.requestId).toBe(expected.requestId);
294
- }
295
- else {
296
- expect(actual.messageType).toBe('event');
297
- expect(actual.message.data.commandId).toBe(expected.commandId);
298
- }
299
- }
300
- });
301
- });
302
- //# sourceMappingURL=message-store.integration.specs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"message-store.integration.specs.js","sourceRoot":"","sources":["../../../src/server/message-store.integration.specs.js"],"names":[],"mappings":"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"}