@auto-engineer/cli 0.19.1 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/CHANGELOG.md +24 -4
  2. package/dist/src/__fixtures__/auto.config.d.ts +7 -0
  3. package/dist/src/__fixtures__/auto.config.d.ts.map +1 -0
  4. package/dist/src/__fixtures__/auto.config.js +7 -0
  5. package/dist/src/__fixtures__/auto.config.js.map +1 -0
  6. package/dist/src/dsl/index.d.ts +71 -0
  7. package/dist/src/dsl/index.d.ts.map +1 -0
  8. package/dist/src/dsl/index.js +504 -0
  9. package/dist/src/dsl/index.js.map +1 -0
  10. package/dist/src/dsl/types.d.ts +39 -0
  11. package/dist/src/dsl/types.d.ts.map +1 -0
  12. package/dist/src/dsl/types.js +2 -0
  13. package/dist/src/dsl/types.js.map +1 -0
  14. package/dist/src/dsl-exports.d.ts +5 -0
  15. package/dist/src/dsl-exports.d.ts.map +1 -0
  16. package/dist/src/dsl-exports.js +4 -0
  17. package/dist/src/dsl-exports.js.map +1 -0
  18. package/dist/src/index.js +16 -201
  19. package/dist/src/index.js.map +1 -1
  20. package/dist/src/plugin-loader.d.ts +84 -0
  21. package/dist/src/plugin-loader.d.ts.map +1 -0
  22. package/dist/src/plugin-loader.js +788 -0
  23. package/dist/src/plugin-loader.js.map +1 -0
  24. package/dist/src/server/command-metadata-service.d.ts +27 -0
  25. package/dist/src/server/command-metadata-service.d.ts.map +1 -0
  26. package/dist/src/server/command-metadata-service.js +69 -0
  27. package/dist/src/server/command-metadata-service.js.map +1 -0
  28. package/dist/src/server/command-registry.d.ts +21 -0
  29. package/dist/src/server/command-registry.d.ts.map +1 -0
  30. package/dist/src/server/command-registry.js +58 -0
  31. package/dist/src/server/command-registry.js.map +1 -0
  32. package/dist/src/server/config-loader.d.ts +16 -0
  33. package/dist/src/server/config-loader.d.ts.map +1 -0
  34. package/dist/src/server/config-loader.js +106 -0
  35. package/dist/src/server/config-loader.js.map +1 -0
  36. package/dist/src/server/event-processor.d.ts +45 -0
  37. package/dist/src/server/event-processor.d.ts.map +1 -0
  38. package/dist/src/server/event-processor.js +287 -0
  39. package/dist/src/server/event-processor.js.map +1 -0
  40. package/dist/src/server/file-syncer/crypto/jwe-encryptor.d.ts +15 -0
  41. package/dist/src/server/file-syncer/crypto/jwe-encryptor.d.ts.map +1 -0
  42. package/dist/src/server/file-syncer/crypto/jwe-encryptor.js +72 -0
  43. package/dist/src/server/file-syncer/crypto/jwe-encryptor.js.map +1 -0
  44. package/dist/src/server/file-syncer/crypto/provider-resolver.d.ts +24 -0
  45. package/dist/src/server/file-syncer/crypto/provider-resolver.d.ts.map +1 -0
  46. package/dist/src/server/file-syncer/crypto/provider-resolver.js +71 -0
  47. package/dist/src/server/file-syncer/crypto/provider-resolver.js.map +1 -0
  48. package/dist/src/server/file-syncer/discovery/bareImports.d.ts +3 -0
  49. package/dist/src/server/file-syncer/discovery/bareImports.d.ts.map +1 -0
  50. package/dist/src/server/file-syncer/discovery/bareImports.js +36 -0
  51. package/dist/src/server/file-syncer/discovery/bareImports.js.map +1 -0
  52. package/dist/src/server/file-syncer/discovery/dts.d.ts +11 -0
  53. package/dist/src/server/file-syncer/discovery/dts.d.ts.map +1 -0
  54. package/dist/src/server/file-syncer/discovery/dts.js +108 -0
  55. package/dist/src/server/file-syncer/discovery/dts.js.map +1 -0
  56. package/dist/src/server/file-syncer/index.d.ts +22 -0
  57. package/dist/src/server/file-syncer/index.d.ts.map +1 -0
  58. package/dist/src/server/file-syncer/index.js +378 -0
  59. package/dist/src/server/file-syncer/index.js.map +1 -0
  60. package/dist/src/server/file-syncer/sync/resolveSyncFileSet.d.ts +7 -0
  61. package/dist/src/server/file-syncer/sync/resolveSyncFileSet.d.ts.map +1 -0
  62. package/dist/src/server/file-syncer/sync/resolveSyncFileSet.js +103 -0
  63. package/dist/src/server/file-syncer/sync/resolveSyncFileSet.js.map +1 -0
  64. package/dist/src/server/file-syncer/types/wire.d.ts +14 -0
  65. package/dist/src/server/file-syncer/types/wire.d.ts.map +1 -0
  66. package/dist/src/server/file-syncer/types/wire.js +2 -0
  67. package/dist/src/server/file-syncer/types/wire.js.map +1 -0
  68. package/dist/src/server/file-syncer/utils/hash.d.ts +5 -0
  69. package/dist/src/server/file-syncer/utils/hash.d.ts.map +1 -0
  70. package/dist/src/server/file-syncer/utils/hash.js +20 -0
  71. package/dist/src/server/file-syncer/utils/hash.js.map +1 -0
  72. package/dist/src/server/file-syncer/utils/path.d.ts +15 -0
  73. package/dist/src/server/file-syncer/utils/path.d.ts.map +1 -0
  74. package/dist/src/server/file-syncer/utils/path.js +109 -0
  75. package/dist/src/server/file-syncer/utils/path.js.map +1 -0
  76. package/dist/src/server/http-routes.d.ts +30 -0
  77. package/dist/src/server/http-routes.d.ts.map +1 -0
  78. package/dist/src/server/http-routes.js +394 -0
  79. package/dist/src/server/http-routes.js.map +1 -0
  80. package/dist/src/server/sandbox-landing-page.html +367 -0
  81. package/dist/src/server/server.d.ts +106 -0
  82. package/dist/src/server/server.d.ts.map +1 -0
  83. package/dist/src/server/server.js +255 -0
  84. package/dist/src/server/server.js.map +1 -0
  85. package/dist/src/server/services/child-process-manager.d.ts +27 -0
  86. package/dist/src/server/services/child-process-manager.d.ts.map +1 -0
  87. package/dist/src/server/services/child-process-manager.js +126 -0
  88. package/dist/src/server/services/child-process-manager.js.map +1 -0
  89. package/dist/src/server/services/index.d.ts +3 -0
  90. package/dist/src/server/services/index.d.ts.map +1 -0
  91. package/dist/src/server/services/index.js +2 -0
  92. package/dist/src/server/services/index.js.map +1 -0
  93. package/dist/src/server/services/interface.d.ts +6 -0
  94. package/dist/src/server/services/interface.d.ts.map +1 -0
  95. package/dist/src/server/services/interface.js +2 -0
  96. package/dist/src/server/services/interface.js.map +1 -0
  97. package/dist/src/server/settled-tracker.d.ts +29 -0
  98. package/dist/src/server/settled-tracker.d.ts.map +1 -0
  99. package/dist/src/server/settled-tracker.js +203 -0
  100. package/dist/src/server/settled-tracker.js.map +1 -0
  101. package/dist/src/server/state-manager.d.ts +24 -0
  102. package/dist/src/server/state-manager.d.ts.map +1 -0
  103. package/dist/src/server/state-manager.js +56 -0
  104. package/dist/src/server/state-manager.js.map +1 -0
  105. package/dist/src/server/websocket-handler.d.ts +5 -0
  106. package/dist/src/server/websocket-handler.d.ts.map +1 -0
  107. package/dist/src/server/websocket-handler.js +40 -0
  108. package/dist/src/server/websocket-handler.js.map +1 -0
  109. package/dist/src/server.d.ts +20 -0
  110. package/dist/src/server.d.ts.map +1 -0
  111. package/dist/src/server.js +204 -0
  112. package/dist/src/server.js.map +1 -0
  113. package/dist/src/utils/analytics.d.ts +21 -0
  114. package/dist/src/utils/analytics.d.ts.map +1 -0
  115. package/dist/src/utils/analytics.js +41 -0
  116. package/dist/src/utils/analytics.js.map +1 -0
  117. package/dist/src/utils/config.d.ts +11 -0
  118. package/dist/src/utils/config.d.ts.map +1 -0
  119. package/dist/src/utils/config.js +50 -0
  120. package/dist/src/utils/config.js.map +1 -0
  121. package/dist/src/utils/correlation-id.d.ts +3 -0
  122. package/dist/src/utils/correlation-id.d.ts.map +1 -0
  123. package/dist/src/utils/correlation-id.js +7 -0
  124. package/dist/src/utils/correlation-id.js.map +1 -0
  125. package/dist/src/utils/errors.d.ts +22 -0
  126. package/dist/src/utils/errors.d.ts.map +1 -0
  127. package/dist/src/utils/errors.js +50 -0
  128. package/dist/src/utils/errors.js.map +1 -0
  129. package/dist/src/utils/get-package-version.d.ts +7 -0
  130. package/dist/src/utils/get-package-version.d.ts.map +1 -0
  131. package/dist/src/utils/get-package-version.js +31 -0
  132. package/dist/src/utils/get-package-version.js.map +1 -0
  133. package/dist/src/utils/terminal.d.ts +13 -0
  134. package/dist/src/utils/terminal.d.ts.map +1 -0
  135. package/dist/src/utils/terminal.js +85 -0
  136. package/dist/src/utils/terminal.js.map +1 -0
  137. package/dist/tsconfig.tsbuildinfo +1 -1
  138. package/package.json +14 -4
@@ -0,0 +1,203 @@
1
+ import { getPendingDispatches } from '../dsl/index.js';
2
+ import { buildEventToCommandMapping } from '../dsl/index.js';
3
+ import createDebug from 'debug';
4
+ const debug = createDebug('auto-engineer:server:settled-tracker');
5
+ export class SettledTracker {
6
+ constructor(onDispatchAction, metadataService) {
7
+ this.handlerTemplates = new Map();
8
+ this.handlerInstances = new Map();
9
+ this.commandToHandlerIds = new Map();
10
+ this.runningCommands = new Map();
11
+ this.eventToCommandMapping = {};
12
+ this.onDispatchAction = onDispatchAction;
13
+ this.metadataService = metadataService;
14
+ this.eventToCommandMapping = buildEventToCommandMapping(metadataService);
15
+ }
16
+ registerSettledHandler(registration) {
17
+ const templateId = this.generateTemplateId(registration);
18
+ debug('Registering settled handler template:', templateId, 'for commands:', registration.commandTypes);
19
+ this.handlerTemplates.set(templateId, {
20
+ id: templateId,
21
+ registration,
22
+ });
23
+ // Track which command types this template is interested in
24
+ for (const commandType of registration.commandTypes) {
25
+ if (!this.commandToHandlerIds.has(commandType)) {
26
+ this.commandToHandlerIds.set(commandType, new Set());
27
+ }
28
+ this.commandToHandlerIds.get(commandType).add(templateId);
29
+ }
30
+ }
31
+ instantiateHandlerForCorrelation(template, correlationId) {
32
+ const instanceId = this.generateInstanceId(template.id, correlationId);
33
+ if (this.handlerInstances.has(instanceId)) {
34
+ return;
35
+ }
36
+ debug('Instantiating settled handler for correlationId:', correlationId, 'template:', template.id);
37
+ const commandTrackers = new Map();
38
+ for (const commandType of template.registration.commandTypes) {
39
+ commandTrackers.set(commandType, {
40
+ commandType,
41
+ hasCompleted: false,
42
+ events: [],
43
+ });
44
+ }
45
+ this.handlerInstances.set(instanceId, {
46
+ templateId: template.id,
47
+ correlationId,
48
+ registration: template.registration,
49
+ commandTrackers,
50
+ });
51
+ }
52
+ onCommandStarted(command) {
53
+ const { type: commandType, correlationId, requestId } = command;
54
+ if (correlationId === undefined ||
55
+ correlationId === null ||
56
+ correlationId === '' ||
57
+ requestId === undefined ||
58
+ requestId === null ||
59
+ requestId === '') {
60
+ debug('Command missing correlation/request ID, cannot track:', commandType);
61
+ return;
62
+ }
63
+ // Track this command execution
64
+ this.runningCommands.set(requestId, { commandType, correlationId });
65
+ debug('Started tracking command:', commandType, 'with requestId:', requestId, 'correlationId:', correlationId);
66
+ // Instantiate handlers for this correlationId if needed
67
+ const templateIds = this.commandToHandlerIds.get(commandType);
68
+ if (templateIds) {
69
+ for (const templateId of templateIds) {
70
+ const template = this.handlerTemplates.get(templateId);
71
+ if (template) {
72
+ this.instantiateHandlerForCorrelation(template, correlationId);
73
+ }
74
+ }
75
+ }
76
+ }
77
+ onEventReceived(event) {
78
+ const eventCorrelationId = event.correlationId;
79
+ debug('Received event:', event.type, 'with correlationId:', eventCorrelationId);
80
+ if (eventCorrelationId === undefined || eventCorrelationId === null || eventCorrelationId === '') {
81
+ debug('Event missing correlationId, cannot route:', event.type);
82
+ return;
83
+ }
84
+ // Route event to handler instances matching this correlationId
85
+ for (const [instanceId, instance] of this.handlerInstances) {
86
+ if (instance.correlationId !== eventCorrelationId) {
87
+ continue;
88
+ }
89
+ for (const [commandType, tracker] of instance.commandTrackers) {
90
+ if (tracker.hasCompleted)
91
+ continue;
92
+ // Check if this event is related to this command type
93
+ if (this.isEventFromCommand(event.type, commandType)) {
94
+ debug('Event', event.type, 'is related to command', commandType, 'for instance', instanceId);
95
+ // Always add related events to the tracker
96
+ tracker.events.push(event);
97
+ // Only mark as completed if this is a completion event
98
+ if (this.isCompletionEvent(event.type)) {
99
+ tracker.hasCompleted = true;
100
+ debug('Marked command', commandType, 'as completed for instance', instanceId);
101
+ // Check if all commands for this instance have completed
102
+ this.checkAndTriggerHandlerInstance(instanceId, instance);
103
+ }
104
+ else {
105
+ debug('Event', event.type, 'is progress for command', commandType, '- not marking as completed yet');
106
+ }
107
+ }
108
+ }
109
+ }
110
+ }
111
+ isEventFromCommand(eventType, commandType) {
112
+ // Get fresh mapping in case new handlers have been registered
113
+ const currentMapping = buildEventToCommandMapping(this.metadataService);
114
+ const sourceCommand = currentMapping[eventType];
115
+ return sourceCommand === commandType;
116
+ }
117
+ isCompletionEvent(eventType) {
118
+ // Get fresh mapping in case new handlers have been registered
119
+ const currentMapping = buildEventToCommandMapping(this.metadataService);
120
+ if (currentMapping[eventType] !== undefined) {
121
+ return true;
122
+ }
123
+ if (this.metadataService) {
124
+ const commands = this.metadataService.getAllCommandsMetadata();
125
+ return commands.some((command) => command.events?.includes(eventType) ?? false);
126
+ }
127
+ return false;
128
+ }
129
+ collectEventsByCommandType(instance) {
130
+ const eventsByCommandType = {};
131
+ for (const [commandType, tracker] of instance.commandTrackers) {
132
+ eventsByCommandType[commandType] = [...tracker.events];
133
+ }
134
+ return eventsByCommandType;
135
+ }
136
+ processPendingDispatches(parentCorrelationId) {
137
+ const pendingDispatches = getPendingDispatches();
138
+ debug('Found %d pending dispatches after handler execution', pendingDispatches.length);
139
+ if (pendingDispatches.length > 0 && this.onDispatchAction) {
140
+ for (const action of pendingDispatches) {
141
+ debug('Processing pending dispatch action:', action.type);
142
+ this.onDispatchAction(action, parentCorrelationId);
143
+ }
144
+ }
145
+ }
146
+ shouldPersistHandler(result) {
147
+ return (result !== null &&
148
+ result !== undefined &&
149
+ typeof result === 'object' &&
150
+ 'persist' in result &&
151
+ result.persist === true);
152
+ }
153
+ resetHandlerTrackers(instance) {
154
+ for (const tracker of instance.commandTrackers.values()) {
155
+ tracker.hasCompleted = false;
156
+ tracker.events = [];
157
+ }
158
+ }
159
+ checkAndTriggerHandlerInstance(instanceId, instance) {
160
+ const allCompleted = Array.from(instance.commandTrackers.values()).every((tracker) => tracker.hasCompleted);
161
+ if (!allCompleted) {
162
+ debug('Instance', instanceId, 'not ready yet - waiting for more commands to complete');
163
+ return;
164
+ }
165
+ debug('All commands completed for instance', instanceId, '- triggering settled handler');
166
+ const eventsByCommandType = this.collectEventsByCommandType(instance);
167
+ try {
168
+ debug('Executing settled handler with events:', Object.keys(eventsByCommandType));
169
+ const result = instance.registration.handler(eventsByCommandType);
170
+ this.processPendingDispatches(instance.correlationId);
171
+ if (this.shouldPersistHandler(result)) {
172
+ debug('Persisting settled handler instance for retry:', instanceId);
173
+ this.resetHandlerTrackers(instance);
174
+ }
175
+ else {
176
+ debug('Cleaning up settled handler instance:', instanceId);
177
+ this.cleanupHandlerInstance(instanceId);
178
+ }
179
+ }
180
+ catch (error) {
181
+ debug('Error executing settled handler instance', instanceId, ':', error);
182
+ this.cleanupHandlerInstance(instanceId);
183
+ }
184
+ }
185
+ cleanupHandlerInstance(instanceId) {
186
+ const instance = this.handlerInstances.get(instanceId);
187
+ if (!instance)
188
+ return;
189
+ this.handlerInstances.delete(instanceId);
190
+ debug('Cleaned up settled handler instance:', instanceId);
191
+ }
192
+ generateTemplateId(registration) {
193
+ const commandTypes = registration.commandTypes.join(',');
194
+ return `template-${commandTypes}`;
195
+ }
196
+ generateInstanceId(templateId, correlationId) {
197
+ return `${templateId}-${correlationId}`;
198
+ }
199
+ getActiveHandlers() {
200
+ return Array.from(this.handlerInstances.keys());
201
+ }
202
+ }
203
+ //# sourceMappingURL=settled-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settled-tracker.js","sourceRoot":"","sources":["../../../src/server/settled-tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Event } from '@auto-engineer/message-bus';
2
+ export type FoldFunction<S = unknown, E = Event> = (state: S, event: E) => S;
3
+ export declare class StateManager<State = Record<string, unknown>> {
4
+ private state;
5
+ private folds;
6
+ constructor(initialState?: State);
7
+ /**
8
+ * Register a fold function for a specific event type
9
+ */
10
+ registerFold(eventType: string, fold: FoldFunction<State>): void;
11
+ /**
12
+ * Apply an event to the state using registered fold functions
13
+ */
14
+ applyEvent(event: Event): void;
15
+ /**
16
+ * Get the current state
17
+ */
18
+ getState(): State;
19
+ /**
20
+ * Get a specific property from the state
21
+ */
22
+ getStateProperty(path: string): unknown;
23
+ }
24
+ //# sourceMappingURL=state-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-manager.d.ts","sourceRoot":"","sources":["../../../src/server/state-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAKxD,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;AAE7E,qBAAa,YAAY,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACvD,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,KAAK,CAA+C;gBAEhD,YAAY,CAAC,EAAE,KAAK;IAKhC;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,IAAI;IAKhE;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAc9B;;OAEG;IACH,QAAQ,IAAI,KAAK;IAIjB;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAcxC"}
@@ -0,0 +1,56 @@
1
+ import createDebug from 'debug';
2
+ const debug = createDebug('auto:cli:server:state');
3
+ export class StateManager {
4
+ constructor(initialState) {
5
+ this.folds = new Map();
6
+ this.state = initialState ?? {};
7
+ debug('StateManager initialized with state:', this.state);
8
+ }
9
+ /**
10
+ * Register a fold function for a specific event type
11
+ */
12
+ registerFold(eventType, fold) {
13
+ debug('Registering fold for event type:', eventType);
14
+ this.folds.set(eventType, fold);
15
+ }
16
+ /**
17
+ * Apply an event to the state using registered fold functions
18
+ */
19
+ applyEvent(event) {
20
+ const fold = this.folds.get(event.type);
21
+ if (fold) {
22
+ debug('Applying fold for event:', event.type);
23
+ debug('Current state before fold:', JSON.stringify(this.state));
24
+ const oldState = this.state;
25
+ this.state = fold(this.state, event);
26
+ debug('State updated from', JSON.stringify(oldState), 'to', JSON.stringify(this.state));
27
+ }
28
+ else {
29
+ debug('No fold registered for event type:', event.type);
30
+ debug('Available folds:', Array.from(this.folds.keys()));
31
+ }
32
+ }
33
+ /**
34
+ * Get the current state
35
+ */
36
+ getState() {
37
+ return this.state;
38
+ }
39
+ /**
40
+ * Get a specific property from the state
41
+ */
42
+ getStateProperty(path) {
43
+ const keys = path.split('.');
44
+ let current = this.state;
45
+ for (const key of keys) {
46
+ if (current !== null && current !== undefined && typeof current === 'object' && key in current) {
47
+ current = current[key];
48
+ }
49
+ else {
50
+ return undefined;
51
+ }
52
+ }
53
+ return current;
54
+ }
55
+ }
56
+ //# sourceMappingURL=state-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-manager.js","sourceRoot":"","sources":["../../../src/server/state-manager.ts"],"names":[],"mappings":"AACA,OAAO,WAAW,MAAM,OAAO,CAAC;AAEhC,MAAM,KAAK,GAAG,WAAW,CAAC,uBAAuB,CAAC,CAAC;AAInD,MAAM,OAAO,YAAY;IAIvB,YAAY,YAAoB;QAFxB,UAAK,GAAqC,IAAI,GAAG,EAAE,CAAC;QAG1D,IAAI,CAAC,KAAK,GAAG,YAAY,IAAK,EAAY,CAAC;QAC3C,KAAK,CAAC,sCAAsC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,SAAiB,EAAE,IAAyB;QACvD,KAAK,CAAC,kCAAkC,EAAE,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,KAAY;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9C,KAAK,CAAC,4BAA4B,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;YAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACrC,KAAK,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1F,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACxD,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,IAAY;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,OAAO,GAAY,IAAI,CAAC,KAAK,CAAC;QAElC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC/F,OAAO,GAAI,OAAmC,CAAC,GAAG,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import { Server as SocketIOServer } from 'socket.io';
2
+ import type { MessageBus } from '@auto-engineer/message-bus';
3
+ import type { StateManager } from './state-manager';
4
+ export declare function setupWebSocketHandlers(io: SocketIOServer, messageBus: MessageBus, stateManager: StateManager<Record<string, unknown>>): void;
5
+ //# sourceMappingURL=websocket-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-handler.d.ts","sourceRoot":"","sources":["../../../src/server/websocket-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAW,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAKpD,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,cAAc,EAClB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAClD,IAAI,CA2CN"}
@@ -0,0 +1,40 @@
1
+ import createDebug from 'debug';
2
+ const debugWs = createDebug('auto:cli:server:ws');
3
+ export function setupWebSocketHandlers(io, messageBus, stateManager) {
4
+ io.on('connection', (socket) => {
5
+ debugWs('WebSocket client connected:', socket.id);
6
+ // Send current state to new client
7
+ socket.emit('state', stateManager.getState());
8
+ // Handle command from WebSocket
9
+ socket.on('command', async (command) => {
10
+ debugWs('Received command via WebSocket:', command.type);
11
+ try {
12
+ // Add request ID if not present
13
+ const hasRequestId = command.requestId !== null && command.requestId !== undefined && command.requestId !== '';
14
+ const cmdWithId = hasRequestId
15
+ ? command
16
+ : { ...command, requestId: `ws-${Date.now()}-${Math.random().toString(36).substring(2, 11)}` };
17
+ await messageBus.sendCommand(cmdWithId);
18
+ socket.emit('command-ack', {
19
+ status: 'ack',
20
+ commandId: cmdWithId.requestId,
21
+ });
22
+ }
23
+ catch (error) {
24
+ socket.emit('command-ack', {
25
+ status: 'nack',
26
+ error: error instanceof Error ? error.message : 'Unknown error',
27
+ });
28
+ }
29
+ });
30
+ // Handle state query
31
+ socket.on('get-state', () => {
32
+ socket.emit('state', stateManager.getState());
33
+ });
34
+ socket.on('disconnect', () => {
35
+ debugWs('WebSocket client disconnected:', socket.id);
36
+ });
37
+ });
38
+ debugWs('WebSocket handlers configured');
39
+ }
40
+ //# sourceMappingURL=websocket-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-handler.js","sourceRoot":"","sources":["../../../src/server/websocket-handler.ts"],"names":[],"mappings":"AAGA,OAAO,WAAW,MAAM,OAAO,CAAC;AAEhC,MAAM,OAAO,GAAG,WAAW,CAAC,oBAAoB,CAAC,CAAC;AAElD,MAAM,UAAU,sBAAsB,CACpC,EAAkB,EAClB,UAAsB,EACtB,YAAmD;IAEnD,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE;QAC7B,OAAO,CAAC,6BAA6B,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAElD,mCAAmC;QACnC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE9C,gCAAgC;QAChC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,OAAgB,EAAE,EAAE;YAC9C,OAAO,CAAC,iCAAiC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YAEzD,IAAI,CAAC;gBACH,gCAAgC;gBAChC,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,KAAK,IAAI,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,SAAS,KAAK,EAAE,CAAC;gBAC/G,MAAM,SAAS,GAAG,YAAY;oBAC5B,CAAC,CAAC,OAAO;oBACT,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAEjG,MAAM,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;gBAExC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE;oBACzB,MAAM,EAAE,KAAK;oBACb,SAAS,EAAE,SAAS,CAAC,SAAS;iBAC/B,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE;oBACzB,MAAM,EAAE,MAAM;oBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;iBAChE,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,qBAAqB;QACrB,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;YAC1B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;YAC3B,OAAO,CAAC,gCAAgC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,+BAA+B,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type Server as HttpServer } from 'node:http';
2
+ import type { RequestHandler } from 'express';
3
+ import { FileSyncer, type SocketMiddleware } from './file-syncer/index.js';
4
+ export type { SocketMiddleware };
5
+ export interface StartServerOptions {
6
+ port: number;
7
+ debug?: boolean;
8
+ configPath?: string;
9
+ httpMiddleware?: RequestHandler[];
10
+ socketMiddleware?: SocketMiddleware;
11
+ }
12
+ export interface ServerHandle {
13
+ fileSyncer: FileSyncer;
14
+ httpServer: HttpServer;
15
+ actualPort: number;
16
+ syncPort: number;
17
+ stop: () => Promise<void>;
18
+ }
19
+ export declare function startServer(opts: StartServerOptions): Promise<ServerHandle>;
20
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AAKpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAI9C,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE3E,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAWjC,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,cAAc,EAAE,CAAC;IAClC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AA6KD,wBAAsB,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CA6CjF"}
@@ -0,0 +1,204 @@
1
+ import * as fs from 'node:fs';
2
+ import { createServer } from 'node:http';
3
+ import * as path from 'node:path';
4
+ import { pathToFileURL } from 'node:url';
5
+ import { PipelineServer } from '@auto-engineer/pipeline';
6
+ import getPort, { portNumbers } from 'get-port';
7
+ import createJiti from 'jiti';
8
+ import { Server as SocketIOServer } from 'socket.io';
9
+ import { FileSyncer } from './file-syncer/index.js';
10
+ function findConfigFile() {
11
+ const candidates = ['auto.config.ts', 'auto.config.js'];
12
+ for (const candidate of candidates) {
13
+ const fullPath = path.join(process.cwd(), candidate);
14
+ if (fs.existsSync(fullPath)) {
15
+ return fullPath;
16
+ }
17
+ }
18
+ return null;
19
+ }
20
+ async function loadPipelineConfig(configPath) {
21
+ try {
22
+ if (configPath.endsWith('.ts')) {
23
+ const jiti = createJiti(import.meta.url, { interopDefault: true });
24
+ return await jiti.import(configPath);
25
+ }
26
+ const configUrl = pathToFileURL(path.resolve(configPath)).href;
27
+ const configModule = (await import(configUrl));
28
+ return configModule.default ?? configModule;
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ function isValidHandler(item) {
35
+ return item !== null && item !== undefined && typeof item === 'object' && 'handle' in item && 'name' in item;
36
+ }
37
+ function extractCommandHandler(module, _filename, _packageName) {
38
+ if (isValidHandler(module.default)) {
39
+ return module.default;
40
+ }
41
+ if (isValidHandler(module.commandHandler)) {
42
+ return module.commandHandler;
43
+ }
44
+ if (isValidHandler(module.handler)) {
45
+ return module.handler;
46
+ }
47
+ for (const [_key, value] of Object.entries(module)) {
48
+ if (isValidHandler(value)) {
49
+ return value;
50
+ }
51
+ }
52
+ return null;
53
+ }
54
+ async function detectCommandsByConvention(packageName) {
55
+ const handlers = [];
56
+ const packageShortName = packageName.replace('@auto-engineer/', '');
57
+ const workspaceCommandsPath = path.join(process.cwd(), 'packages', packageShortName, 'dist', 'commands');
58
+ const workspaceSrcCommandsPath = path.join(process.cwd(), 'packages', packageShortName, 'dist', 'src', 'commands');
59
+ const nodeModulesCommandsPath = path.join(process.cwd(), 'node_modules', packageName, 'dist', 'commands');
60
+ const nodeModulesSrcCommandsPath = path.join(process.cwd(), 'node_modules', packageName, 'dist', 'src', 'commands');
61
+ let commandsDir = null;
62
+ if (fs.existsSync(workspaceCommandsPath)) {
63
+ commandsDir = workspaceCommandsPath;
64
+ }
65
+ else if (fs.existsSync(workspaceSrcCommandsPath)) {
66
+ commandsDir = workspaceSrcCommandsPath;
67
+ }
68
+ else if (fs.existsSync(nodeModulesCommandsPath)) {
69
+ commandsDir = nodeModulesCommandsPath;
70
+ }
71
+ else if (fs.existsSync(nodeModulesSrcCommandsPath)) {
72
+ commandsDir = nodeModulesSrcCommandsPath;
73
+ }
74
+ if (!commandsDir) {
75
+ return handlers;
76
+ }
77
+ const commandFiles = fs.readdirSync(commandsDir).filter((file) => file.endsWith('.js'));
78
+ for (const filename of commandFiles) {
79
+ const filePath = path.join(commandsDir, filename);
80
+ const fileUrl = pathToFileURL(filePath).href;
81
+ try {
82
+ const module = (await import(fileUrl));
83
+ const handler = extractCommandHandler(module, filename, packageName);
84
+ if (handler) {
85
+ handlers.push(handler);
86
+ }
87
+ }
88
+ catch {
89
+ // Skip failed imports
90
+ }
91
+ }
92
+ return handlers;
93
+ }
94
+ async function tryLoadFromPath(modulePath) {
95
+ if (!fs.existsSync(modulePath))
96
+ return null;
97
+ const packageUrl = pathToFileURL(modulePath).href;
98
+ return (await import(packageUrl));
99
+ }
100
+ async function loadPlugin(packageName) {
101
+ const packageShortName = packageName.replace('@auto-engineer/', '');
102
+ const workspaceBase = path.join(process.cwd(), 'packages', packageShortName, 'dist');
103
+ const nodeModulesBase = path.join(process.cwd(), 'node_modules', packageName, 'dist');
104
+ const pathsToTry = [
105
+ path.join(workspaceBase, 'index.js'),
106
+ path.join(workspaceBase, 'src', 'index.js'),
107
+ path.join(nodeModulesBase, 'index.js'),
108
+ path.join(nodeModulesBase, 'src', 'index.js'),
109
+ ];
110
+ const nodePathsToTry = [path.join(workspaceBase, 'src', 'node.js'), path.join(nodeModulesBase, 'src', 'node.js')];
111
+ try {
112
+ for (const modulePath of pathsToTry) {
113
+ const plugin = await tryLoadFromPath(modulePath);
114
+ if (plugin?.COMMANDS)
115
+ return plugin;
116
+ }
117
+ for (const modulePath of nodePathsToTry) {
118
+ const plugin = await tryLoadFromPath(modulePath);
119
+ if (plugin?.COMMANDS)
120
+ return plugin;
121
+ }
122
+ const dynamicPlugin = (await import(packageName));
123
+ if (dynamicPlugin?.COMMANDS)
124
+ return dynamicPlugin;
125
+ try {
126
+ const nodeImport = (await import(`${packageName}/node`));
127
+ if (nodeImport?.COMMANDS)
128
+ return nodeImport;
129
+ }
130
+ catch {
131
+ // /node subpath not available
132
+ }
133
+ return null;
134
+ }
135
+ catch {
136
+ return null;
137
+ }
138
+ }
139
+ async function loadCommandHandlers(plugins) {
140
+ const handlers = [];
141
+ for (const packageName of plugins) {
142
+ const plugin = await loadPlugin(packageName);
143
+ if (plugin?.COMMANDS) {
144
+ handlers.push(...plugin.COMMANDS);
145
+ continue;
146
+ }
147
+ const detectedHandlers = await detectCommandsByConvention(packageName);
148
+ if (detectedHandlers.length > 0) {
149
+ handlers.push(...detectedHandlers);
150
+ }
151
+ }
152
+ return handlers;
153
+ }
154
+ async function startFileSyncServer(syncPort, watchDir, socketMiddleware) {
155
+ const httpServer = createServer();
156
+ const io = new SocketIOServer(httpServer, {
157
+ cors: { origin: '*' },
158
+ });
159
+ const fileSyncer = new FileSyncer(io, watchDir, undefined, { socketMiddleware });
160
+ fileSyncer.start();
161
+ return new Promise((resolve) => {
162
+ httpServer.listen(syncPort, () => {
163
+ resolve({ fileSyncer, httpServer });
164
+ });
165
+ });
166
+ }
167
+ export async function startServer(opts) {
168
+ const port = opts.port;
169
+ const actualPort = await getPort({ port: port === 0 ? undefined : portNumbers(port, port + 100) });
170
+ const syncPort = await getPort({ port: portNumbers(actualPort + 1, actualPort + 100) });
171
+ const configPath = opts.configPath ?? findConfigFile();
172
+ if (!configPath) {
173
+ throw new Error('No pipeline config found. Create an auto.config.ts file.');
174
+ }
175
+ const config = await loadPipelineConfig(configPath);
176
+ if (!config) {
177
+ throw new Error(`Failed to load pipeline config from ${configPath}`);
178
+ }
179
+ const commandHandlers = await loadCommandHandlers(config.plugins);
180
+ const pipelineServer = new PipelineServer({ port: actualPort });
181
+ if (opts.httpMiddleware) {
182
+ for (const middleware of opts.httpMiddleware) {
183
+ pipelineServer.use(middleware);
184
+ }
185
+ }
186
+ pipelineServer.registerCommandHandlers(commandHandlers);
187
+ pipelineServer.registerPipeline(config.pipeline);
188
+ const watchDir = path.dirname(configPath);
189
+ const { fileSyncer, httpServer } = await startFileSyncServer(syncPort, watchDir, opts.socketMiddleware);
190
+ await pipelineServer.start();
191
+ const stop = async () => {
192
+ fileSyncer.stop();
193
+ httpServer.close();
194
+ await pipelineServer.stop();
195
+ };
196
+ return {
197
+ fileSyncer,
198
+ httpServer,
199
+ actualPort,
200
+ syncPort,
201
+ stop,
202
+ };
203
+ }
204
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,YAAY,EAA6B,MAAM,WAAW,CAAC;AACpE,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,UAAU,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,UAAU,EAAyB,MAAM,wBAAwB,CAAC;AA6B3E,SAAS,cAAc;IACrB,MAAM,UAAU,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IACxD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;QACrD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,UAAkB;IAClD,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;YACnE,OAAO,MAAM,IAAI,CAAC,MAAM,CAAiB,UAAU,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/D,MAAM,YAAY,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAkD,CAAC;QAChG,OAAO,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAa;IACnC,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,QAAQ,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC;AAC/G,CAAC;AAED,SAAS,qBAAqB,CAC5B,MAA+B,EAC/B,SAAiB,EACjB,YAAoB;IAEpB,IAAI,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,OAAqC,CAAC;IACtD,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;QAC1C,OAAO,MAAM,CAAC,cAA4C,CAAC;IAC7D,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,OAAqC,CAAC;IACtD,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAmC,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,WAAmB;IAC3D,MAAM,QAAQ,GAAiC,EAAE,CAAC;IAClD,MAAM,gBAAgB,GAAG,WAAW,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAEpE,MAAM,qBAAqB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IACzG,MAAM,wBAAwB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACnH,MAAM,uBAAuB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAC1G,MAAM,0BAA0B,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAEpH,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,EAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;QACzC,WAAW,GAAG,qBAAqB,CAAC;IACtC,CAAC;SAAM,IAAI,EAAE,CAAC,UAAU,CAAC,wBAAwB,CAAC,EAAE,CAAC;QACnD,WAAW,GAAG,wBAAwB,CAAC;IACzC,CAAC;SAAM,IAAI,EAAE,CAAC,UAAU,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAClD,WAAW,GAAG,uBAAuB,CAAC;IACxC,CAAC;SAAM,IAAI,EAAE,CAAC,UAAU,CAAC,0BAA0B,CAAC,EAAE,CAAC;QACrD,WAAW,GAAG,0BAA0B,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,YAAY,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACxF,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAA4B,CAAC;YAClE,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;YACrE,IAAI,OAAO,EAAE,CAAC;gBACZ,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,UAAkB;IAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;IAClD,OAAO,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,CAAiB,CAAC;AACpD,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,WAAmB;IAC3C,MAAM,gBAAgB,GAAG,WAAW,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IACpE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;IACrF,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAEtF,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,UAAU,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,UAAU,CAAC;KAC9C,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IAElH,IAAI,CAAC;QACH,KAAK,MAAM,UAAU,IAAI,UAAU,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;YACjD,IAAI,MAAM,EAAE,QAAQ;gBAAE,OAAO,MAAM,CAAC;QACtC,CAAC;QACD,KAAK,MAAM,UAAU,IAAI,cAAc,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;YACjD,IAAI,MAAM,EAAE,QAAQ;gBAAE,OAAO,MAAM,CAAC;QACtC,CAAC;QACD,MAAM,aAAa,GAAG,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC,CAAiB,CAAC;QAClE,IAAI,aAAa,EAAE,QAAQ;YAAE,OAAO,aAAa,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,WAAW,OAAO,CAAC,CAAiB,CAAC;YACzE,IAAI,UAAU,EAAE,QAAQ;gBAAE,OAAO,UAAU,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,OAAiB;IAClD,MAAM,QAAQ,GAAiC,EAAE,CAAC;IAClD,KAAK,MAAM,WAAW,IAAI,OAAO,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAI,MAAM,EAAE,QAAQ,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;YAClC,SAAS;QACX,CAAC;QACD,MAAM,gBAAgB,GAAG,MAAM,0BAA0B,CAAC,WAAW,CAAC,CAAC;QACvE,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,QAAQ,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,QAAgB,EAChB,QAAgB,EAChB,gBAAmC;IAEnC,MAAM,UAAU,GAAG,YAAY,EAAE,CAAC;IAClC,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,UAAU,EAAE;QACxC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE;KACtB,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACjF,UAAU,CAAC,KAAK,EAAE,CAAC;IAEnB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE;YAC/B,OAAO,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAwB;IACxD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IACnG,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IAExF,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,cAAc,EAAE,CAAC;IACvD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,uCAAuC,UAAU,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClE,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAEhE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC7C,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,cAAc,CAAC,uBAAuB,CAAC,eAAe,CAAC,CAAC;IACxD,cAAc,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEjD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAExG,MAAM,cAAc,CAAC,KAAK,EAAE,CAAC;IAE7B,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;QACrC,UAAU,CAAC,IAAI,EAAE,CAAC;QAClB,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC,CAAC;IAEF,OAAO;QACL,UAAU;QACV,UAAU;QACV,UAAU;QACV,QAAQ;QACR,IAAI;KACL,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { Config } from './config';
2
+ export interface AnalyticsData {
3
+ command: string;
4
+ timestamp: number;
5
+ version: string;
6
+ nodeVersion: string;
7
+ platform: string;
8
+ success: boolean;
9
+ errorCode?: string;
10
+ }
11
+ export declare class Analytics {
12
+ private config;
13
+ private output;
14
+ private optedIn;
15
+ constructor(config: Config);
16
+ promptForConsent(): Promise<boolean>;
17
+ private prepareAnalyticsData;
18
+ track(data: Omit<AnalyticsData, 'timestamp' | 'version' | 'nodeVersion' | 'platform'>): Promise<void>;
19
+ trackCommand(command: string, success: boolean, errorCode?: string): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../../src/utils/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,OAAO,CAAwB;gBAE3B,MAAM,EAAE,MAAM;IAKpB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IAU1C,OAAO,CAAC,oBAAoB;IAYtB,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,SAAS,GAAG,aAAa,GAAG,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrG,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOzF"}