@litmers/cursorflow-orchestrator 0.1.18 → 0.1.26
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 +25 -0
- package/README.md +25 -7
- package/commands/cursorflow-clean.md +19 -0
- package/commands/cursorflow-runs.md +59 -0
- package/commands/cursorflow-stop.md +55 -0
- package/dist/cli/clean.js +178 -6
- package/dist/cli/clean.js.map +1 -1
- package/dist/cli/index.js +12 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.js +8 -7
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/logs.js +126 -77
- package/dist/cli/logs.js.map +1 -1
- package/dist/cli/monitor.d.ts +7 -0
- package/dist/cli/monitor.js +1021 -202
- package/dist/cli/monitor.js.map +1 -1
- package/dist/cli/prepare.js +39 -21
- package/dist/cli/prepare.js.map +1 -1
- package/dist/cli/resume.js +268 -163
- package/dist/cli/resume.js.map +1 -1
- package/dist/cli/run.js +11 -5
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/runs.d.ts +5 -0
- package/dist/cli/runs.js +214 -0
- package/dist/cli/runs.js.map +1 -0
- package/dist/cli/setup-commands.js +0 -0
- package/dist/cli/signal.js +8 -8
- package/dist/cli/signal.js.map +1 -1
- package/dist/cli/stop.d.ts +5 -0
- package/dist/cli/stop.js +215 -0
- package/dist/cli/stop.js.map +1 -0
- package/dist/cli/tasks.d.ts +10 -0
- package/dist/cli/tasks.js +165 -0
- package/dist/cli/tasks.js.map +1 -0
- package/dist/core/auto-recovery.d.ts +212 -0
- package/dist/core/auto-recovery.js +737 -0
- package/dist/core/auto-recovery.js.map +1 -0
- package/dist/core/failure-policy.d.ts +156 -0
- package/dist/core/failure-policy.js +488 -0
- package/dist/core/failure-policy.js.map +1 -0
- package/dist/core/orchestrator.d.ts +16 -2
- package/dist/core/orchestrator.js +439 -105
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/core/reviewer.d.ts +2 -0
- package/dist/core/reviewer.js +2 -0
- package/dist/core/reviewer.js.map +1 -1
- package/dist/core/runner.d.ts +33 -10
- package/dist/core/runner.js +374 -164
- package/dist/core/runner.js.map +1 -1
- package/dist/services/logging/buffer.d.ts +67 -0
- package/dist/services/logging/buffer.js +309 -0
- package/dist/services/logging/buffer.js.map +1 -0
- package/dist/services/logging/console.d.ts +89 -0
- package/dist/services/logging/console.js +169 -0
- package/dist/services/logging/console.js.map +1 -0
- package/dist/services/logging/file-writer.d.ts +71 -0
- package/dist/services/logging/file-writer.js +516 -0
- package/dist/services/logging/file-writer.js.map +1 -0
- package/dist/services/logging/formatter.d.ts +39 -0
- package/dist/services/logging/formatter.js +227 -0
- package/dist/services/logging/formatter.js.map +1 -0
- package/dist/services/logging/index.d.ts +11 -0
- package/dist/services/logging/index.js +30 -0
- package/dist/services/logging/index.js.map +1 -0
- package/dist/services/logging/parser.d.ts +31 -0
- package/dist/services/logging/parser.js +222 -0
- package/dist/services/logging/parser.js.map +1 -0
- package/dist/services/process/index.d.ts +59 -0
- package/dist/services/process/index.js +257 -0
- package/dist/services/process/index.js.map +1 -0
- package/dist/types/agent.d.ts +20 -0
- package/dist/types/agent.js +6 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/config.d.ts +65 -0
- package/dist/types/config.js +6 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/events.d.ts +125 -0
- package/dist/types/events.js +6 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.js +37 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/lane.d.ts +43 -0
- package/dist/types/lane.js +6 -0
- package/dist/types/lane.js.map +1 -0
- package/dist/types/logging.d.ts +71 -0
- package/dist/types/logging.js +16 -0
- package/dist/types/logging.js.map +1 -0
- package/dist/types/review.d.ts +17 -0
- package/dist/types/review.js +6 -0
- package/dist/types/review.js.map +1 -0
- package/dist/types/run.d.ts +32 -0
- package/dist/types/run.js +6 -0
- package/dist/types/run.js.map +1 -0
- package/dist/types/task.d.ts +71 -0
- package/dist/types/task.js +6 -0
- package/dist/types/task.js.map +1 -0
- package/dist/ui/components.d.ts +134 -0
- package/dist/ui/components.js +389 -0
- package/dist/ui/components.js.map +1 -0
- package/dist/ui/log-viewer.d.ts +49 -0
- package/dist/ui/log-viewer.js +449 -0
- package/dist/ui/log-viewer.js.map +1 -0
- package/dist/utils/checkpoint.d.ts +87 -0
- package/dist/utils/checkpoint.js +317 -0
- package/dist/utils/checkpoint.js.map +1 -0
- package/dist/utils/config.d.ts +4 -0
- package/dist/utils/config.js +18 -8
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/cursor-agent.js.map +1 -1
- package/dist/utils/dependency.d.ts +74 -0
- package/dist/utils/dependency.js +420 -0
- package/dist/utils/dependency.js.map +1 -0
- package/dist/utils/doctor.js +17 -11
- package/dist/utils/doctor.js.map +1 -1
- package/dist/utils/enhanced-logger.d.ts +10 -33
- package/dist/utils/enhanced-logger.js +108 -20
- package/dist/utils/enhanced-logger.js.map +1 -1
- package/dist/utils/git.d.ts +121 -0
- package/dist/utils/git.js +484 -11
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/health.d.ts +91 -0
- package/dist/utils/health.js +556 -0
- package/dist/utils/health.js.map +1 -0
- package/dist/utils/lock.d.ts +95 -0
- package/dist/utils/lock.js +332 -0
- package/dist/utils/lock.js.map +1 -0
- package/dist/utils/log-buffer.d.ts +17 -0
- package/dist/utils/log-buffer.js +14 -0
- package/dist/utils/log-buffer.js.map +1 -0
- package/dist/utils/log-constants.d.ts +23 -0
- package/dist/utils/log-constants.js +28 -0
- package/dist/utils/log-constants.js.map +1 -0
- package/dist/utils/log-formatter.d.ts +25 -0
- package/dist/utils/log-formatter.js +237 -0
- package/dist/utils/log-formatter.js.map +1 -0
- package/dist/utils/log-service.d.ts +19 -0
- package/dist/utils/log-service.js +47 -0
- package/dist/utils/log-service.js.map +1 -0
- package/dist/utils/logger.d.ts +46 -27
- package/dist/utils/logger.js +82 -60
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/path.d.ts +19 -0
- package/dist/utils/path.js +77 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/process-manager.d.ts +21 -0
- package/dist/utils/process-manager.js +138 -0
- package/dist/utils/process-manager.js.map +1 -0
- package/dist/utils/retry.d.ts +121 -0
- package/dist/utils/retry.js +374 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/run-service.d.ts +88 -0
- package/dist/utils/run-service.js +412 -0
- package/dist/utils/run-service.js.map +1 -0
- package/dist/utils/state.d.ts +62 -3
- package/dist/utils/state.js +317 -11
- package/dist/utils/state.js.map +1 -1
- package/dist/utils/task-service.d.ts +82 -0
- package/dist/utils/task-service.js +348 -0
- package/dist/utils/task-service.js.map +1 -0
- package/dist/utils/template.d.ts +14 -0
- package/dist/utils/template.js +122 -0
- package/dist/utils/template.js.map +1 -0
- package/dist/utils/types.d.ts +2 -271
- package/dist/utils/types.js +16 -0
- package/dist/utils/types.js.map +1 -1
- package/package.json +38 -23
- package/scripts/ai-security-check.js +0 -1
- package/scripts/local-security-gate.sh +0 -0
- package/scripts/monitor-lanes.sh +94 -0
- package/scripts/patches/test-cursor-agent.js +0 -1
- package/scripts/release.sh +0 -0
- package/scripts/setup-security.sh +0 -0
- package/scripts/stream-logs.sh +72 -0
- package/scripts/verify-and-fix.sh +0 -0
- package/src/cli/clean.ts +187 -6
- package/src/cli/index.ts +12 -1
- package/src/cli/init.ts +8 -7
- package/src/cli/logs.ts +124 -77
- package/src/cli/monitor.ts +1815 -898
- package/src/cli/prepare.ts +41 -21
- package/src/cli/resume.ts +753 -626
- package/src/cli/run.ts +12 -5
- package/src/cli/runs.ts +212 -0
- package/src/cli/setup-commands.ts +0 -0
- package/src/cli/signal.ts +8 -7
- package/src/cli/stop.ts +209 -0
- package/src/cli/tasks.ts +154 -0
- package/src/core/auto-recovery.ts +909 -0
- package/src/core/failure-policy.ts +592 -0
- package/src/core/orchestrator.ts +1131 -704
- package/src/core/reviewer.ts +4 -0
- package/src/core/runner.ts +444 -180
- package/src/services/logging/buffer.ts +326 -0
- package/src/services/logging/console.ts +193 -0
- package/src/services/logging/file-writer.ts +526 -0
- package/src/services/logging/formatter.ts +268 -0
- package/src/services/logging/index.ts +16 -0
- package/src/services/logging/parser.ts +232 -0
- package/src/services/process/index.ts +261 -0
- package/src/types/agent.ts +24 -0
- package/src/types/config.ts +79 -0
- package/src/types/events.ts +156 -0
- package/src/types/index.ts +29 -0
- package/src/types/lane.ts +56 -0
- package/src/types/logging.ts +96 -0
- package/src/types/review.ts +20 -0
- package/src/types/run.ts +37 -0
- package/src/types/task.ts +79 -0
- package/src/ui/components.ts +430 -0
- package/src/ui/log-viewer.ts +485 -0
- package/src/utils/checkpoint.ts +374 -0
- package/src/utils/config.ts +18 -8
- package/src/utils/cursor-agent.ts +1 -1
- package/src/utils/dependency.ts +482 -0
- package/src/utils/doctor.ts +18 -11
- package/src/utils/enhanced-logger.ts +122 -60
- package/src/utils/git.ts +517 -11
- package/src/utils/health.ts +596 -0
- package/src/utils/lock.ts +346 -0
- package/src/utils/log-buffer.ts +28 -0
- package/src/utils/log-constants.ts +26 -0
- package/src/utils/log-formatter.ts +245 -0
- package/src/utils/log-service.ts +49 -0
- package/src/utils/logger.ts +100 -51
- package/src/utils/path.ts +45 -0
- package/src/utils/process-manager.ts +100 -0
- package/src/utils/retry.ts +413 -0
- package/src/utils/run-service.ts +433 -0
- package/src/utils/state.ts +385 -11
- package/src/utils/task-service.ts +370 -0
- package/src/utils/template.ts +92 -0
- package/src/utils/types.ts +2 -314
- package/templates/basic.json +21 -0
package/dist/utils/logger.js
CHANGED
|
@@ -1,128 +1,146 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* Logging utilities for CursorFlow
|
|
4
|
+
*
|
|
5
|
+
* 통일된 로그 형식: [HH:MM:SS] emoji TYPE message
|
|
6
|
+
* 컨텍스트 포함 시: [HH:MM:SS] [context] emoji TYPE message
|
|
4
7
|
*/
|
|
5
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
9
|
+
exports.LogLevel = exports.COLORS = void 0;
|
|
7
10
|
exports.setLogLevel = setLogLevel;
|
|
11
|
+
exports.getLogLevel = getLogLevel;
|
|
8
12
|
exports.error = error;
|
|
9
13
|
exports.warn = warn;
|
|
10
14
|
exports.info = info;
|
|
11
15
|
exports.success = success;
|
|
12
16
|
exports.debug = debug;
|
|
13
17
|
exports.progress = progress;
|
|
18
|
+
exports.withContext = withContext;
|
|
14
19
|
exports.section = section;
|
|
20
|
+
exports.raw = raw;
|
|
15
21
|
exports.log = log;
|
|
16
|
-
exports.json = json;
|
|
17
22
|
exports.createSpinner = createSpinner;
|
|
18
|
-
|
|
19
|
-
(function (
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
LogLevel[LogLevel["debug"] = 3] = "debug";
|
|
24
|
-
})(LogLevel || (exports.LogLevel = LogLevel = {}));
|
|
25
|
-
exports.COLORS = {
|
|
26
|
-
reset: '\x1b[0m',
|
|
27
|
-
red: '\x1b[31m',
|
|
28
|
-
yellow: '\x1b[33m',
|
|
29
|
-
green: '\x1b[32m',
|
|
30
|
-
blue: '\x1b[34m',
|
|
31
|
-
cyan: '\x1b[36m',
|
|
32
|
-
magenta: '\x1b[35m',
|
|
33
|
-
gray: '\x1b[90m',
|
|
34
|
-
bold: '\x1b[1m',
|
|
35
|
-
};
|
|
36
|
-
let currentLogLevel = LogLevel.info;
|
|
23
|
+
const log_constants_1 = require("./log-constants");
|
|
24
|
+
Object.defineProperty(exports, "COLORS", { enumerable: true, get: function () { return log_constants_1.COLORS; } });
|
|
25
|
+
Object.defineProperty(exports, "LogLevel", { enumerable: true, get: function () { return log_constants_1.LogLevel; } });
|
|
26
|
+
const log_formatter_1 = require("./log-formatter");
|
|
27
|
+
let currentLogLevel = log_constants_1.LogLevel.info;
|
|
37
28
|
/**
|
|
38
29
|
* Set log level
|
|
39
30
|
*/
|
|
40
31
|
function setLogLevel(level) {
|
|
41
32
|
if (typeof level === 'string') {
|
|
42
|
-
currentLogLevel = LogLevel[level] ?? LogLevel.info;
|
|
33
|
+
currentLogLevel = log_constants_1.LogLevel[level] ?? log_constants_1.LogLevel.info;
|
|
43
34
|
}
|
|
44
35
|
else {
|
|
45
36
|
currentLogLevel = level;
|
|
46
37
|
}
|
|
47
38
|
}
|
|
48
39
|
/**
|
|
49
|
-
*
|
|
40
|
+
* Get current log level
|
|
50
41
|
*/
|
|
51
|
-
function
|
|
52
|
-
|
|
53
|
-
const prefix = emoji ? `${emoji} ` : '';
|
|
54
|
-
const lines = String(message).split('\n');
|
|
55
|
-
return lines.map(line => `[${timestamp}] [${level.toUpperCase()}] ${prefix}${line}`).join('\n');
|
|
42
|
+
function getLogLevel() {
|
|
43
|
+
return currentLogLevel;
|
|
56
44
|
}
|
|
57
45
|
/**
|
|
58
|
-
*
|
|
46
|
+
* Internal log function that uses formatMessageForConsole
|
|
59
47
|
*/
|
|
60
|
-
function
|
|
61
|
-
|
|
48
|
+
function logInternal(type, message, options = {}) {
|
|
49
|
+
const level = log_constants_1.LogLevel[type] ?? log_constants_1.LogLevel.info;
|
|
50
|
+
if (level > currentLogLevel) {
|
|
62
51
|
return;
|
|
63
52
|
}
|
|
64
|
-
const formatted =
|
|
65
|
-
|
|
53
|
+
const formatted = (0, log_formatter_1.formatMessageForConsole)({
|
|
54
|
+
type: type,
|
|
55
|
+
role: 'system',
|
|
56
|
+
content: message,
|
|
57
|
+
timestamp: Date.now(),
|
|
58
|
+
}, {
|
|
59
|
+
includeTimestamp: !options.noTimestamp,
|
|
60
|
+
context: options.context,
|
|
61
|
+
compact: !options.box
|
|
62
|
+
});
|
|
63
|
+
console.log(formatted);
|
|
66
64
|
}
|
|
65
|
+
// ============================================================================
|
|
66
|
+
// Primary Logging Functions
|
|
67
|
+
// ============================================================================
|
|
67
68
|
/**
|
|
68
69
|
* Error log
|
|
69
70
|
*/
|
|
70
|
-
function error(message,
|
|
71
|
-
|
|
71
|
+
function error(message, options = {}) {
|
|
72
|
+
const opts = typeof options === 'string' ? { emoji: options } : options;
|
|
73
|
+
logInternal('error', message, opts);
|
|
72
74
|
}
|
|
73
75
|
/**
|
|
74
76
|
* Warning log
|
|
75
77
|
*/
|
|
76
|
-
function warn(message,
|
|
77
|
-
|
|
78
|
+
function warn(message, options = {}) {
|
|
79
|
+
const opts = typeof options === 'string' ? { emoji: options } : options;
|
|
80
|
+
logInternal('warn', message, opts);
|
|
78
81
|
}
|
|
79
82
|
/**
|
|
80
83
|
* Info log
|
|
81
84
|
*/
|
|
82
|
-
function info(message,
|
|
83
|
-
|
|
85
|
+
function info(message, options = {}) {
|
|
86
|
+
const opts = typeof options === 'string' ? { emoji: options } : options;
|
|
87
|
+
logInternal('info', message, opts);
|
|
84
88
|
}
|
|
85
89
|
/**
|
|
86
90
|
* Success log
|
|
87
91
|
*/
|
|
88
|
-
function success(message,
|
|
89
|
-
|
|
92
|
+
function success(message, options = {}) {
|
|
93
|
+
const opts = typeof options === 'string' ? { emoji: options } : options;
|
|
94
|
+
logInternal('success', message, opts);
|
|
90
95
|
}
|
|
91
96
|
/**
|
|
92
97
|
* Debug log
|
|
93
98
|
*/
|
|
94
|
-
function debug(message,
|
|
95
|
-
|
|
99
|
+
function debug(message, options = {}) {
|
|
100
|
+
const opts = typeof options === 'string' ? { emoji: options } : options;
|
|
101
|
+
logInternal('debug', message, opts);
|
|
96
102
|
}
|
|
97
103
|
/**
|
|
98
104
|
* Progress log
|
|
99
105
|
*/
|
|
100
|
-
function progress(message,
|
|
101
|
-
|
|
106
|
+
function progress(message, options = {}) {
|
|
107
|
+
const opts = typeof options === 'string' ? { emoji: options } : options;
|
|
108
|
+
logInternal('progress', message, opts);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Create a context-bound logger
|
|
112
|
+
*/
|
|
113
|
+
function withContext(context) {
|
|
114
|
+
return {
|
|
115
|
+
error: (message, options) => error(message, { ...options, context }),
|
|
116
|
+
warn: (message, options) => warn(message, { ...options, context }),
|
|
117
|
+
info: (message, options) => info(message, { ...options, context }),
|
|
118
|
+
success: (message, options) => success(message, { ...options, context }),
|
|
119
|
+
debug: (message, options) => debug(message, { ...options, context }),
|
|
120
|
+
progress: (message, options) => progress(message, { ...options, context }),
|
|
121
|
+
};
|
|
102
122
|
}
|
|
103
123
|
/**
|
|
104
124
|
* Section header
|
|
105
125
|
*/
|
|
106
126
|
function section(message) {
|
|
107
127
|
console.log('');
|
|
108
|
-
console.log(`${
|
|
109
|
-
console.log(`${
|
|
110
|
-
console.log(`${
|
|
128
|
+
console.log(`${log_constants_1.COLORS.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${log_constants_1.COLORS.reset}`);
|
|
129
|
+
console.log(`${log_constants_1.COLORS.cyan} ${message}${log_constants_1.COLORS.reset}`);
|
|
130
|
+
console.log(`${log_constants_1.COLORS.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${log_constants_1.COLORS.reset}`);
|
|
111
131
|
console.log('');
|
|
112
132
|
}
|
|
113
133
|
/**
|
|
114
|
-
*
|
|
134
|
+
* Raw output (direct to stdout)
|
|
115
135
|
*/
|
|
116
|
-
function
|
|
117
|
-
|
|
136
|
+
function raw(message) {
|
|
137
|
+
process.stdout.write(message);
|
|
118
138
|
}
|
|
119
139
|
/**
|
|
120
|
-
*
|
|
140
|
+
* Simple log without formatting
|
|
121
141
|
*/
|
|
122
|
-
function
|
|
123
|
-
|
|
124
|
-
console.log(JSON.stringify(data, null, 2));
|
|
125
|
-
}
|
|
142
|
+
function log(message) {
|
|
143
|
+
console.log(message);
|
|
126
144
|
}
|
|
127
145
|
/**
|
|
128
146
|
* Create spinner (simple implementation)
|
|
@@ -131,12 +149,13 @@ function createSpinner(message) {
|
|
|
131
149
|
const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
132
150
|
let i = 0;
|
|
133
151
|
let interval = null;
|
|
152
|
+
let currentMessage = message;
|
|
134
153
|
const spinner = {
|
|
135
154
|
start() {
|
|
136
|
-
process.stdout.write(`${
|
|
155
|
+
process.stdout.write(`${currentMessage} ${frames[0]}`);
|
|
137
156
|
interval = setInterval(() => {
|
|
138
157
|
i = (i + 1) % frames.length;
|
|
139
|
-
process.stdout.write(`\r${
|
|
158
|
+
process.stdout.write(`\r${currentMessage} ${frames[i]}`);
|
|
140
159
|
}, 80);
|
|
141
160
|
},
|
|
142
161
|
stop(finalMessage = null) {
|
|
@@ -150,10 +169,13 @@ function createSpinner(message) {
|
|
|
150
169
|
}
|
|
151
170
|
},
|
|
152
171
|
succeed(message) {
|
|
153
|
-
this.stop(`${
|
|
172
|
+
this.stop(`${log_constants_1.COLORS.green}✓${log_constants_1.COLORS.reset} ${message}`);
|
|
154
173
|
},
|
|
155
174
|
fail(message) {
|
|
156
|
-
this.stop(`${
|
|
175
|
+
this.stop(`${log_constants_1.COLORS.red}✗${log_constants_1.COLORS.reset} ${message}`);
|
|
176
|
+
},
|
|
177
|
+
update(message) {
|
|
178
|
+
currentMessage = message;
|
|
157
179
|
},
|
|
158
180
|
};
|
|
159
181
|
return spinner;
|
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensures that a path is safe and stays within a base directory.
|
|
3
|
+
* Prevents path traversal attacks.
|
|
4
|
+
*/
|
|
5
|
+
export declare function isSafePath(baseDir: string, ...parts: string[]): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Safely joins path parts and ensures the result is within the base directory.
|
|
8
|
+
* Throws an error if path traversal is detected.
|
|
9
|
+
*
|
|
10
|
+
* @param baseDir The base directory that the resulting path must be within
|
|
11
|
+
* @param parts Path parts to join
|
|
12
|
+
* @returns The joined path
|
|
13
|
+
* @throws Error if the resulting path is outside the base directory
|
|
14
|
+
*/
|
|
15
|
+
export declare function safeJoin(baseDir: string, ...parts: string[]): string;
|
|
16
|
+
/**
|
|
17
|
+
* Normalizes a path and checks if it's absolute or relative to project root.
|
|
18
|
+
*/
|
|
19
|
+
export declare function normalizePath(p: string, projectRoot: string): string;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.isSafePath = isSafePath;
|
|
37
|
+
exports.safeJoin = safeJoin;
|
|
38
|
+
exports.normalizePath = normalizePath;
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
/**
|
|
41
|
+
* Ensures that a path is safe and stays within a base directory.
|
|
42
|
+
* Prevents path traversal attacks.
|
|
43
|
+
*/
|
|
44
|
+
function isSafePath(baseDir, ...parts) {
|
|
45
|
+
const joined = path.join(baseDir, ...parts); // nosemgrep
|
|
46
|
+
const resolvedBase = path.resolve(baseDir); // nosemgrep
|
|
47
|
+
const resolvedJoined = path.resolve(joined); // nosemgrep
|
|
48
|
+
return resolvedJoined.startsWith(resolvedBase);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Safely joins path parts and ensures the result is within the base directory.
|
|
52
|
+
* Throws an error if path traversal is detected.
|
|
53
|
+
*
|
|
54
|
+
* @param baseDir The base directory that the resulting path must be within
|
|
55
|
+
* @param parts Path parts to join
|
|
56
|
+
* @returns The joined path
|
|
57
|
+
* @throws Error if the resulting path is outside the base directory
|
|
58
|
+
*/
|
|
59
|
+
function safeJoin(baseDir, ...parts) {
|
|
60
|
+
const joined = path.join(baseDir, ...parts); // nosemgrep
|
|
61
|
+
const resolvedBase = path.resolve(baseDir); // nosemgrep
|
|
62
|
+
const resolvedJoined = path.resolve(joined); // nosemgrep
|
|
63
|
+
if (!resolvedJoined.startsWith(resolvedBase)) {
|
|
64
|
+
throw new Error(`Potential path traversal detected: ${joined} is outside of ${baseDir}`);
|
|
65
|
+
}
|
|
66
|
+
return joined;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Normalizes a path and checks if it's absolute or relative to project root.
|
|
70
|
+
*/
|
|
71
|
+
function normalizePath(p, projectRoot) {
|
|
72
|
+
if (path.isAbsolute(p)) {
|
|
73
|
+
return path.normalize(p);
|
|
74
|
+
}
|
|
75
|
+
return path.join(projectRoot, p); // nosemgrep
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,gCAMC;AAWD,4BAUC;AAKD,sCAKC;AA3CD,2CAA6B;AAE7B;;;GAGG;AACH,SAAgB,UAAU,CAAC,OAAe,EAAE,GAAG,KAAe;IAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY;IACzD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY;IACxD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY;IAEzD,OAAO,cAAc,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjD,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,QAAQ,CAAC,OAAe,EAAE,GAAG,KAAe;IAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY;IACzD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY;IACxD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY;IAEzD,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,kBAAkB,OAAO,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,CAAS,EAAE,WAAmB;IAC1D,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY;AAChD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare class ProcessManager {
|
|
2
|
+
/**
|
|
3
|
+
* Check if a process is running by its PID
|
|
4
|
+
*/
|
|
5
|
+
static isProcessRunning(pid: number): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Kill a process by its PID
|
|
8
|
+
* @param pid Process ID
|
|
9
|
+
* @param signal Signal to send (default: SIGTERM)
|
|
10
|
+
*/
|
|
11
|
+
static killProcess(pid: number, signal?: string): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Kill a process and all its child processes
|
|
14
|
+
* Cross-platform implementation
|
|
15
|
+
*/
|
|
16
|
+
static killProcessTree(pid: number): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Find cursorflow related processes using pgrep (Linux/macOS only)
|
|
19
|
+
*/
|
|
20
|
+
static findCursorFlowProcesses(): number[];
|
|
21
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ProcessManager = void 0;
|
|
37
|
+
const child_process_1 = require("child_process");
|
|
38
|
+
const os = __importStar(require("os"));
|
|
39
|
+
class ProcessManager {
|
|
40
|
+
/**
|
|
41
|
+
* Check if a process is running by its PID
|
|
42
|
+
*/
|
|
43
|
+
static isProcessRunning(pid) {
|
|
44
|
+
try {
|
|
45
|
+
// Signal 0 checks for process existence without killing it
|
|
46
|
+
process.kill(pid, 0);
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Kill a process by its PID
|
|
55
|
+
* @param pid Process ID
|
|
56
|
+
* @param signal Signal to send (default: SIGTERM)
|
|
57
|
+
*/
|
|
58
|
+
static killProcess(pid, signal = 'SIGTERM') {
|
|
59
|
+
try {
|
|
60
|
+
if (os.platform() === 'win32') {
|
|
61
|
+
// Windows doesn't support signals in the same way, use taskkill
|
|
62
|
+
const result = (0, child_process_1.spawnSync)('taskkill', ['/F', '/PID', String(pid)]);
|
|
63
|
+
return result.status === 0;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
process.kill(pid, signal);
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Kill a process and all its child processes
|
|
76
|
+
* Cross-platform implementation
|
|
77
|
+
*/
|
|
78
|
+
static killProcessTree(pid) {
|
|
79
|
+
try {
|
|
80
|
+
if (os.platform() === 'win32') {
|
|
81
|
+
// Windows: /T flag kills child processes too
|
|
82
|
+
const result = (0, child_process_1.spawnSync)('taskkill', ['/F', '/T', '/PID', String(pid)]);
|
|
83
|
+
return result.status === 0;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// Linux/macOS: Find and kill children recursively or use pkill
|
|
87
|
+
// A simple approach is to use pgrep to find children
|
|
88
|
+
const result = (0, child_process_1.spawnSync)('pgrep', ['-P', String(pid)], { encoding: 'utf8' });
|
|
89
|
+
if (result.status === 0 && result.stdout) {
|
|
90
|
+
const children = result.stdout.split('\n').map(s => parseInt(s.trim())).filter(n => !isNaN(n));
|
|
91
|
+
for (const child of children) {
|
|
92
|
+
this.killProcessTree(child);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Kill the process itself
|
|
96
|
+
return this.killProcess(pid);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (e) {
|
|
100
|
+
// Fallback to simple kill
|
|
101
|
+
return this.killProcess(pid);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Find cursorflow related processes using pgrep (Linux/macOS only)
|
|
106
|
+
*/
|
|
107
|
+
static findCursorFlowProcesses() {
|
|
108
|
+
if (os.platform() === 'win32') {
|
|
109
|
+
// Basic Windows implementation using tasklist if needed,
|
|
110
|
+
// but for now focusing on core requirements
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
// Find processes with 'cursorflow' in their command line,
|
|
115
|
+
// avoiding unrelated matches by looking for specific execution patterns
|
|
116
|
+
const result = (0, child_process_1.spawnSync)('pgrep', ['-f', 'cursorflow.*(index|runner|orchestrator)'], { encoding: 'utf8' });
|
|
117
|
+
if (result.status !== 0) {
|
|
118
|
+
// Fallback to simpler pattern
|
|
119
|
+
const fallback = (0, child_process_1.spawnSync)('pgrep', ['-f', 'cursorflow'], { encoding: 'utf8' });
|
|
120
|
+
if (fallback.status !== 0)
|
|
121
|
+
return [];
|
|
122
|
+
return fallback.stdout
|
|
123
|
+
.split('\n')
|
|
124
|
+
.map(s => parseInt(s.trim()))
|
|
125
|
+
.filter(n => !isNaN(n) && n !== process.pid);
|
|
126
|
+
}
|
|
127
|
+
return result.stdout
|
|
128
|
+
.split('\n')
|
|
129
|
+
.map(s => parseInt(s.trim()))
|
|
130
|
+
.filter(n => !isNaN(n) && n !== process.pid);
|
|
131
|
+
}
|
|
132
|
+
catch (e) {
|
|
133
|
+
return [];
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
exports.ProcessManager = ProcessManager;
|
|
138
|
+
//# sourceMappingURL=process-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-manager.js","sourceRoot":"","sources":["../../src/utils/process-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced retry logic with exponential backoff and circuit breaker
|
|
3
|
+
*/
|
|
4
|
+
export interface RetryConfig {
|
|
5
|
+
/** Maximum number of retries */
|
|
6
|
+
maxRetries: number;
|
|
7
|
+
/** Base delay in milliseconds */
|
|
8
|
+
baseDelayMs: number;
|
|
9
|
+
/** Maximum delay in milliseconds */
|
|
10
|
+
maxDelayMs: number;
|
|
11
|
+
/** Backoff multiplier */
|
|
12
|
+
backoffFactor: number;
|
|
13
|
+
/** Add random jitter to delays */
|
|
14
|
+
jitter: boolean;
|
|
15
|
+
/** Timeout for each attempt in milliseconds */
|
|
16
|
+
attemptTimeoutMs?: number;
|
|
17
|
+
}
|
|
18
|
+
export declare const DEFAULT_RETRY_CONFIG: RetryConfig;
|
|
19
|
+
export interface CircuitBreakerConfig {
|
|
20
|
+
/** Number of consecutive failures before opening circuit */
|
|
21
|
+
failureThreshold: number;
|
|
22
|
+
/** Time in milliseconds before attempting to close circuit */
|
|
23
|
+
resetTimeoutMs: number;
|
|
24
|
+
/** Number of successful calls needed to close circuit */
|
|
25
|
+
successThreshold: number;
|
|
26
|
+
}
|
|
27
|
+
export declare const DEFAULT_CIRCUIT_BREAKER_CONFIG: CircuitBreakerConfig;
|
|
28
|
+
export declare enum CircuitState {
|
|
29
|
+
CLOSED = "CLOSED",// Normal operation
|
|
30
|
+
OPEN = "OPEN",// Blocking calls
|
|
31
|
+
HALF_OPEN = "HALF_OPEN"
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Circuit breaker implementation for managing service availability
|
|
35
|
+
*/
|
|
36
|
+
export declare class CircuitBreaker {
|
|
37
|
+
private state;
|
|
38
|
+
private failureCount;
|
|
39
|
+
private successCount;
|
|
40
|
+
private lastFailureTime;
|
|
41
|
+
private readonly config;
|
|
42
|
+
private readonly name;
|
|
43
|
+
constructor(name: string, config?: Partial<CircuitBreakerConfig>);
|
|
44
|
+
/**
|
|
45
|
+
* Check if circuit allows a call
|
|
46
|
+
*/
|
|
47
|
+
canCall(): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Record a successful call
|
|
50
|
+
*/
|
|
51
|
+
recordSuccess(): void;
|
|
52
|
+
/**
|
|
53
|
+
* Record a failed call
|
|
54
|
+
*/
|
|
55
|
+
recordFailure(): void;
|
|
56
|
+
/**
|
|
57
|
+
* Get current circuit state
|
|
58
|
+
*/
|
|
59
|
+
getState(): CircuitState;
|
|
60
|
+
/**
|
|
61
|
+
* Get time until circuit might close (for OPEN state)
|
|
62
|
+
*/
|
|
63
|
+
getTimeUntilRetry(): number;
|
|
64
|
+
/**
|
|
65
|
+
* Force reset the circuit breaker
|
|
66
|
+
*/
|
|
67
|
+
reset(): void;
|
|
68
|
+
/**
|
|
69
|
+
* Get circuit breaker status for monitoring
|
|
70
|
+
*/
|
|
71
|
+
getStatus(): {
|
|
72
|
+
state: CircuitState;
|
|
73
|
+
failureCount: number;
|
|
74
|
+
timeUntilRetry: number;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get or create a circuit breaker by name
|
|
79
|
+
*/
|
|
80
|
+
export declare function getCircuitBreaker(name: string, config?: Partial<CircuitBreakerConfig>): CircuitBreaker;
|
|
81
|
+
/**
|
|
82
|
+
* Calculate delay with exponential backoff and optional jitter
|
|
83
|
+
*/
|
|
84
|
+
export declare function calculateDelay(attempt: number, config: RetryConfig): number;
|
|
85
|
+
/**
|
|
86
|
+
* Sleep for specified milliseconds
|
|
87
|
+
*/
|
|
88
|
+
export declare function sleep(ms: number): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Wrap a promise with timeout
|
|
91
|
+
*/
|
|
92
|
+
export declare function withTimeout<T>(promise: Promise<T>, timeoutMs: number, message?: string): Promise<T>;
|
|
93
|
+
export interface RetryResult<T> {
|
|
94
|
+
success: boolean;
|
|
95
|
+
result?: T;
|
|
96
|
+
error?: Error;
|
|
97
|
+
attempts: number;
|
|
98
|
+
totalTimeMs: number;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Execute a function with enhanced retry logic
|
|
102
|
+
*/
|
|
103
|
+
export declare function withEnhancedRetry<T>(fn: () => Promise<T>, options?: {
|
|
104
|
+
config?: Partial<RetryConfig>;
|
|
105
|
+
circuitBreaker?: CircuitBreaker | string;
|
|
106
|
+
shouldRetry?: (error: Error, attempt: number) => boolean;
|
|
107
|
+
onRetry?: (error: Error, attempt: number, delayMs: number) => void;
|
|
108
|
+
label?: string;
|
|
109
|
+
}): Promise<RetryResult<T>>;
|
|
110
|
+
/**
|
|
111
|
+
* Check if an error is transient and worth retrying
|
|
112
|
+
*/
|
|
113
|
+
export declare function isTransientError(error: Error): boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Check if an error is permanent and should not be retried
|
|
116
|
+
*/
|
|
117
|
+
export declare function isPermanentError(error: Error): boolean;
|
|
118
|
+
/**
|
|
119
|
+
* Default retry predicate
|
|
120
|
+
*/
|
|
121
|
+
export declare function defaultShouldRetry(error: Error, attempt: number): boolean;
|