@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.
Files changed (154) hide show
  1. package/DEBUG_LOGGING.md +60 -0
  2. package/LICENSE +21 -0
  3. package/MIGRATION_PLAN.md +52 -0
  4. package/README.md +220 -0
  5. package/SDK_IMPLEMENTATION_GUIDE.md +1036 -0
  6. package/bin/northflare-runner +367 -0
  7. package/coverage/base.css +224 -0
  8. package/coverage/block-navigation.js +87 -0
  9. package/coverage/coverage-final.json +12 -0
  10. package/coverage/favicon.png +0 -0
  11. package/coverage/index.html +176 -0
  12. package/coverage/lib/index.html +116 -0
  13. package/coverage/lib/preload-script.js.html +964 -0
  14. package/coverage/prettify.css +1 -0
  15. package/coverage/prettify.js +2 -0
  16. package/coverage/sort-arrow-sprite.png +0 -0
  17. package/coverage/sorter.js +196 -0
  18. package/coverage/src/collections/index.html +116 -0
  19. package/coverage/src/collections/runner-messages.ts.html +312 -0
  20. package/coverage/src/components/claude-manager.ts.html +1290 -0
  21. package/coverage/src/components/index.html +146 -0
  22. package/coverage/src/components/message-handler.ts.html +730 -0
  23. package/coverage/src/components/repository-manager.ts.html +841 -0
  24. package/coverage/src/index.html +131 -0
  25. package/coverage/src/index.ts.html +448 -0
  26. package/coverage/src/runner.ts.html +1239 -0
  27. package/coverage/src/utils/config.ts.html +780 -0
  28. package/coverage/src/utils/console.ts.html +121 -0
  29. package/coverage/src/utils/index.html +161 -0
  30. package/coverage/src/utils/logger.ts.html +475 -0
  31. package/coverage/src/utils/status-line.ts.html +445 -0
  32. package/dist/collections/runner-messages.d.ts +52 -0
  33. package/dist/collections/runner-messages.d.ts.map +1 -0
  34. package/dist/collections/runner-messages.js +161 -0
  35. package/dist/collections/runner-messages.js.map +1 -0
  36. package/dist/components/claude-manager.d.ts +39 -0
  37. package/dist/components/claude-manager.d.ts.map +1 -0
  38. package/dist/components/claude-manager.js +783 -0
  39. package/dist/components/claude-manager.js.map +1 -0
  40. package/dist/components/claude-sdk-manager.d.ts +47 -0
  41. package/dist/components/claude-sdk-manager.d.ts.map +1 -0
  42. package/dist/components/claude-sdk-manager.js +1088 -0
  43. package/dist/components/claude-sdk-manager.js.map +1 -0
  44. package/dist/components/enhanced-repository-manager.d.ts +134 -0
  45. package/dist/components/enhanced-repository-manager.d.ts.map +1 -0
  46. package/dist/components/enhanced-repository-manager.js +602 -0
  47. package/dist/components/enhanced-repository-manager.js.map +1 -0
  48. package/dist/components/message-handler-sse.d.ts +46 -0
  49. package/dist/components/message-handler-sse.d.ts.map +1 -0
  50. package/dist/components/message-handler-sse.js +734 -0
  51. package/dist/components/message-handler-sse.js.map +1 -0
  52. package/dist/components/message-handler.d.ts +35 -0
  53. package/dist/components/message-handler.d.ts.map +1 -0
  54. package/dist/components/message-handler.js +689 -0
  55. package/dist/components/message-handler.js.map +1 -0
  56. package/dist/components/repository-manager.d.ts +51 -0
  57. package/dist/components/repository-manager.d.ts.map +1 -0
  58. package/dist/components/repository-manager.js +295 -0
  59. package/dist/components/repository-manager.js.map +1 -0
  60. package/dist/index.d.ts +9 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +166 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/runner-sse.d.ts +57 -0
  65. package/dist/runner-sse.d.ts.map +1 -0
  66. package/dist/runner-sse.js +698 -0
  67. package/dist/runner-sse.js.map +1 -0
  68. package/dist/runner.d.ts +51 -0
  69. package/dist/runner.d.ts.map +1 -0
  70. package/dist/runner.js +530 -0
  71. package/dist/runner.js.map +1 -0
  72. package/dist/services/RunnerAPIClient.d.ts +30 -0
  73. package/dist/services/RunnerAPIClient.d.ts.map +1 -0
  74. package/dist/services/RunnerAPIClient.js +112 -0
  75. package/dist/services/RunnerAPIClient.js.map +1 -0
  76. package/dist/services/SSEClient.d.ts +60 -0
  77. package/dist/services/SSEClient.d.ts.map +1 -0
  78. package/dist/services/SSEClient.js +204 -0
  79. package/dist/services/SSEClient.js.map +1 -0
  80. package/dist/types/claude.d.ts +45 -0
  81. package/dist/types/claude.d.ts.map +1 -0
  82. package/dist/types/claude.js +6 -0
  83. package/dist/types/claude.js.map +1 -0
  84. package/dist/types/index.d.ts +47 -0
  85. package/dist/types/index.d.ts.map +1 -0
  86. package/dist/types/index.js +23 -0
  87. package/dist/types/index.js.map +1 -0
  88. package/dist/types/messages.d.ts +31 -0
  89. package/dist/types/messages.d.ts.map +1 -0
  90. package/dist/types/messages.js +6 -0
  91. package/dist/types/messages.js.map +1 -0
  92. package/dist/types/runner-interface.d.ts +24 -0
  93. package/dist/types/runner-interface.d.ts.map +1 -0
  94. package/dist/types/runner-interface.js +6 -0
  95. package/dist/types/runner-interface.js.map +1 -0
  96. package/dist/utils/StateManager.d.ts +52 -0
  97. package/dist/utils/StateManager.d.ts.map +1 -0
  98. package/dist/utils/StateManager.js +162 -0
  99. package/dist/utils/StateManager.js.map +1 -0
  100. package/dist/utils/config.d.ts +41 -0
  101. package/dist/utils/config.d.ts.map +1 -0
  102. package/dist/utils/config.js +250 -0
  103. package/dist/utils/config.js.map +1 -0
  104. package/dist/utils/console.d.ts +11 -0
  105. package/dist/utils/console.d.ts.map +1 -0
  106. package/dist/utils/console.js +15 -0
  107. package/dist/utils/console.js.map +1 -0
  108. package/dist/utils/expand-env.d.ts +2 -0
  109. package/dist/utils/expand-env.d.ts.map +1 -0
  110. package/dist/utils/expand-env.js +20 -0
  111. package/dist/utils/expand-env.js.map +1 -0
  112. package/dist/utils/logger.d.ts +9 -0
  113. package/dist/utils/logger.d.ts.map +1 -0
  114. package/dist/utils/logger.js +108 -0
  115. package/dist/utils/logger.js.map +1 -0
  116. package/dist/utils/status-line.d.ts +37 -0
  117. package/dist/utils/status-line.d.ts.map +1 -0
  118. package/dist/utils/status-line.js +113 -0
  119. package/dist/utils/status-line.js.map +1 -0
  120. package/docs/claude-manager.md +91 -0
  121. package/exceptions.log +22 -0
  122. package/lib/preload-script.js +293 -0
  123. package/package.json +55 -0
  124. package/rejections.log +63 -0
  125. package/runner.log +488 -0
  126. package/src/components/claude-sdk-manager.ts +1354 -0
  127. package/src/components/enhanced-repository-manager.ts +823 -0
  128. package/src/components/message-handler-sse.ts +1011 -0
  129. package/src/components/repository-manager.ts +337 -0
  130. package/src/index.ts +166 -0
  131. package/src/runner-sse.ts +847 -0
  132. package/src/services/RunnerAPIClient.ts +135 -0
  133. package/src/services/SSEClient.ts +258 -0
  134. package/src/types/claude.ts +55 -0
  135. package/src/types/computer-name.d.ts +4 -0
  136. package/src/types/index.ts +63 -0
  137. package/src/types/messages.ts +39 -0
  138. package/src/types/runner-interface.ts +34 -0
  139. package/src/utils/StateManager.ts +187 -0
  140. package/src/utils/codex-sdk.js +448 -0
  141. package/src/utils/config.ts +315 -0
  142. package/src/utils/console.ts +13 -0
  143. package/src/utils/expand-env.ts +22 -0
  144. package/src/utils/logger.ts +131 -0
  145. package/src/utils/sdk-demo.js +34 -0
  146. package/src/utils/status-line.ts +121 -0
  147. package/test-debug.sh +26 -0
  148. package/tests/retry-strategies.test.ts +410 -0
  149. package/tests/sdk-integration.test.ts +329 -0
  150. package/tests/sdk-streaming.test.ts +1180 -0
  151. package/tests/setup.ts +5 -0
  152. package/tests/test-claude-manager.ts +120 -0
  153. package/tsconfig.json +36 -0
  154. 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":";AAAA;;;;;;;GAOG;;;AAEH,MAAa,iBAAiB;IACpB,UAAU,CAAkB;IAC5B,WAAW,GAAW,CAAC,CAAC;IACxB,QAAQ,GAAW,EAAE,CAAC;IACtB,SAAS,GAAY,IAAI,CAAC;IAElC;QACE,iDAAiD;QACjD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,KAAa;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,KAAK,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,KAAK,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAEzB,qDAAqD;QACrD,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;QACD,wCAAwC;aACnC,IAAI,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,aAAa;QACnB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAE/C,kCAAkC;QAClC,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,oCAAoC;QACpC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,iBAAiB,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;QAEjF,yCAAyC;QACzC,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,UAAU,EAAE,CAAC;YAElB,+BAA+B;YAC/B,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;gBACjC,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,mBAAmB;QAChC,CAAC,EAAE,iBAAiB,CAAC,CAAC;IACxB,CAAC;IAED;;OAEG;IACK,YAAY;QAClB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC9B,CAAC;QAED,iCAAiC;QACjC,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED;;OAEG;IACK,UAAU;QAChB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAE5B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,eAAe;QAE/D,IAAI,OAAe,CAAC;QACpB,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,GAAG,iCAAiC,CAAC;QAC9C,CAAC;aAAM,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,GAAG,GAAG,OAAO,+BAA+B,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,GAAG,OAAO,IAAI,IAAI,CAAC,WAAW,+BAA+B,CAAC;QAC1E,CAAC;QAED,gDAAgD;QAChD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,iDAAiD;YACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,yBAAyB;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QACvE,CAAC;QAED,uCAAuC;QACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,2DAA2D;QAC3D,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;CACF;AA5GD,8CA4GC;AAED,qBAAqB;AACR,QAAA,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC"}
@@ -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