@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.
- package/CHANGELOG.md +24 -4
- package/dist/src/__fixtures__/auto.config.d.ts +7 -0
- package/dist/src/__fixtures__/auto.config.d.ts.map +1 -0
- package/dist/src/__fixtures__/auto.config.js +7 -0
- package/dist/src/__fixtures__/auto.config.js.map +1 -0
- package/dist/src/dsl/index.d.ts +71 -0
- package/dist/src/dsl/index.d.ts.map +1 -0
- package/dist/src/dsl/index.js +504 -0
- package/dist/src/dsl/index.js.map +1 -0
- package/dist/src/dsl/types.d.ts +39 -0
- package/dist/src/dsl/types.d.ts.map +1 -0
- package/dist/src/dsl/types.js +2 -0
- package/dist/src/dsl/types.js.map +1 -0
- package/dist/src/dsl-exports.d.ts +5 -0
- package/dist/src/dsl-exports.d.ts.map +1 -0
- package/dist/src/dsl-exports.js +4 -0
- package/dist/src/dsl-exports.js.map +1 -0
- package/dist/src/index.js +16 -201
- package/dist/src/index.js.map +1 -1
- package/dist/src/plugin-loader.d.ts +84 -0
- package/dist/src/plugin-loader.d.ts.map +1 -0
- package/dist/src/plugin-loader.js +788 -0
- package/dist/src/plugin-loader.js.map +1 -0
- package/dist/src/server/command-metadata-service.d.ts +27 -0
- package/dist/src/server/command-metadata-service.d.ts.map +1 -0
- package/dist/src/server/command-metadata-service.js +69 -0
- package/dist/src/server/command-metadata-service.js.map +1 -0
- package/dist/src/server/command-registry.d.ts +21 -0
- package/dist/src/server/command-registry.d.ts.map +1 -0
- package/dist/src/server/command-registry.js +58 -0
- package/dist/src/server/command-registry.js.map +1 -0
- package/dist/src/server/config-loader.d.ts +16 -0
- package/dist/src/server/config-loader.d.ts.map +1 -0
- package/dist/src/server/config-loader.js +106 -0
- package/dist/src/server/config-loader.js.map +1 -0
- package/dist/src/server/event-processor.d.ts +45 -0
- package/dist/src/server/event-processor.d.ts.map +1 -0
- package/dist/src/server/event-processor.js +287 -0
- package/dist/src/server/event-processor.js.map +1 -0
- package/dist/src/server/file-syncer/crypto/jwe-encryptor.d.ts +15 -0
- package/dist/src/server/file-syncer/crypto/jwe-encryptor.d.ts.map +1 -0
- package/dist/src/server/file-syncer/crypto/jwe-encryptor.js +72 -0
- package/dist/src/server/file-syncer/crypto/jwe-encryptor.js.map +1 -0
- package/dist/src/server/file-syncer/crypto/provider-resolver.d.ts +24 -0
- package/dist/src/server/file-syncer/crypto/provider-resolver.d.ts.map +1 -0
- package/dist/src/server/file-syncer/crypto/provider-resolver.js +71 -0
- package/dist/src/server/file-syncer/crypto/provider-resolver.js.map +1 -0
- package/dist/src/server/file-syncer/discovery/bareImports.d.ts +3 -0
- package/dist/src/server/file-syncer/discovery/bareImports.d.ts.map +1 -0
- package/dist/src/server/file-syncer/discovery/bareImports.js +36 -0
- package/dist/src/server/file-syncer/discovery/bareImports.js.map +1 -0
- package/dist/src/server/file-syncer/discovery/dts.d.ts +11 -0
- package/dist/src/server/file-syncer/discovery/dts.d.ts.map +1 -0
- package/dist/src/server/file-syncer/discovery/dts.js +108 -0
- package/dist/src/server/file-syncer/discovery/dts.js.map +1 -0
- package/dist/src/server/file-syncer/index.d.ts +22 -0
- package/dist/src/server/file-syncer/index.d.ts.map +1 -0
- package/dist/src/server/file-syncer/index.js +378 -0
- package/dist/src/server/file-syncer/index.js.map +1 -0
- package/dist/src/server/file-syncer/sync/resolveSyncFileSet.d.ts +7 -0
- package/dist/src/server/file-syncer/sync/resolveSyncFileSet.d.ts.map +1 -0
- package/dist/src/server/file-syncer/sync/resolveSyncFileSet.js +103 -0
- package/dist/src/server/file-syncer/sync/resolveSyncFileSet.js.map +1 -0
- package/dist/src/server/file-syncer/types/wire.d.ts +14 -0
- package/dist/src/server/file-syncer/types/wire.d.ts.map +1 -0
- package/dist/src/server/file-syncer/types/wire.js +2 -0
- package/dist/src/server/file-syncer/types/wire.js.map +1 -0
- package/dist/src/server/file-syncer/utils/hash.d.ts +5 -0
- package/dist/src/server/file-syncer/utils/hash.d.ts.map +1 -0
- package/dist/src/server/file-syncer/utils/hash.js +20 -0
- package/dist/src/server/file-syncer/utils/hash.js.map +1 -0
- package/dist/src/server/file-syncer/utils/path.d.ts +15 -0
- package/dist/src/server/file-syncer/utils/path.d.ts.map +1 -0
- package/dist/src/server/file-syncer/utils/path.js +109 -0
- package/dist/src/server/file-syncer/utils/path.js.map +1 -0
- package/dist/src/server/http-routes.d.ts +30 -0
- package/dist/src/server/http-routes.d.ts.map +1 -0
- package/dist/src/server/http-routes.js +394 -0
- package/dist/src/server/http-routes.js.map +1 -0
- package/dist/src/server/sandbox-landing-page.html +367 -0
- package/dist/src/server/server.d.ts +106 -0
- package/dist/src/server/server.d.ts.map +1 -0
- package/dist/src/server/server.js +255 -0
- package/dist/src/server/server.js.map +1 -0
- package/dist/src/server/services/child-process-manager.d.ts +27 -0
- package/dist/src/server/services/child-process-manager.d.ts.map +1 -0
- package/dist/src/server/services/child-process-manager.js +126 -0
- package/dist/src/server/services/child-process-manager.js.map +1 -0
- package/dist/src/server/services/index.d.ts +3 -0
- package/dist/src/server/services/index.d.ts.map +1 -0
- package/dist/src/server/services/index.js +2 -0
- package/dist/src/server/services/index.js.map +1 -0
- package/dist/src/server/services/interface.d.ts +6 -0
- package/dist/src/server/services/interface.d.ts.map +1 -0
- package/dist/src/server/services/interface.js +2 -0
- package/dist/src/server/services/interface.js.map +1 -0
- package/dist/src/server/settled-tracker.d.ts +29 -0
- package/dist/src/server/settled-tracker.d.ts.map +1 -0
- package/dist/src/server/settled-tracker.js +203 -0
- package/dist/src/server/settled-tracker.js.map +1 -0
- package/dist/src/server/state-manager.d.ts +24 -0
- package/dist/src/server/state-manager.d.ts.map +1 -0
- package/dist/src/server/state-manager.js +56 -0
- package/dist/src/server/state-manager.js.map +1 -0
- package/dist/src/server/websocket-handler.d.ts +5 -0
- package/dist/src/server/websocket-handler.d.ts.map +1 -0
- package/dist/src/server/websocket-handler.js +40 -0
- package/dist/src/server/websocket-handler.js.map +1 -0
- package/dist/src/server.d.ts +20 -0
- package/dist/src/server.d.ts.map +1 -0
- package/dist/src/server.js +204 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/utils/analytics.d.ts +21 -0
- package/dist/src/utils/analytics.d.ts.map +1 -0
- package/dist/src/utils/analytics.js +41 -0
- package/dist/src/utils/analytics.js.map +1 -0
- package/dist/src/utils/config.d.ts +11 -0
- package/dist/src/utils/config.d.ts.map +1 -0
- package/dist/src/utils/config.js +50 -0
- package/dist/src/utils/config.js.map +1 -0
- package/dist/src/utils/correlation-id.d.ts +3 -0
- package/dist/src/utils/correlation-id.d.ts.map +1 -0
- package/dist/src/utils/correlation-id.js +7 -0
- package/dist/src/utils/correlation-id.js.map +1 -0
- package/dist/src/utils/errors.d.ts +22 -0
- package/dist/src/utils/errors.d.ts.map +1 -0
- package/dist/src/utils/errors.js +50 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/get-package-version.d.ts +7 -0
- package/dist/src/utils/get-package-version.d.ts.map +1 -0
- package/dist/src/utils/get-package-version.js +31 -0
- package/dist/src/utils/get-package-version.js.map +1 -0
- package/dist/src/utils/terminal.d.ts +13 -0
- package/dist/src/utils/terminal.d.ts.map +1 -0
- package/dist/src/utils/terminal.js +85 -0
- package/dist/src/utils/terminal.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +14 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,13 +1,33 @@
|
|
|
1
1
|
# @auto-engineer/cli
|
|
2
2
|
|
|
3
|
-
## 0.
|
|
3
|
+
## 0.21.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Unifies ports on cli
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies []:
|
|
12
|
+
- @auto-engineer/file-store@0.21.0
|
|
13
|
+
- @auto-engineer/narrative@0.21.0
|
|
14
|
+
- @auto-engineer/pipeline@0.21.0
|
|
15
|
+
|
|
16
|
+
## 0.20.0
|
|
17
|
+
|
|
18
|
+
### Minor Changes
|
|
19
|
+
|
|
20
|
+
- Add dual-mode CLI with importable server module
|
|
21
|
+
- Export `startServer()` function from `@auto-engineer/cli/server` subpath
|
|
22
|
+
- Support middleware injection via `httpMiddleware` and `socketMiddleware` options
|
|
23
|
+
- Enable external packages to extend CLI server with custom auth/middleware
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
|
6
26
|
|
|
7
27
|
- Updated dependencies []:
|
|
8
|
-
- @auto-engineer/
|
|
9
|
-
- @auto-engineer/
|
|
10
|
-
- @auto-engineer/pipeline@0.
|
|
28
|
+
- @auto-engineer/file-store@0.20.0
|
|
29
|
+
- @auto-engineer/narrative@0.20.0
|
|
30
|
+
- @auto-engineer/pipeline@0.20.0
|
|
11
31
|
|
|
12
32
|
## 0.19.0
|
|
13
33
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto.config.d.ts","sourceRoot":"","sources":["../../../src/__fixtures__/auto.config.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,KAAkC,CAAC;;;;;AAExD,wBAGE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto.config.js","sourceRoot":"","sources":["../../../src/__fixtures__/auto.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,KAAK,EAAE,CAAC;AAExD,eAAe;IACb,OAAO,EAAE,EAAE;IACX,QAAQ;CACT,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { Command, Event } from '@auto-engineer/message-bus';
|
|
2
|
+
import type { EventRegistration, DispatchAction, FoldRegistration, DslRegistration, ConfigDefinition, SettledRegistration, SettledHandlerConfig } from './types';
|
|
3
|
+
import type { CommandMetadataService } from '../server/command-metadata-service';
|
|
4
|
+
import type { ILocalMessageStore } from '@auto-engineer/message-store';
|
|
5
|
+
export type NodeStatus = 'None' | 'idle' | 'running' | 'pass' | 'fail';
|
|
6
|
+
export interface PipelineGraphConfig {
|
|
7
|
+
metadataService?: CommandMetadataService;
|
|
8
|
+
eventHandlers?: Map<string, Array<(event: Event) => void>>;
|
|
9
|
+
messageStore?: ILocalMessageStore;
|
|
10
|
+
dslRegistrations?: DslRegistration[];
|
|
11
|
+
}
|
|
12
|
+
export declare function on<T extends Event>(eventType: string | ((event: T) => void), handler?: (event: T) => Command | Command[] | DispatchAction | void): EventRegistration | void;
|
|
13
|
+
export declare namespace on {
|
|
14
|
+
var settled: <T extends Command, U extends Command = never, V extends Command = never, W extends Command = never, X extends Command = never>(commandTypes: [T, U, V, W, X] extends [Command, never, never, never, never] ? [T["type"]] : [T, U, V, W, X] extends [Command, Command, never, never, never] ? [T["type"], U["type"]] : [T, U, V, W, X] extends [Command, Command, Command, never, never] ? [T["type"], U["type"], V["type"]] : [T, U, V, W, X] extends [Command, Command, Command, Command, never] ? [T["type"], U["type"], V["type"], W["type"]] : [T, U, V, W, X] extends [Command, Command, Command, Command, Command] ? [T["type"], U["type"], V["type"], W["type"], X["type"]] : never, callbackOrConfig: ((events: [T, U, V, W, X] extends [Command, never, never, never, never] ? { [K in T["type"]]: Event[]; } : [T, U, V, W, X] extends [Command, Command, never, never, never] ? { [K in T["type"] | U["type"]]: Event[]; } : [T, U, V, W, X] extends [Command, Command, Command, never, never] ? { [K in T["type"] | U["type"] | V["type"]]: Event[]; } : [T, U, V, W, X] extends [Command, Command, Command, Command, never] ? { [K in T["type"] | U["type"] | V["type"] | W["type"]]: Event[]; } : [T, U, V, W, X] extends [Command, Command, Command, Command, Command] ? { [K in T["type"] | U["type"] | V["type"] | W["type"] | X["type"]]: Event[]; } : never) => void) | SettledHandlerConfig) => SettledRegistration;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Dispatch a command to the message bus
|
|
18
|
+
*/
|
|
19
|
+
export declare function dispatch<T extends Command>(command: T): DispatchAction;
|
|
20
|
+
export declare function dispatch<T extends Command>(commandType: T['type'], data: T['data']): Command;
|
|
21
|
+
export declare function dispatch<TDispatchCommands extends Command>(commandTypes: readonly TDispatchCommands['type'][], handler: (events: Record<string, Event[]>, send: <TCommand extends TDispatchCommands>(command: TCommand) => void) => void): SettledHandlerConfig<TDispatchCommands>;
|
|
22
|
+
export declare namespace dispatch {
|
|
23
|
+
var parallel: <T extends Command>(commands: T[]) => DispatchAction;
|
|
24
|
+
var sequence: <T extends Command>(commands: T[]) => DispatchAction;
|
|
25
|
+
var custom: <T extends Command>(commandFactory: () => T | T[]) => DispatchAction;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Register a fold function to update state when an event occurs
|
|
29
|
+
*/
|
|
30
|
+
export declare function fold<S, E extends Event>(eventType: string | ((state: S, event: E) => S), reducer?: (state: S, event: E) => S): FoldRegistration<S, E> | void;
|
|
31
|
+
/**
|
|
32
|
+
* Get all registrations and clear the list
|
|
33
|
+
*/
|
|
34
|
+
export declare function getRegistrations(): DslRegistration[];
|
|
35
|
+
/**
|
|
36
|
+
* Peek at registrations without clearing them
|
|
37
|
+
*/
|
|
38
|
+
export declare function peekRegistrations(): DslRegistration[];
|
|
39
|
+
/**
|
|
40
|
+
* Get all pending dispatches and clear the list
|
|
41
|
+
*/
|
|
42
|
+
export declare function getPendingDispatches(): DispatchAction[];
|
|
43
|
+
/**
|
|
44
|
+
* Create an Auto configuration with plugins and pipeline
|
|
45
|
+
*/
|
|
46
|
+
export declare function autoConfig(config: ConfigDefinition): ConfigDefinition;
|
|
47
|
+
export declare function buildEventToCommandMapping(metadataService?: CommandMetadataService): Record<string, string>;
|
|
48
|
+
/**
|
|
49
|
+
* Generate pipeline graph from current registrations
|
|
50
|
+
*/
|
|
51
|
+
export declare function getPipelineGraph(config?: PipelineGraphConfig): Promise<{
|
|
52
|
+
commandToEvents: Record<string, string[]>;
|
|
53
|
+
eventToCommand: Record<string, string>;
|
|
54
|
+
nodes: Array<{
|
|
55
|
+
id: string;
|
|
56
|
+
name: string;
|
|
57
|
+
title: string;
|
|
58
|
+
alias?: string;
|
|
59
|
+
description?: string;
|
|
60
|
+
package?: string;
|
|
61
|
+
version?: string;
|
|
62
|
+
category?: string;
|
|
63
|
+
icon?: string;
|
|
64
|
+
status: NodeStatus;
|
|
65
|
+
}>;
|
|
66
|
+
edges: Array<{
|
|
67
|
+
from: string;
|
|
68
|
+
to: string;
|
|
69
|
+
}>;
|
|
70
|
+
}>;
|
|
71
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dsl/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
import createDebug from 'debug';
|
|
2
|
+
const debug = createDebug('auto:cli:dsl:pipeline-graph');
|
|
3
|
+
let registrations = [];
|
|
4
|
+
let pendingDispatches = [];
|
|
5
|
+
function buildCommandEventMappings(metadataService) {
|
|
6
|
+
const mappings = {};
|
|
7
|
+
if (!metadataService) {
|
|
8
|
+
return mappings;
|
|
9
|
+
}
|
|
10
|
+
const commands = metadataService.getAllCommandsMetadata();
|
|
11
|
+
for (const command of commands) {
|
|
12
|
+
const commandName = command.name;
|
|
13
|
+
if (!commandName || typeof commandName !== 'string') {
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
if (!command.events || command.events.length === 0) {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
mappings[commandName] = command.events;
|
|
20
|
+
}
|
|
21
|
+
return mappings;
|
|
22
|
+
}
|
|
23
|
+
export function on(eventType, handler) {
|
|
24
|
+
if (typeof eventType === 'function') {
|
|
25
|
+
const registration = {
|
|
26
|
+
type: 'on',
|
|
27
|
+
eventType: '',
|
|
28
|
+
handler: eventType,
|
|
29
|
+
};
|
|
30
|
+
registrations.push(registration);
|
|
31
|
+
return registration;
|
|
32
|
+
}
|
|
33
|
+
if (handler) {
|
|
34
|
+
const registration = {
|
|
35
|
+
type: 'on',
|
|
36
|
+
eventType,
|
|
37
|
+
handler: handler,
|
|
38
|
+
};
|
|
39
|
+
registrations.push(registration);
|
|
40
|
+
return registration;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function settled(commandTypes, callbackOrConfig) {
|
|
44
|
+
const commandTypesArray = commandTypes;
|
|
45
|
+
if (typeof callbackOrConfig === 'function') {
|
|
46
|
+
const registration = {
|
|
47
|
+
type: 'on-settled',
|
|
48
|
+
commandTypes: commandTypesArray,
|
|
49
|
+
handler: callbackOrConfig,
|
|
50
|
+
};
|
|
51
|
+
registrations.push(registration);
|
|
52
|
+
return registration;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
const { dispatches, handler } = callbackOrConfig;
|
|
56
|
+
const wrappedHandler = (events) => {
|
|
57
|
+
const validatedDispatch = (command) => {
|
|
58
|
+
if (!dispatches.includes(command.type)) {
|
|
59
|
+
throw new Error(`Command type "${command.type}" is not declared in dispatches list`);
|
|
60
|
+
}
|
|
61
|
+
const action = {
|
|
62
|
+
type: 'dispatch',
|
|
63
|
+
command,
|
|
64
|
+
};
|
|
65
|
+
pendingDispatches.push(action);
|
|
66
|
+
};
|
|
67
|
+
return handler(events, validatedDispatch);
|
|
68
|
+
};
|
|
69
|
+
const registration = {
|
|
70
|
+
type: 'on-settled',
|
|
71
|
+
commandTypes: commandTypesArray,
|
|
72
|
+
handler: wrappedHandler,
|
|
73
|
+
dispatches,
|
|
74
|
+
};
|
|
75
|
+
registrations.push(registration);
|
|
76
|
+
return registration;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
on.settled = settled;
|
|
80
|
+
export function dispatch(commandOrTypeOrTypes, dataOrHandler) {
|
|
81
|
+
// Array pattern for on.settled
|
|
82
|
+
if (Array.isArray(commandOrTypeOrTypes)) {
|
|
83
|
+
const commandTypes = commandOrTypeOrTypes;
|
|
84
|
+
const handler = dataOrHandler;
|
|
85
|
+
return {
|
|
86
|
+
dispatches: commandTypes,
|
|
87
|
+
handler,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// Object pattern for full command
|
|
91
|
+
if (typeof commandOrTypeOrTypes === 'object' &&
|
|
92
|
+
commandOrTypeOrTypes !== null &&
|
|
93
|
+
!Array.isArray(commandOrTypeOrTypes)) {
|
|
94
|
+
const command = commandOrTypeOrTypes;
|
|
95
|
+
const action = {
|
|
96
|
+
type: 'dispatch',
|
|
97
|
+
command,
|
|
98
|
+
};
|
|
99
|
+
pendingDispatches.push(action);
|
|
100
|
+
return action;
|
|
101
|
+
}
|
|
102
|
+
// String pattern for command type + data - return the command object for event handlers
|
|
103
|
+
const commandType = commandOrTypeOrTypes;
|
|
104
|
+
const data = dataOrHandler;
|
|
105
|
+
const command = {
|
|
106
|
+
type: commandType,
|
|
107
|
+
data,
|
|
108
|
+
};
|
|
109
|
+
// Return the command directly for event handlers to process
|
|
110
|
+
return command;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Dispatch multiple commands in parallel
|
|
114
|
+
*/
|
|
115
|
+
dispatch.parallel = (commands) => {
|
|
116
|
+
const action = {
|
|
117
|
+
type: 'dispatch-parallel',
|
|
118
|
+
commands: commands,
|
|
119
|
+
};
|
|
120
|
+
pendingDispatches.push(action);
|
|
121
|
+
return action;
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Dispatch multiple commands in sequence
|
|
125
|
+
*/
|
|
126
|
+
dispatch.sequence = (commands) => {
|
|
127
|
+
const action = {
|
|
128
|
+
type: 'dispatch-sequence',
|
|
129
|
+
commands: commands,
|
|
130
|
+
};
|
|
131
|
+
pendingDispatches.push(action);
|
|
132
|
+
return action;
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* Dispatch a command based on custom logic
|
|
136
|
+
*/
|
|
137
|
+
dispatch.custom = (commandFactory) => {
|
|
138
|
+
const action = {
|
|
139
|
+
type: 'dispatch-custom',
|
|
140
|
+
commandFactory: commandFactory,
|
|
141
|
+
};
|
|
142
|
+
pendingDispatches.push(action);
|
|
143
|
+
return action;
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* Register a fold function to update state when an event occurs
|
|
147
|
+
*/
|
|
148
|
+
export function fold(eventType, reducer) {
|
|
149
|
+
// Support both forms: fold('EventName', reducer) and fold<State, Event>((state, event) => ...)
|
|
150
|
+
if (typeof eventType === 'function') {
|
|
151
|
+
const registration = {
|
|
152
|
+
type: 'fold',
|
|
153
|
+
eventType: '', // Will be inferred from type
|
|
154
|
+
reducer: eventType,
|
|
155
|
+
};
|
|
156
|
+
registrations.push(registration);
|
|
157
|
+
return registration;
|
|
158
|
+
}
|
|
159
|
+
if (reducer) {
|
|
160
|
+
const registration = {
|
|
161
|
+
type: 'fold',
|
|
162
|
+
eventType,
|
|
163
|
+
reducer,
|
|
164
|
+
};
|
|
165
|
+
registrations.push(registration);
|
|
166
|
+
return registration;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Get all registrations and clear the list
|
|
171
|
+
*/
|
|
172
|
+
export function getRegistrations() {
|
|
173
|
+
const result = [...registrations];
|
|
174
|
+
registrations = [];
|
|
175
|
+
return result;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Peek at registrations without clearing them
|
|
179
|
+
*/
|
|
180
|
+
export function peekRegistrations() {
|
|
181
|
+
return [...registrations];
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get all pending dispatches and clear the list
|
|
185
|
+
*/
|
|
186
|
+
export function getPendingDispatches() {
|
|
187
|
+
const result = [...pendingDispatches];
|
|
188
|
+
pendingDispatches = [];
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Create an Auto configuration with plugins and pipeline
|
|
193
|
+
*/
|
|
194
|
+
export function autoConfig(config) {
|
|
195
|
+
return config;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Convert camelCase/PascalCase to title case with spaces
|
|
199
|
+
* E.g., "GenerateServer" -> "Generate Server", "checkTypes" -> "Check Types", "GenerateHTML" -> "Generate HTML"
|
|
200
|
+
*/
|
|
201
|
+
function camelCaseToTitleCase(str) {
|
|
202
|
+
return str
|
|
203
|
+
.replace(/([a-z])([A-Z])/g, '$1 $2')
|
|
204
|
+
.replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')
|
|
205
|
+
.replace(/[_-]/g, ' ')
|
|
206
|
+
.replace(/^./, (match) => match.toUpperCase())
|
|
207
|
+
.trim();
|
|
208
|
+
}
|
|
209
|
+
export function buildEventToCommandMapping(metadataService) {
|
|
210
|
+
if (!metadataService) {
|
|
211
|
+
return {};
|
|
212
|
+
}
|
|
213
|
+
const eventToCommandMap = metadataService.getEventToCommandMapping?.();
|
|
214
|
+
const result = {};
|
|
215
|
+
if (eventToCommandMap instanceof Map) {
|
|
216
|
+
for (const [eventType, commandName] of eventToCommandMap.entries()) {
|
|
217
|
+
result[eventType] = commandName;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return result;
|
|
221
|
+
}
|
|
222
|
+
function hasEventError(event) {
|
|
223
|
+
const data = event.message.data;
|
|
224
|
+
return data !== null && typeof data === 'object' && ('error' in data || 'errors' in data);
|
|
225
|
+
}
|
|
226
|
+
function extractTargetIdentifier(commandData) {
|
|
227
|
+
if (commandData === null || typeof commandData !== 'object') {
|
|
228
|
+
return JSON.stringify(commandData);
|
|
229
|
+
}
|
|
230
|
+
const data = commandData;
|
|
231
|
+
const targetFields = ['targetDirectory', 'slicePath', 'filePath', 'componentName', 'path'];
|
|
232
|
+
for (const field of targetFields) {
|
|
233
|
+
if (field in data && typeof data[field] === 'string') {
|
|
234
|
+
return String(data[field]);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return JSON.stringify(commandData);
|
|
238
|
+
}
|
|
239
|
+
function traceCorrelationChain(requestId, allMessages) {
|
|
240
|
+
const chain = [requestId];
|
|
241
|
+
let currentId = requestId;
|
|
242
|
+
let commandMessage = allMessages.find((msg) => msg.messageType === 'command' && msg.message.requestId === currentId);
|
|
243
|
+
while (commandMessage !== undefined &&
|
|
244
|
+
commandMessage.message.correlationId !== undefined &&
|
|
245
|
+
commandMessage.message.correlationId !== null &&
|
|
246
|
+
commandMessage.message.correlationId !== '') {
|
|
247
|
+
const correlationId = commandMessage.message.correlationId;
|
|
248
|
+
chain.push(correlationId);
|
|
249
|
+
const parentCommand = allMessages.find((msg) => msg.messageType === 'command' && msg.message.requestId === correlationId);
|
|
250
|
+
if (parentCommand === undefined ||
|
|
251
|
+
parentCommand.message.correlationId === undefined ||
|
|
252
|
+
parentCommand.message.correlationId === null ||
|
|
253
|
+
parentCommand.message.correlationId === '') {
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
currentId = correlationId;
|
|
257
|
+
commandMessage = parentCommand;
|
|
258
|
+
}
|
|
259
|
+
return chain;
|
|
260
|
+
}
|
|
261
|
+
function getWorkflowRoot(requestId, allMessages) {
|
|
262
|
+
const chain = traceCorrelationChain(requestId, allMessages);
|
|
263
|
+
const rootRequestId = chain[chain.length - 1];
|
|
264
|
+
const rootCommand = allMessages.find((msg) => msg.messageType === 'command' && msg.message.requestId === rootRequestId);
|
|
265
|
+
return rootCommand?.message.type ?? null;
|
|
266
|
+
}
|
|
267
|
+
function isServerWorkflowCommand(workflowRoot) {
|
|
268
|
+
const serverWorkflowCommands = ['ImplementSlice', 'SliceGenerated', 'GenerateServer'];
|
|
269
|
+
return workflowRoot !== null && workflowRoot !== '' && serverWorkflowCommands.includes(workflowRoot);
|
|
270
|
+
}
|
|
271
|
+
function isClientWorkflowCommand(workflowRoot) {
|
|
272
|
+
const clientWorkflowCommands = ['ImplementComponent', 'ClientGenerated', 'GenerateClient'];
|
|
273
|
+
return workflowRoot !== null && workflowRoot !== '' && clientWorkflowCommands.includes(workflowRoot);
|
|
274
|
+
}
|
|
275
|
+
function shouldIncludeCommandInNodeStatus(command, commandType, allMessages) {
|
|
276
|
+
const sharedCheckCommands = ['CheckTypes', 'CheckTests', 'CheckLint'];
|
|
277
|
+
if (!sharedCheckCommands.includes(commandType)) {
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
const requestId = command.message.requestId;
|
|
281
|
+
if (requestId === undefined || requestId === null || requestId === '') {
|
|
282
|
+
return true;
|
|
283
|
+
}
|
|
284
|
+
const workflowRoot = getWorkflowRoot(requestId, allMessages);
|
|
285
|
+
if (isServerWorkflowCommand(workflowRoot)) {
|
|
286
|
+
return true;
|
|
287
|
+
}
|
|
288
|
+
return !isClientWorkflowCommand(workflowRoot);
|
|
289
|
+
}
|
|
290
|
+
function groupCommandsByTarget(commands) {
|
|
291
|
+
const commandsByTarget = new Map();
|
|
292
|
+
for (const command of commands) {
|
|
293
|
+
const targetId = extractTargetIdentifier(command.message.data);
|
|
294
|
+
commandsByTarget.set(targetId, command);
|
|
295
|
+
}
|
|
296
|
+
return commandsByTarget;
|
|
297
|
+
}
|
|
298
|
+
function checkCommandStatus(command, allMessages, commandEvents) {
|
|
299
|
+
const requestId = command.message.requestId;
|
|
300
|
+
if (requestId === undefined || requestId === null || requestId === '') {
|
|
301
|
+
return { hasCompletion: false, hasFailed: false };
|
|
302
|
+
}
|
|
303
|
+
const relatedEvents = allMessages.filter((msg) => msg.messageType === 'event' && msg.message.requestId === requestId);
|
|
304
|
+
const hasCompletion = relatedEvents.some((event) => commandEvents.includes(event.message.type));
|
|
305
|
+
const hasFailed = relatedEvents.some(hasEventError);
|
|
306
|
+
return { hasCompletion, hasFailed };
|
|
307
|
+
}
|
|
308
|
+
function determineStatusFromCommands(commandsByTarget, allMessages, commandEvents) {
|
|
309
|
+
let hasAnyRunning = false;
|
|
310
|
+
let hasAnyFailure = false;
|
|
311
|
+
let allCompleted = true;
|
|
312
|
+
for (const command of commandsByTarget.values()) {
|
|
313
|
+
const { hasCompletion, hasFailed } = checkCommandStatus(command, allMessages, commandEvents);
|
|
314
|
+
if (!hasCompletion) {
|
|
315
|
+
hasAnyRunning = true;
|
|
316
|
+
allCompleted = false;
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
if (hasFailed) {
|
|
320
|
+
hasAnyFailure = true;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
if (hasAnyFailure) {
|
|
324
|
+
return 'fail';
|
|
325
|
+
}
|
|
326
|
+
if (hasAnyRunning) {
|
|
327
|
+
return 'running';
|
|
328
|
+
}
|
|
329
|
+
if (allCompleted) {
|
|
330
|
+
return 'pass';
|
|
331
|
+
}
|
|
332
|
+
return 'running';
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Calculate status for a pipeline node based on message store
|
|
336
|
+
*/
|
|
337
|
+
async function calculateNodeStatus(commandType, messageStore, metadataService) {
|
|
338
|
+
try {
|
|
339
|
+
const allMessages = await messageStore.getAllMessages();
|
|
340
|
+
const allCommands = allMessages
|
|
341
|
+
.filter((msg) => msg.messageType === 'command' && msg.message.type === commandType)
|
|
342
|
+
.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
|
|
343
|
+
if (allCommands.length === 0) {
|
|
344
|
+
return 'idle';
|
|
345
|
+
}
|
|
346
|
+
const commandEventMappings = buildCommandEventMappings(metadataService);
|
|
347
|
+
const commandEvents = commandEventMappings[commandType];
|
|
348
|
+
if (commandEvents === undefined) {
|
|
349
|
+
return 'None';
|
|
350
|
+
}
|
|
351
|
+
const commands = allCommands.filter((cmd) => shouldIncludeCommandInNodeStatus(cmd, commandType, allMessages));
|
|
352
|
+
if (commands.length === 0) {
|
|
353
|
+
return 'idle';
|
|
354
|
+
}
|
|
355
|
+
const commandsByTarget = groupCommandsByTarget(commands);
|
|
356
|
+
return determineStatusFromCommands(commandsByTarget, allMessages, commandEvents);
|
|
357
|
+
}
|
|
358
|
+
catch (error) {
|
|
359
|
+
debug('Error calculating node status for %s: %O', commandType, error);
|
|
360
|
+
throw error;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
function processEventHandlers(eventHandlers, commandNodes, eventToCommandMap) {
|
|
364
|
+
debug('Using event handlers, found %d handlers', eventHandlers.size);
|
|
365
|
+
for (const [eventType, handlers] of eventHandlers) {
|
|
366
|
+
debug('Processing event type %s with %d handlers', eventType, handlers.length);
|
|
367
|
+
const sourceCommand = eventToCommandMap[eventType] || null;
|
|
368
|
+
debug('Source command for %s = %s', eventType, sourceCommand);
|
|
369
|
+
if (sourceCommand !== null && sourceCommand !== '') {
|
|
370
|
+
commandNodes.add(sourceCommand);
|
|
371
|
+
debug('Warning: eventHandlers path cannot determine target commands - skipping edge creation');
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
debug('Final nodes: %o', Array.from(commandNodes));
|
|
375
|
+
}
|
|
376
|
+
function processDslRegistrations(dslRegistrations, commandNodes, edges, metadataService, eventToCommandMap) {
|
|
377
|
+
const regsToProcess = dslRegistrations || registrations;
|
|
378
|
+
debug('Using DSL registrations, found %d registrations', regsToProcess.length);
|
|
379
|
+
regsToProcess.forEach((registration) => {
|
|
380
|
+
if (registration.type === 'on') {
|
|
381
|
+
processEventRegistration(registration, commandNodes, edges, metadataService, eventToCommandMap);
|
|
382
|
+
}
|
|
383
|
+
if (registration.type === 'on-settled') {
|
|
384
|
+
processSettledRegistration(registration, commandNodes, edges, metadataService);
|
|
385
|
+
}
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Generate pipeline graph from current registrations
|
|
390
|
+
*/
|
|
391
|
+
export async function getPipelineGraph(config = {}) {
|
|
392
|
+
const { metadataService, eventHandlers, messageStore, dslRegistrations } = config;
|
|
393
|
+
const commandNodes = new Set();
|
|
394
|
+
const edges = [];
|
|
395
|
+
debug('Called with metadataService=%s eventHandlers=%s eventHandlers size=%s messageStore=%s dslRegistrations=%s', !!metadataService, !!eventHandlers, eventHandlers?.size, !!messageStore, dslRegistrations?.length ?? 0);
|
|
396
|
+
const eventToCommandMap = buildEventToCommandMapping(metadataService);
|
|
397
|
+
debug('Built %d dynamic event-to-command mappings from metadata service', Object.keys(eventToCommandMap).length);
|
|
398
|
+
if (eventHandlers) {
|
|
399
|
+
processEventHandlers(eventHandlers, commandNodes, eventToCommandMap);
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
processDslRegistrations(dslRegistrations, commandNodes, edges, metadataService, eventToCommandMap);
|
|
403
|
+
}
|
|
404
|
+
const nodes = await Promise.all(Array.from(commandNodes).map(async (commandType) => {
|
|
405
|
+
const baseNode = {
|
|
406
|
+
id: commandType,
|
|
407
|
+
name: commandType,
|
|
408
|
+
title: camelCaseToTitleCase(commandType),
|
|
409
|
+
};
|
|
410
|
+
let status = 'None';
|
|
411
|
+
if (messageStore) {
|
|
412
|
+
status = await calculateNodeStatus(commandType, messageStore, metadataService);
|
|
413
|
+
}
|
|
414
|
+
if (metadataService) {
|
|
415
|
+
const metadata = metadataService.getCommandMetadata(commandType);
|
|
416
|
+
if (metadata) {
|
|
417
|
+
return {
|
|
418
|
+
...baseNode,
|
|
419
|
+
id: `${metadata.package}/${metadata.alias}`,
|
|
420
|
+
title: camelCaseToTitleCase(commandType),
|
|
421
|
+
alias: metadata.alias,
|
|
422
|
+
description: metadata.description,
|
|
423
|
+
package: metadata.package,
|
|
424
|
+
version: metadata.version,
|
|
425
|
+
category: metadata.category,
|
|
426
|
+
icon: metadata.icon ?? 'terminal',
|
|
427
|
+
status,
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
return {
|
|
432
|
+
...baseNode,
|
|
433
|
+
icon: 'terminal',
|
|
434
|
+
status,
|
|
435
|
+
};
|
|
436
|
+
}));
|
|
437
|
+
const commandToEvents = buildCommandEventMappings(metadataService);
|
|
438
|
+
return { nodes, edges, commandToEvents, eventToCommand: eventToCommandMap };
|
|
439
|
+
}
|
|
440
|
+
function processEventRegistration(registration, commandNodes, edges, metadataService, eventToCommandMap) {
|
|
441
|
+
try {
|
|
442
|
+
const mockEvent = { type: registration.eventType, data: {} };
|
|
443
|
+
const result = registration.handler(mockEvent);
|
|
444
|
+
if (result && typeof result === 'object' && 'type' in result) {
|
|
445
|
+
addCommandAndEdge(result, registration.eventType, commandNodes, edges, metadataService, eventToCommandMap);
|
|
446
|
+
}
|
|
447
|
+
else if (Array.isArray(result)) {
|
|
448
|
+
result.forEach((command) => {
|
|
449
|
+
if (command !== null && typeof command === 'object' && 'type' in command && typeof command.type === 'string') {
|
|
450
|
+
addCommandAndEdge(command, registration.eventType, commandNodes, edges, metadataService, eventToCommandMap);
|
|
451
|
+
}
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
catch {
|
|
456
|
+
// Handler might require specific event data, skip if it fails
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
function processSettledRegistration(registration, commandNodes, edges, metadataService) {
|
|
460
|
+
function getNodeId(commandType) {
|
|
461
|
+
if (metadataService) {
|
|
462
|
+
const metadata = metadataService.getCommandMetadata(commandType);
|
|
463
|
+
if (metadata) {
|
|
464
|
+
return `${metadata.package}/${metadata.alias}`;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
return commandType;
|
|
468
|
+
}
|
|
469
|
+
registration.commandTypes.forEach((commandType) => {
|
|
470
|
+
commandNodes.add(commandType);
|
|
471
|
+
});
|
|
472
|
+
if (registration.dispatches && registration.dispatches.length > 0) {
|
|
473
|
+
registration.dispatches.forEach((commandType) => {
|
|
474
|
+
commandNodes.add(commandType);
|
|
475
|
+
registration.commandTypes.forEach((settledCommand) => {
|
|
476
|
+
edges.push({
|
|
477
|
+
from: getNodeId(settledCommand),
|
|
478
|
+
to: getNodeId(commandType),
|
|
479
|
+
});
|
|
480
|
+
});
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
function addCommandAndEdge(command, eventType, commandNodes, edges, metadataService, eventToCommandMap) {
|
|
485
|
+
function getNodeId(commandType) {
|
|
486
|
+
if (metadataService) {
|
|
487
|
+
const metadata = metadataService.getCommandMetadata(commandType);
|
|
488
|
+
if (metadata) {
|
|
489
|
+
return `${metadata.package}/${metadata.alias}`;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
return commandType;
|
|
493
|
+
}
|
|
494
|
+
commandNodes.add(command.type);
|
|
495
|
+
const sourceCommand = eventToCommandMap?.[eventType];
|
|
496
|
+
if (sourceCommand !== undefined) {
|
|
497
|
+
commandNodes.add(sourceCommand);
|
|
498
|
+
edges.push({
|
|
499
|
+
from: getNodeId(sourceCommand),
|
|
500
|
+
to: getNodeId(command.type),
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
//# sourceMappingURL=index.js.map
|