@northflare/runner 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DEBUG_LOGGING.md +60 -0
- package/LICENSE +21 -0
- package/MIGRATION_PLAN.md +52 -0
- package/README.md +220 -0
- package/SDK_IMPLEMENTATION_GUIDE.md +1036 -0
- package/bin/northflare-runner +367 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/coverage-final.json +12 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +176 -0
- package/coverage/lib/index.html +116 -0
- package/coverage/lib/preload-script.js.html +964 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +196 -0
- package/coverage/src/collections/index.html +116 -0
- package/coverage/src/collections/runner-messages.ts.html +312 -0
- package/coverage/src/components/claude-manager.ts.html +1290 -0
- package/coverage/src/components/index.html +146 -0
- package/coverage/src/components/message-handler.ts.html +730 -0
- package/coverage/src/components/repository-manager.ts.html +841 -0
- package/coverage/src/index.html +131 -0
- package/coverage/src/index.ts.html +448 -0
- package/coverage/src/runner.ts.html +1239 -0
- package/coverage/src/utils/config.ts.html +780 -0
- package/coverage/src/utils/console.ts.html +121 -0
- package/coverage/src/utils/index.html +161 -0
- package/coverage/src/utils/logger.ts.html +475 -0
- package/coverage/src/utils/status-line.ts.html +445 -0
- package/dist/collections/runner-messages.d.ts +52 -0
- package/dist/collections/runner-messages.d.ts.map +1 -0
- package/dist/collections/runner-messages.js +161 -0
- package/dist/collections/runner-messages.js.map +1 -0
- package/dist/components/claude-manager.d.ts +39 -0
- package/dist/components/claude-manager.d.ts.map +1 -0
- package/dist/components/claude-manager.js +783 -0
- package/dist/components/claude-manager.js.map +1 -0
- package/dist/components/claude-sdk-manager.d.ts +47 -0
- package/dist/components/claude-sdk-manager.d.ts.map +1 -0
- package/dist/components/claude-sdk-manager.js +1088 -0
- package/dist/components/claude-sdk-manager.js.map +1 -0
- package/dist/components/enhanced-repository-manager.d.ts +134 -0
- package/dist/components/enhanced-repository-manager.d.ts.map +1 -0
- package/dist/components/enhanced-repository-manager.js +602 -0
- package/dist/components/enhanced-repository-manager.js.map +1 -0
- package/dist/components/message-handler-sse.d.ts +46 -0
- package/dist/components/message-handler-sse.d.ts.map +1 -0
- package/dist/components/message-handler-sse.js +734 -0
- package/dist/components/message-handler-sse.js.map +1 -0
- package/dist/components/message-handler.d.ts +35 -0
- package/dist/components/message-handler.d.ts.map +1 -0
- package/dist/components/message-handler.js +689 -0
- package/dist/components/message-handler.js.map +1 -0
- package/dist/components/repository-manager.d.ts +51 -0
- package/dist/components/repository-manager.d.ts.map +1 -0
- package/dist/components/repository-manager.js +295 -0
- package/dist/components/repository-manager.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +166 -0
- package/dist/index.js.map +1 -0
- package/dist/runner-sse.d.ts +57 -0
- package/dist/runner-sse.d.ts.map +1 -0
- package/dist/runner-sse.js +698 -0
- package/dist/runner-sse.js.map +1 -0
- package/dist/runner.d.ts +51 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +530 -0
- package/dist/runner.js.map +1 -0
- package/dist/services/RunnerAPIClient.d.ts +30 -0
- package/dist/services/RunnerAPIClient.d.ts.map +1 -0
- package/dist/services/RunnerAPIClient.js +112 -0
- package/dist/services/RunnerAPIClient.js.map +1 -0
- package/dist/services/SSEClient.d.ts +60 -0
- package/dist/services/SSEClient.d.ts.map +1 -0
- package/dist/services/SSEClient.js +204 -0
- package/dist/services/SSEClient.js.map +1 -0
- package/dist/types/claude.d.ts +45 -0
- package/dist/types/claude.d.ts.map +1 -0
- package/dist/types/claude.js +6 -0
- package/dist/types/claude.js.map +1 -0
- package/dist/types/index.d.ts +47 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +23 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/messages.d.ts +31 -0
- package/dist/types/messages.d.ts.map +1 -0
- package/dist/types/messages.js +6 -0
- package/dist/types/messages.js.map +1 -0
- package/dist/types/runner-interface.d.ts +24 -0
- package/dist/types/runner-interface.d.ts.map +1 -0
- package/dist/types/runner-interface.js +6 -0
- package/dist/types/runner-interface.js.map +1 -0
- package/dist/utils/StateManager.d.ts +52 -0
- package/dist/utils/StateManager.d.ts.map +1 -0
- package/dist/utils/StateManager.js +162 -0
- package/dist/utils/StateManager.js.map +1 -0
- package/dist/utils/config.d.ts +41 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +250 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/console.d.ts +11 -0
- package/dist/utils/console.d.ts.map +1 -0
- package/dist/utils/console.js +15 -0
- package/dist/utils/console.js.map +1 -0
- package/dist/utils/expand-env.d.ts +2 -0
- package/dist/utils/expand-env.d.ts.map +1 -0
- package/dist/utils/expand-env.js +20 -0
- package/dist/utils/expand-env.js.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +108 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/status-line.d.ts +37 -0
- package/dist/utils/status-line.d.ts.map +1 -0
- package/dist/utils/status-line.js +113 -0
- package/dist/utils/status-line.js.map +1 -0
- package/docs/claude-manager.md +91 -0
- package/exceptions.log +22 -0
- package/lib/preload-script.js +293 -0
- package/package.json +55 -0
- package/rejections.log +63 -0
- package/runner.log +488 -0
- package/src/components/claude-sdk-manager.ts +1354 -0
- package/src/components/enhanced-repository-manager.ts +823 -0
- package/src/components/message-handler-sse.ts +1011 -0
- package/src/components/repository-manager.ts +337 -0
- package/src/index.ts +166 -0
- package/src/runner-sse.ts +847 -0
- package/src/services/RunnerAPIClient.ts +135 -0
- package/src/services/SSEClient.ts +258 -0
- package/src/types/claude.ts +55 -0
- package/src/types/computer-name.d.ts +4 -0
- package/src/types/index.ts +63 -0
- package/src/types/messages.ts +39 -0
- package/src/types/runner-interface.ts +34 -0
- package/src/utils/StateManager.ts +187 -0
- package/src/utils/codex-sdk.js +448 -0
- package/src/utils/config.ts +315 -0
- package/src/utils/console.ts +13 -0
- package/src/utils/expand-env.ts +22 -0
- package/src/utils/logger.ts +131 -0
- package/src/utils/sdk-demo.js +34 -0
- package/src/utils/status-line.ts +121 -0
- package/test-debug.sh +26 -0
- package/tests/retry-strategies.test.ts +410 -0
- package/tests/sdk-integration.test.ts +329 -0
- package/tests/sdk-streaming.test.ts +1180 -0
- package/tests/setup.ts +5 -0
- package/tests/test-claude-manager.ts +120 -0
- package/tsconfig.json +36 -0
- package/vitest.config.ts +27 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand-env.js","sourceRoot":"","sources":["../../src/utils/expand-env.ts"],"names":[],"mappings":";;AAAA,8BAqBC;AArBD,SAAgB,SAAS,CACvB,GAAQ,EACR,MAA0C,OAAO,CAAC,GAAG;IAErD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,MAAM,GAAwB,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger configuration using Winston
|
|
3
|
+
*/
|
|
4
|
+
import winston from "winston";
|
|
5
|
+
export declare const logger: winston.Logger;
|
|
6
|
+
export declare function configureFileLogging(logDir: string): void;
|
|
7
|
+
export declare function createLogger(component: string): winston.Logger;
|
|
8
|
+
export default logger;
|
|
9
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAwD9B,eAAO,MAAM,MAAM,gBAUjB,CAAC;AAGH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAkCzD;AAGD,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAE9D;AAkBD,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Logger configuration using Winston
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.logger = void 0;
|
|
10
|
+
exports.configureFileLogging = configureFileLogging;
|
|
11
|
+
exports.createLogger = createLogger;
|
|
12
|
+
const winston_1 = __importDefault(require("winston"));
|
|
13
|
+
const path_1 = __importDefault(require("path"));
|
|
14
|
+
// Custom log levels
|
|
15
|
+
const levels = {
|
|
16
|
+
error: 0,
|
|
17
|
+
warn: 1,
|
|
18
|
+
info: 2,
|
|
19
|
+
http: 3,
|
|
20
|
+
verbose: 4,
|
|
21
|
+
debug: 5,
|
|
22
|
+
silly: 6,
|
|
23
|
+
};
|
|
24
|
+
// Log colors
|
|
25
|
+
const colors = {
|
|
26
|
+
error: "red",
|
|
27
|
+
warn: "yellow",
|
|
28
|
+
info: "green",
|
|
29
|
+
http: "magenta",
|
|
30
|
+
verbose: "cyan",
|
|
31
|
+
debug: "blue",
|
|
32
|
+
silly: "gray",
|
|
33
|
+
};
|
|
34
|
+
winston_1.default.addColors(colors);
|
|
35
|
+
// Format for console output
|
|
36
|
+
const consoleFormat = winston_1.default.format.combine(winston_1.default.format.colorize({ all: true }), winston_1.default.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), winston_1.default.format.printf(({ timestamp, level, message, stack, ...metadata }) => {
|
|
37
|
+
let msg = `${timestamp} [${level}]: ${message}`;
|
|
38
|
+
// Only show stack traces and metadata in debug mode
|
|
39
|
+
if (process.env["DEBUG"] === "true") {
|
|
40
|
+
if (stack) {
|
|
41
|
+
msg += `\n${stack}`;
|
|
42
|
+
}
|
|
43
|
+
const filteredMetadata = { ...metadata };
|
|
44
|
+
delete filteredMetadata["component"]; // Keep component info
|
|
45
|
+
if (Object.keys(filteredMetadata).length > 0) {
|
|
46
|
+
msg += ` ${JSON.stringify(filteredMetadata)}`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return msg;
|
|
50
|
+
}));
|
|
51
|
+
// Format for file output
|
|
52
|
+
const fileFormat = winston_1.default.format.combine(winston_1.default.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), winston_1.default.format.errors({ stack: true }), winston_1.default.format.json());
|
|
53
|
+
// Create logger instance
|
|
54
|
+
exports.logger = winston_1.default.createLogger({
|
|
55
|
+
level: process.env["DEBUG"] === "true" ? "debug" : "info",
|
|
56
|
+
levels,
|
|
57
|
+
transports: [
|
|
58
|
+
// Always include console transport for errors
|
|
59
|
+
new winston_1.default.transports.Console({
|
|
60
|
+
format: consoleFormat,
|
|
61
|
+
level: process.env["DEBUG"] === "true" ? "debug" : "error",
|
|
62
|
+
}),
|
|
63
|
+
],
|
|
64
|
+
});
|
|
65
|
+
// Add file transports if log directory is configured
|
|
66
|
+
function configureFileLogging(logDir) {
|
|
67
|
+
// Error log file
|
|
68
|
+
exports.logger.add(new winston_1.default.transports.File({
|
|
69
|
+
filename: path_1.default.join(logDir, "error.log"),
|
|
70
|
+
level: "error",
|
|
71
|
+
format: fileFormat,
|
|
72
|
+
maxsize: 10 * 1024 * 1024, // 10MB
|
|
73
|
+
maxFiles: 5,
|
|
74
|
+
}));
|
|
75
|
+
// Combined log file
|
|
76
|
+
exports.logger.add(new winston_1.default.transports.File({
|
|
77
|
+
filename: path_1.default.join(logDir, "combined.log"),
|
|
78
|
+
format: fileFormat,
|
|
79
|
+
maxsize: 50 * 1024 * 1024, // 50MB
|
|
80
|
+
maxFiles: 10,
|
|
81
|
+
}));
|
|
82
|
+
// Debug log file (only in debug mode)
|
|
83
|
+
if (process.env["DEBUG"] === "true") {
|
|
84
|
+
exports.logger.add(new winston_1.default.transports.File({
|
|
85
|
+
filename: path_1.default.join(logDir, "debug.log"),
|
|
86
|
+
level: "debug",
|
|
87
|
+
format: fileFormat,
|
|
88
|
+
maxsize: 100 * 1024 * 1024, // 100MB
|
|
89
|
+
maxFiles: 3,
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Create child logger for specific components
|
|
94
|
+
function createLogger(component) {
|
|
95
|
+
return exports.logger.child({ component });
|
|
96
|
+
}
|
|
97
|
+
// Log unhandled errors
|
|
98
|
+
exports.logger.exceptions.handle(new winston_1.default.transports.File({
|
|
99
|
+
filename: "exceptions.log",
|
|
100
|
+
format: fileFormat,
|
|
101
|
+
}));
|
|
102
|
+
exports.logger.rejections.handle(new winston_1.default.transports.File({
|
|
103
|
+
filename: "rejections.log",
|
|
104
|
+
format: fileFormat,
|
|
105
|
+
}));
|
|
106
|
+
// Export default logger
|
|
107
|
+
exports.default = exports.logger;
|
|
108
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StatusLineManager - Manages persistent status line output for active Claude Code processes
|
|
3
|
+
*
|
|
4
|
+
* This component maintains a single-line status output that updates every minute to show
|
|
5
|
+
* the count of active Claude Code processes. It prevents the machine from entering idle
|
|
6
|
+
* state while processes are running and provides clear visual feedback without cluttering
|
|
7
|
+
* the terminal with multiple log lines.
|
|
8
|
+
*/
|
|
9
|
+
export declare class StatusLineManager {
|
|
10
|
+
private intervalId?;
|
|
11
|
+
private activeCount;
|
|
12
|
+
private lastLine;
|
|
13
|
+
private isEnabled;
|
|
14
|
+
constructor();
|
|
15
|
+
/**
|
|
16
|
+
* Updates the count of active conversations
|
|
17
|
+
*/
|
|
18
|
+
updateActiveCount(count: number): void;
|
|
19
|
+
/**
|
|
20
|
+
* Starts the status line interval
|
|
21
|
+
*/
|
|
22
|
+
private startInterval;
|
|
23
|
+
/**
|
|
24
|
+
* Stops the status line interval
|
|
25
|
+
*/
|
|
26
|
+
private stopInterval;
|
|
27
|
+
/**
|
|
28
|
+
* Shows the current status
|
|
29
|
+
*/
|
|
30
|
+
private showStatus;
|
|
31
|
+
/**
|
|
32
|
+
* Cleans up the status line manager
|
|
33
|
+
*/
|
|
34
|
+
dispose(): void;
|
|
35
|
+
}
|
|
36
|
+
export declare const statusLineManager: StatusLineManager;
|
|
37
|
+
//# sourceMappingURL=status-line.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-line.d.ts","sourceRoot":"","sources":["../../src/utils/status-line.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAAC,CAAiB;IACpC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,SAAS,CAAiB;;IAOlC;;OAEG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAetC;;OAEG;IACH,OAAO,CAAC,aAAa;IAqBrB;;OAEG;IACH,OAAO,CAAC,YAAY;IAUpB;;OAEG;IACH,OAAO,CAAC,UAAU;IA6BlB;;OAEG;IACH,OAAO,IAAI,IAAI;CAOhB;AAGD,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* StatusLineManager - Manages persistent status line output for active Claude Code processes
|
|
4
|
+
*
|
|
5
|
+
* This component maintains a single-line status output that updates every minute to show
|
|
6
|
+
* the count of active Claude Code processes. It prevents the machine from entering idle
|
|
7
|
+
* state while processes are running and provides clear visual feedback without cluttering
|
|
8
|
+
* the terminal with multiple log lines.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.statusLineManager = exports.StatusLineManager = void 0;
|
|
12
|
+
class StatusLineManager {
|
|
13
|
+
intervalId;
|
|
14
|
+
activeCount = 0;
|
|
15
|
+
lastLine = "";
|
|
16
|
+
isEnabled = true;
|
|
17
|
+
constructor() {
|
|
18
|
+
// Only enable status line when not in debug mode
|
|
19
|
+
this.isEnabled = process.env["DEBUG"] !== "true";
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Updates the count of active conversations
|
|
23
|
+
*/
|
|
24
|
+
updateActiveCount(count) {
|
|
25
|
+
const wasZero = this.activeCount === 0;
|
|
26
|
+
const isZero = count === 0;
|
|
27
|
+
this.activeCount = count;
|
|
28
|
+
// Start interval when transitioning from 0 to active
|
|
29
|
+
if (wasZero && !isZero) {
|
|
30
|
+
this.startInterval();
|
|
31
|
+
}
|
|
32
|
+
// Stop interval when transitioning to 0
|
|
33
|
+
else if (!wasZero && isZero) {
|
|
34
|
+
this.stopInterval();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Starts the status line interval
|
|
39
|
+
*/
|
|
40
|
+
startInterval() {
|
|
41
|
+
if (!this.isEnabled || this.intervalId)
|
|
42
|
+
return;
|
|
43
|
+
// Show initial status immediately
|
|
44
|
+
this.showStatus();
|
|
45
|
+
// Update every minute on the minute
|
|
46
|
+
const now = new Date();
|
|
47
|
+
const msUntilNextMinute = (60 - now.getSeconds()) * 1000 - now.getMilliseconds();
|
|
48
|
+
// First timeout to align with the minute
|
|
49
|
+
setTimeout(() => {
|
|
50
|
+
this.showStatus();
|
|
51
|
+
// Then set up regular interval
|
|
52
|
+
this.intervalId = setInterval(() => {
|
|
53
|
+
this.showStatus();
|
|
54
|
+
}, 60000); // Every 60 seconds
|
|
55
|
+
}, msUntilNextMinute);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Stops the status line interval
|
|
59
|
+
*/
|
|
60
|
+
stopInterval() {
|
|
61
|
+
if (this.intervalId) {
|
|
62
|
+
clearInterval(this.intervalId);
|
|
63
|
+
this.intervalId = undefined;
|
|
64
|
+
}
|
|
65
|
+
// Show final "No active" message
|
|
66
|
+
this.showStatus();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Shows the current status
|
|
70
|
+
*/
|
|
71
|
+
showStatus() {
|
|
72
|
+
if (!this.isEnabled)
|
|
73
|
+
return;
|
|
74
|
+
const now = new Date();
|
|
75
|
+
const timeStr = now.toTimeString().slice(0, 5); // HH:MM format
|
|
76
|
+
let newLine;
|
|
77
|
+
if (this.activeCount === 0) {
|
|
78
|
+
newLine = "No active Claude Code processes";
|
|
79
|
+
}
|
|
80
|
+
else if (this.activeCount === 1) {
|
|
81
|
+
newLine = `${timeStr} 1 active Claude Code process`;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
newLine = `${timeStr} ${this.activeCount} active Claude Code processes`;
|
|
85
|
+
}
|
|
86
|
+
// If this is the first status line, position it
|
|
87
|
+
if (!this.lastLine) {
|
|
88
|
+
// Move to start of line and save cursor position
|
|
89
|
+
process.stdout.write('\r');
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// Clear the current line
|
|
93
|
+
process.stdout.write('\r' + ' '.repeat(this.lastLine.length) + '\r');
|
|
94
|
+
}
|
|
95
|
+
// Write the new status without newline
|
|
96
|
+
process.stdout.write(newLine);
|
|
97
|
+
this.lastLine = newLine;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Cleans up the status line manager
|
|
101
|
+
*/
|
|
102
|
+
dispose() {
|
|
103
|
+
this.stopInterval();
|
|
104
|
+
// Add a newline to ensure next output starts on a new line
|
|
105
|
+
if (this.lastLine) {
|
|
106
|
+
process.stdout.write('\n');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
exports.StatusLineManager = StatusLineManager;
|
|
111
|
+
// Singleton instance
|
|
112
|
+
exports.statusLineManager = new StatusLineManager();
|
|
113
|
+
//# sourceMappingURL=status-line.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-line.js","sourceRoot":"","sources":["../../src/utils/status-line.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# ClaudeManager Implementation
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The `ClaudeManager` class is responsible for managing Claude conversations using the `claude-code-sdk-ts`. It provides stateful conversation lifecycle management, with conversations indexed by `taskId` for efficient routing and management.
|
|
6
|
+
|
|
7
|
+
## Key Features
|
|
8
|
+
|
|
9
|
+
### 1. Stateful Conversation Management
|
|
10
|
+
|
|
11
|
+
- Maintains persistent `Conversation` objects indexed by `taskId`
|
|
12
|
+
- Each task has its own conversation instance that lives for the entire task lifetime
|
|
13
|
+
- Supports starting, stopping, resuming, and sending messages to conversations
|
|
14
|
+
|
|
15
|
+
### 2. Session ID Handling
|
|
16
|
+
|
|
17
|
+
- Automatically captures session IDs from the Claude SDK via callbacks
|
|
18
|
+
- Notifies the orchestrator when session IDs change
|
|
19
|
+
- Uses `taskId` as the primary key, not `sessionId`
|
|
20
|
+
|
|
21
|
+
### 3. MCP Server Configuration
|
|
22
|
+
|
|
23
|
+
- Accepts MCP server configurations from the orchestrator
|
|
24
|
+
- Passes configurations directly to the Claude SDK without modification
|
|
25
|
+
- Runner does not define its own MCP tools
|
|
26
|
+
|
|
27
|
+
### 4. GitHub Token Integration
|
|
28
|
+
|
|
29
|
+
- Fetches GitHub tokens from the orchestrator API endpoint
|
|
30
|
+
- Automatically includes tokens in the Claude environment configuration
|
|
31
|
+
- Handles token fetch failures gracefully
|
|
32
|
+
|
|
33
|
+
### 5. Error Handling
|
|
34
|
+
|
|
35
|
+
- Monitors process exits via the SDK's `onProcessComplete` callback
|
|
36
|
+
- Reports errors to the orchestrator with detailed classification
|
|
37
|
+
- Continues conversation on error (no automatic cleanup)
|
|
38
|
+
|
|
39
|
+
## Architecture
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
class ClaudeManager {
|
|
43
|
+
// Core responsibilities:
|
|
44
|
+
// 1. Create and manage Claude conversation instances
|
|
45
|
+
// 2. Handle session lifecycle events
|
|
46
|
+
// 3. Route messages to active conversations
|
|
47
|
+
// 4. Integrate with repository manager for workspace paths
|
|
48
|
+
// 5. Fetch authentication tokens from orchestrator
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Usage
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
// Start a conversation
|
|
56
|
+
await claudeManager.startConversation(taskId, config, initialMessages);
|
|
57
|
+
|
|
58
|
+
// Send a message to an active conversation
|
|
59
|
+
await claudeManager.sendUserMessage(taskId, sessionId, content);
|
|
60
|
+
|
|
61
|
+
// Resume an existing conversation
|
|
62
|
+
await claudeManager.resumeConversation(taskId, sessionId, config);
|
|
63
|
+
|
|
64
|
+
// Stop a conversation
|
|
65
|
+
await claudeManager.stopConversation(taskId, sessionId);
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Error Types
|
|
69
|
+
|
|
70
|
+
The ClaudeManager classifies errors into the following types:
|
|
71
|
+
|
|
72
|
+
- `process_exit`: Claude process exited unexpectedly
|
|
73
|
+
- `model_error`: Model-related errors
|
|
74
|
+
- `tool_error`: Tool execution errors
|
|
75
|
+
- `permission_error`: Permission-related errors
|
|
76
|
+
- `timeout_error`: Operation timeouts
|
|
77
|
+
- `unknown_error`: Unclassified errors
|
|
78
|
+
|
|
79
|
+
## Integration Points
|
|
80
|
+
|
|
81
|
+
1. **RunnerApp**: Accesses configuration and sends notifications
|
|
82
|
+
2. **RepositoryManager**: Gets workspace paths and manages Git checkouts
|
|
83
|
+
3. **Orchestrator API**: Fetches GitHub tokens and sends notifications
|
|
84
|
+
4. **Claude SDK**: Creates and manages conversation instances
|
|
85
|
+
|
|
86
|
+
## Environment Requirements
|
|
87
|
+
|
|
88
|
+
- `ANTHROPIC_API_KEY`: Required for Claude API access
|
|
89
|
+
- `NORTHFLARE_RUNNER_TOKEN`: Required for orchestrator API authentication
|
|
90
|
+
- `NORTHFLARE_WORKSPACE_DIR`: Base directory for Git checkouts
|
|
91
|
+
- `DEBUG` (optional): Enable debug logging
|