@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,6 @@
1
+ "use strict";
2
+ /**
3
+ * JSONRPC message types for communication between runner and orchestrator
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/types/messages.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Interface for RunnerApp to ensure compatibility between different implementations
3
+ */
4
+ import { RunnerConfig, ConversationContext, JsonRpcMessage } from './index';
5
+ import { ClaudeManager } from '../components/claude-sdk-manager';
6
+ import { EnhancedRepositoryManager } from '../components/enhanced-repository-manager';
7
+ export interface IRunnerApp {
8
+ notify(method: string, params: any): Promise<void>;
9
+ sendToOrchestrator(message: JsonRpcMessage): Promise<any>;
10
+ getConversationContext(conversationId: string): ConversationContext | undefined;
11
+ get config_(): RunnerConfig;
12
+ get activeConversations_(): Map<string, ConversationContext>;
13
+ get claudeManager_(): ClaudeManager;
14
+ get repositoryManager_(): EnhancedRepositoryManager;
15
+ getRunnerId(): string | undefined;
16
+ getRunnerUid(): string | null;
17
+ getLastProcessedAt(): Date | null;
18
+ getIsActiveRunner(): boolean;
19
+ setIsActiveRunner(active: boolean): void;
20
+ setLastProcessedAt(timestamp: Date | null): void;
21
+ getPreHandoffConversations(): Set<string>;
22
+ updateLastProcessedAt?(timestamp: Date | null): Promise<void>;
23
+ }
24
+ //# sourceMappingURL=runner-interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-interface.d.ts","sourceRoot":"","sources":["../../src/types/runner-interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;AAEtF,MAAM,WAAW,UAAU;IAEzB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAG1D,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAAC;IAGhF,IAAI,OAAO,IAAI,YAAY,CAAC;IAC5B,IAAI,oBAAoB,IAAI,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC7D,IAAI,cAAc,IAAI,aAAa,CAAC;IACpC,IAAI,kBAAkB,IAAI,yBAAyB,CAAC;IAGpD,WAAW,IAAI,MAAM,GAAG,SAAS,CAAC;IAClC,YAAY,IAAI,MAAM,GAAG,IAAI,CAAC;IAC9B,kBAAkB,IAAI,IAAI,GAAG,IAAI,CAAC;IAClC,iBAAiB,IAAI,OAAO,CAAC;IAC7B,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACzC,kBAAkB,CAAC,SAAS,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACjD,0BAA0B,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAG1C,qBAAqB,CAAC,CAAC,SAAS,EAAE,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Interface for RunnerApp to ensure compatibility between different implementations
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=runner-interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-interface.js","sourceRoot":"","sources":["../../src/types/runner-interface.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * State Manager for persisting runner state
3
+ *
4
+ * Manages persistent state including lastProcessedAt timestamp
5
+ * to enable proper catch-up on restart.
6
+ */
7
+ export interface RunnerState {
8
+ runnerId: string;
9
+ runnerUid: string | null;
10
+ lastProcessedAt: string | null;
11
+ isActiveRunner: boolean;
12
+ updatedAt: string;
13
+ }
14
+ export declare class StateManager {
15
+ private statePath;
16
+ private state;
17
+ private saveTimer;
18
+ constructor(dataDir: string, runnerId: string);
19
+ /**
20
+ * Load state from disk
21
+ */
22
+ loadState(): Promise<RunnerState | null>;
23
+ /**
24
+ * Save state to disk
25
+ */
26
+ saveState(state: RunnerState): Promise<void>;
27
+ /**
28
+ * Update lastProcessedAt timestamp
29
+ */
30
+ updateLastProcessedAt(timestamp: Date | string): Promise<void>;
31
+ /**
32
+ * Update runner registration details
33
+ */
34
+ updateRunnerRegistration(runnerId: string, runnerUid: string | null, lastProcessedAt: Date | null): Promise<void>;
35
+ /**
36
+ * Update active runner status
37
+ */
38
+ updateActiveStatus(isActive: boolean): Promise<void>;
39
+ /**
40
+ * Get current state
41
+ */
42
+ getState(): RunnerState | null;
43
+ /**
44
+ * Get lastProcessedAt as Date
45
+ */
46
+ getLastProcessedAt(): Date | null;
47
+ /**
48
+ * Clear state (for testing or reset)
49
+ */
50
+ clearState(): Promise<void>;
51
+ }
52
+ //# sourceMappingURL=StateManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateManager.d.ts","sourceRoot":"","sources":["../../src/utils/StateManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,SAAS,CAA+B;gBAEpC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAM7C;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAqB9C;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAmClD;;OAEG;IACG,qBAAqB,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAepE;;OAEG;IACG,wBAAwB,CAC5B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,eAAe,EAAE,IAAI,GAAG,IAAI,GAC3B,OAAO,CAAC,IAAI,CAAC;IAmBhB;;OAEG;IACG,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAa1D;;OAEG;IACH,QAAQ,IAAI,WAAW,GAAG,IAAI;IAI9B;;OAEG;IACH,kBAAkB,IAAI,IAAI,GAAG,IAAI;IAOjC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAYlC"}
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ /**
3
+ * State Manager for persisting runner state
4
+ *
5
+ * Manages persistent state including lastProcessedAt timestamp
6
+ * to enable proper catch-up on restart.
7
+ */
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.StateManager = void 0;
13
+ const promises_1 = __importDefault(require("fs/promises"));
14
+ const path_1 = __importDefault(require("path"));
15
+ const logger_1 = require("./logger");
16
+ const logger = (0, logger_1.createLogger)('StateManager');
17
+ class StateManager {
18
+ statePath;
19
+ state = null;
20
+ saveTimer = null;
21
+ constructor(dataDir, runnerId) {
22
+ // Namespace state file by runnerId (stable external ID) to separate different users
23
+ const stateFile = `runner-state-${runnerId}.json`;
24
+ this.statePath = path_1.default.join(dataDir, stateFile);
25
+ }
26
+ /**
27
+ * Load state from disk
28
+ */
29
+ async loadState() {
30
+ try {
31
+ const content = await promises_1.default.readFile(this.statePath, 'utf-8');
32
+ this.state = JSON.parse(content);
33
+ logger.info('Loaded runner state', {
34
+ runnerId: this.state?.runnerId,
35
+ runnerUid: this.state?.runnerUid,
36
+ lastProcessedAt: this.state?.lastProcessedAt,
37
+ isActiveRunner: this.state?.isActiveRunner,
38
+ });
39
+ return this.state;
40
+ }
41
+ catch (error) {
42
+ if (error.code === 'ENOENT') {
43
+ logger.debug('No state file found, starting fresh');
44
+ return null;
45
+ }
46
+ logger.error('Failed to load state file:', error);
47
+ return null;
48
+ }
49
+ }
50
+ /**
51
+ * Save state to disk
52
+ */
53
+ async saveState(state) {
54
+ this.state = state;
55
+ // Cancel any pending save
56
+ if (this.saveTimer) {
57
+ clearTimeout(this.saveTimer);
58
+ }
59
+ // Debounce saves to avoid excessive disk writes
60
+ this.saveTimer = setTimeout(async () => {
61
+ try {
62
+ // Ensure directory exists
63
+ const dir = path_1.default.dirname(this.statePath);
64
+ await promises_1.default.mkdir(dir, { recursive: true });
65
+ // Update timestamp
66
+ state.updatedAt = new Date().toISOString();
67
+ // Write atomically by writing to temp file first
68
+ const tempPath = `${this.statePath}.tmp`;
69
+ await promises_1.default.writeFile(tempPath, JSON.stringify(state, null, 2), 'utf-8');
70
+ await promises_1.default.rename(tempPath, this.statePath);
71
+ logger.debug('Saved runner state', {
72
+ runnerId: state.runnerId,
73
+ lastProcessedAt: state.lastProcessedAt,
74
+ isActiveRunner: state.isActiveRunner,
75
+ });
76
+ }
77
+ catch (error) {
78
+ logger.error('Failed to save state file:', error);
79
+ throw error;
80
+ }
81
+ }, 1000); // 1 second debounce
82
+ }
83
+ /**
84
+ * Update lastProcessedAt timestamp
85
+ */
86
+ async updateLastProcessedAt(timestamp) {
87
+ if (!this.state) {
88
+ throw new Error('State not loaded');
89
+ }
90
+ const isoString = timestamp instanceof Date ? timestamp.toISOString() : timestamp;
91
+ const updatedState = {
92
+ ...this.state,
93
+ lastProcessedAt: isoString,
94
+ };
95
+ await this.saveState(updatedState);
96
+ }
97
+ /**
98
+ * Update runner registration details
99
+ */
100
+ async updateRunnerRegistration(runnerId, runnerUid, lastProcessedAt) {
101
+ const state = this.state || {
102
+ runnerId: '',
103
+ runnerUid: null,
104
+ lastProcessedAt: null,
105
+ isActiveRunner: false,
106
+ updatedAt: new Date().toISOString(),
107
+ };
108
+ const updatedState = {
109
+ ...state,
110
+ runnerId,
111
+ runnerUid,
112
+ lastProcessedAt: lastProcessedAt ? lastProcessedAt.toISOString() : null,
113
+ };
114
+ await this.saveState(updatedState);
115
+ }
116
+ /**
117
+ * Update active runner status
118
+ */
119
+ async updateActiveStatus(isActive) {
120
+ if (!this.state) {
121
+ throw new Error('State not loaded');
122
+ }
123
+ const updatedState = {
124
+ ...this.state,
125
+ isActiveRunner: isActive,
126
+ };
127
+ await this.saveState(updatedState);
128
+ }
129
+ /**
130
+ * Get current state
131
+ */
132
+ getState() {
133
+ return this.state;
134
+ }
135
+ /**
136
+ * Get lastProcessedAt as Date
137
+ */
138
+ getLastProcessedAt() {
139
+ if (!this.state || !this.state.lastProcessedAt) {
140
+ return null;
141
+ }
142
+ return new Date(this.state.lastProcessedAt);
143
+ }
144
+ /**
145
+ * Clear state (for testing or reset)
146
+ */
147
+ async clearState() {
148
+ this.state = null;
149
+ try {
150
+ await promises_1.default.unlink(this.statePath);
151
+ logger.info('Cleared runner state');
152
+ }
153
+ catch (error) {
154
+ if (error.code !== 'ENOENT') {
155
+ logger.error('Failed to clear state file:', error);
156
+ throw error;
157
+ }
158
+ }
159
+ }
160
+ }
161
+ exports.StateManager = StateManager;
162
+ //# sourceMappingURL=StateManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateManager.js","sourceRoot":"","sources":["../../src/utils/StateManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Configuration management utilities
3
+ */
4
+ import { RunnerConfig, EnvironmentConfig } from "../types";
5
+ export declare class ConfigManager {
6
+ private static DEFAULT_CONFIG;
7
+ /**
8
+ * Load configuration without parsing command line arguments
9
+ * Used when arguments have already been parsed by the CLI
10
+ */
11
+ static loadConfig(configPath?: string): Promise<RunnerConfig>;
12
+ /**
13
+ * Parse command line arguments and load configuration
14
+ */
15
+ static parseArgsAndLoadConfig(argv: string[]): Promise<RunnerConfig>;
16
+ /**
17
+ * Validate required environment variables
18
+ */
19
+ private static validateEnvironment;
20
+ /**
21
+ * Load configuration from environment variables
22
+ */
23
+ private static loadFromEnvironment;
24
+ /**
25
+ * Load configuration from file
26
+ */
27
+ private static loadConfigFile;
28
+ /**
29
+ * Validate final configuration
30
+ */
31
+ private static validateConfig;
32
+ /**
33
+ * Get all environment configuration
34
+ */
35
+ static getEnvironmentConfig(): EnvironmentConfig;
36
+ /**
37
+ * Save configuration file with updated data
38
+ */
39
+ static saveConfigFile(configPath: string, config: any): Promise<void>;
40
+ }
41
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAiB,MAAM,UAAU,CAAC;AAQ1E,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,cAAc,CAM3B;IAEF;;;OAGG;WACU,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA4CnE;;OAEG;WACU,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IA0E1E;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAkClC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAalC;;OAEG;mBACkB,cAAc;IAkCnC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAiD7B;;OAEG;IACH,MAAM,CAAC,oBAAoB,IAAI,iBAAiB;IAShD;;OAEG;WACU,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;CAW5E"}
@@ -0,0 +1,250 @@
1
+ "use strict";
2
+ /**
3
+ * Configuration management utilities
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.ConfigManager = void 0;
10
+ const promises_1 = __importDefault(require("fs/promises"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const logger_1 = require("./logger");
13
+ const commander_1 = require("commander");
14
+ const logger = (0, logger_1.createLogger)("ConfigManager");
15
+ class ConfigManager {
16
+ static DEFAULT_CONFIG = {
17
+ dataDir: "./data",
18
+ heartbeatInterval: 120000, // 2 minutes
19
+ retryStrategy: "exponential",
20
+ retryIntervalSecs: 60,
21
+ retryDurationSecs: 900,
22
+ };
23
+ /**
24
+ * Load configuration without parsing command line arguments
25
+ * Used when arguments have already been parsed by the CLI
26
+ */
27
+ static async loadConfig(configPath) {
28
+ // Validate required environment variables
29
+ this.validateEnvironment();
30
+ // Start with defaults
31
+ let config = { ...this.DEFAULT_CONFIG };
32
+ // Determine config path - use provided path or default location
33
+ let effectiveConfigPath = configPath;
34
+ if (!effectiveConfigPath) {
35
+ // Try to use default config location
36
+ try {
37
+ const envPaths = require("env-paths").default || require("env-paths");
38
+ const paths = envPaths("northflare-runner", { suffix: "" });
39
+ const defaultConfigPath = path_1.default.join(paths.config, "config.json");
40
+ // Check if default config exists
41
+ const fs = require("fs");
42
+ if (fs.existsSync(defaultConfigPath)) {
43
+ effectiveConfigPath = defaultConfigPath;
44
+ logger.info(`Using default config file: ${defaultConfigPath}`);
45
+ }
46
+ }
47
+ catch (error) {
48
+ // env-paths not available or error accessing default location
49
+ logger.debug("Could not check default config location:", error);
50
+ }
51
+ }
52
+ // Load from config file if we have a path
53
+ if (effectiveConfigPath) {
54
+ const fileConfig = await this.loadConfigFile(effectiveConfigPath);
55
+ config = { ...config, ...fileConfig };
56
+ }
57
+ // Override with environment variables
58
+ const envConfig = this.loadFromEnvironment();
59
+ config = { ...config, ...envConfig };
60
+ // Validate final configuration
61
+ this.validateConfig(config);
62
+ return config;
63
+ }
64
+ /**
65
+ * Parse command line arguments and load configuration
66
+ */
67
+ static async parseArgsAndLoadConfig(argv) {
68
+ const program = new commander_1.Command();
69
+ program
70
+ .name("northflare-runner")
71
+ .description("Northflare Runner - Executes Claude agents for task processing")
72
+ .version("1.0.0")
73
+ .option("-c, --config <path>", "Path to configuration file")
74
+ .option("--retry-strategy <strategy>", "Registration retry strategy (none, interval, exponential)", "exponential")
75
+ .option("--retry-interval-secs <seconds>", "Retry interval in seconds for interval strategy", "60")
76
+ .option("--retry-duration-secs <seconds>", "Max retry duration in seconds for exponential strategy", "900")
77
+ .option("--data-dir <path>", "Data directory path", "./data")
78
+ .option("--heartbeat-interval <ms>", "Heartbeat interval in milliseconds", "120000");
79
+ program.parse(argv);
80
+ const options = program.opts();
81
+ // Validate required environment variables
82
+ this.validateEnvironment();
83
+ // Start with defaults
84
+ let config = { ...this.DEFAULT_CONFIG };
85
+ // Load from config file if provided
86
+ if (options["config"]) {
87
+ const fileConfig = await this.loadConfigFile(options["config"]);
88
+ config = { ...config, ...fileConfig };
89
+ }
90
+ // Override with environment variables
91
+ const envConfig = this.loadFromEnvironment();
92
+ config = { ...config, ...envConfig };
93
+ // Override with CLI arguments (highest priority)
94
+ if (options["retryStrategy"]) {
95
+ config.retryStrategy = options["retryStrategy"];
96
+ }
97
+ if (options["retryIntervalSecs"]) {
98
+ config.retryIntervalSecs = parseInt(options["retryIntervalSecs"]);
99
+ }
100
+ if (options["retryDurationSecs"]) {
101
+ config.retryDurationSecs = parseInt(options["retryDurationSecs"]);
102
+ }
103
+ if (options["dataDir"]) {
104
+ config.dataDir = options["dataDir"];
105
+ }
106
+ if (options["heartbeatInterval"]) {
107
+ config.heartbeatInterval = parseInt(options["heartbeatInterval"]);
108
+ }
109
+ // Validate final configuration
110
+ this.validateConfig(config);
111
+ return config;
112
+ }
113
+ /**
114
+ * Validate required environment variables
115
+ */
116
+ static validateEnvironment() {
117
+ // Set default for NORTHFLARE_WORKSPACE_DIR if not provided
118
+ if (!process.env["NORTHFLARE_WORKSPACE_DIR"]) {
119
+ try {
120
+ const envPaths = require("env-paths").default || require("env-paths");
121
+ const paths = envPaths("northflare-runner", { suffix: "" });
122
+ process.env["NORTHFLARE_WORKSPACE_DIR"] = paths.data;
123
+ }
124
+ catch (error) {
125
+ // Fallback to original default if env-paths is not available
126
+ process.env["NORTHFLARE_WORKSPACE_DIR"] = "/workspace";
127
+ }
128
+ }
129
+ // Set default for NORTHFLARE_ORCHESTRATOR_URL if not provided
130
+ if (!process.env["NORTHFLARE_ORCHESTRATOR_URL"]) {
131
+ process.env["NORTHFLARE_ORCHESTRATOR_URL"] = "https://api.northflare.ai";
132
+ }
133
+ const required = [
134
+ "NORTHFLARE_RUNNER_TOKEN",
135
+ "NORTHFLARE_WORKSPACE_DIR",
136
+ "NORTHFLARE_ORCHESTRATOR_URL",
137
+ ];
138
+ const missing = required.filter((key) => !process.env[key]);
139
+ if (missing.length > 0) {
140
+ throw new Error(`Missing required environment variables: ${missing.join(", ")}\n` +
141
+ "Please set these environment variables before starting the runner.");
142
+ }
143
+ }
144
+ /**
145
+ * Load configuration from environment variables
146
+ */
147
+ static loadFromEnvironment() {
148
+ const config = {
149
+ orchestratorUrl: process.env["NORTHFLARE_ORCHESTRATOR_URL"],
150
+ };
151
+ // Optional environment overrides
152
+ if (process.env["NORTHFLARE_DATA_DIR"]) {
153
+ config.dataDir = process.env["NORTHFLARE_DATA_DIR"];
154
+ }
155
+ return config;
156
+ }
157
+ /**
158
+ * Load configuration from file
159
+ */
160
+ static async loadConfigFile(configPath) {
161
+ try {
162
+ const absolutePath = path_1.default.resolve(configPath);
163
+ const content = await promises_1.default.readFile(absolutePath, "utf-8");
164
+ // Support both JSON and YAML formats
165
+ if (configPath.endsWith(".json")) {
166
+ const config = JSON.parse(content);
167
+ // Log if runnerRepos are found in config
168
+ if (config.runnerRepos && Array.isArray(config.runnerRepos)) {
169
+ logger.info(`Found ${config.runnerRepos.length} runner repos in config file`);
170
+ }
171
+ return config;
172
+ }
173
+ else if (configPath.endsWith(".yaml") || configPath.endsWith(".yml")) {
174
+ // For YAML support, we'd need to add a yaml parser dependency
175
+ throw new Error("YAML configuration files are not yet supported");
176
+ }
177
+ else {
178
+ throw new Error("Configuration file must be .json format");
179
+ }
180
+ }
181
+ catch (error) {
182
+ if (error.code === "ENOENT") {
183
+ logger.warn(`Configuration file not found: ${configPath}`);
184
+ return {};
185
+ }
186
+ throw error;
187
+ }
188
+ }
189
+ /**
190
+ * Validate final configuration
191
+ */
192
+ static validateConfig(config) {
193
+ // Note: Runner ID will be generated by server during registration
194
+ if (!config.orchestratorUrl) {
195
+ throw new Error("orchestratorUrl is required");
196
+ }
197
+ if (!config.dataDir) {
198
+ throw new Error("dataDir is required");
199
+ }
200
+ if (!config.heartbeatInterval || config.heartbeatInterval < 1000) {
201
+ throw new Error("heartbeatInterval must be at least 1000ms");
202
+ }
203
+ // Validate retry strategy
204
+ const validStrategies = [
205
+ "none",
206
+ "interval",
207
+ "exponential",
208
+ ];
209
+ if (!config.retryStrategy ||
210
+ !validStrategies.includes(config.retryStrategy)) {
211
+ throw new Error(`retryStrategy must be one of: ${validStrategies.join(", ")}`);
212
+ }
213
+ if (config.retryStrategy === "interval" &&
214
+ (!config.retryIntervalSecs || config.retryIntervalSecs < 1)) {
215
+ throw new Error("retryIntervalSecs must be at least 1 when using interval strategy");
216
+ }
217
+ if (config.retryStrategy === "exponential" &&
218
+ (!config.retryDurationSecs || config.retryDurationSecs < 1)) {
219
+ throw new Error("retryDurationSecs must be at least 1 when using exponential strategy");
220
+ }
221
+ }
222
+ /**
223
+ * Get all environment configuration
224
+ */
225
+ static getEnvironmentConfig() {
226
+ return {
227
+ NORTHFLARE_RUNNER_TOKEN: process.env["NORTHFLARE_RUNNER_TOKEN"],
228
+ NORTHFLARE_WORKSPACE_DIR: process.env["NORTHFLARE_WORKSPACE_DIR"],
229
+ NORTHFLARE_ORCHESTRATOR_URL: process.env["NORTHFLARE_ORCHESTRATOR_URL"],
230
+ DEBUG: process.env["DEBUG"],
231
+ };
232
+ }
233
+ /**
234
+ * Save configuration file with updated data
235
+ */
236
+ static async saveConfigFile(configPath, config) {
237
+ try {
238
+ const absolutePath = path_1.default.resolve(configPath);
239
+ const content = JSON.stringify(config, null, 2);
240
+ await promises_1.default.writeFile(absolutePath, content, "utf-8");
241
+ logger.info(`Updated configuration file: ${absolutePath}`);
242
+ }
243
+ catch (error) {
244
+ logger.error("Failed to save configuration file", error);
245
+ throw error;
246
+ }
247
+ }
248
+ }
249
+ exports.ConfigManager = ConfigManager;
250
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Console wrapper that suppresses output when not in debug mode
3
+ */
4
+ export declare const console: {
5
+ log: (message?: any, ...optionalParams: any[]) => void;
6
+ warn: (message?: any, ...optionalParams: any[]) => void;
7
+ error: (message?: any, ...optionalParams: any[]) => void;
8
+ info: (message?: any, ...optionalParams: any[]) => void;
9
+ debug: (message?: any, ...optionalParams: any[]) => void;
10
+ };
11
+ //# sourceMappingURL=console.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../src/utils/console.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,OAAO;;;;;;CAMnB,CAAC"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ /**
3
+ * Console wrapper that suppresses output when not in debug mode
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.console = void 0;
7
+ const isDebug = process.env["DEBUG"] === "true";
8
+ exports.console = {
9
+ log: isDebug ? global.console.log.bind(global.console) : () => { },
10
+ warn: isDebug ? global.console.warn.bind(global.console) : () => { },
11
+ error: global.console.error.bind(global.console), // Always show errors
12
+ info: isDebug ? global.console.info.bind(global.console) : () => { },
13
+ debug: isDebug ? global.console.debug.bind(global.console) : () => { },
14
+ };
15
+ //# sourceMappingURL=console.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console.js","sourceRoot":"","sources":["../../src/utils/console.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC;AAEnC,QAAA,OAAO,GAAG;IACrB,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAE,CAAC;IACjE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAE,CAAC;IACnE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,qBAAqB;IACvE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAE,CAAC;IACnE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAE,CAAC;CACtE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function expandEnv(obj: any, env?: Record<string, string | undefined>): any;
2
+ //# sourceMappingURL=expand-env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expand-env.d.ts","sourceRoot":"","sources":["../../src/utils/expand-env.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CACvB,GAAG,EAAE,GAAG,EACR,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,GAAG,CAkBL"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.expandEnv = expandEnv;
4
+ function expandEnv(obj, env = process.env) {
5
+ if (typeof obj === "string") {
6
+ return obj.replace(/\$\{([^}]+)\}/g, (match, key) => env[key] || match);
7
+ }
8
+ if (Array.isArray(obj)) {
9
+ return obj.map((item) => expandEnv(item, env));
10
+ }
11
+ if (obj && typeof obj === "object") {
12
+ const result = {};
13
+ for (const [key, value] of Object.entries(obj)) {
14
+ result[key] = expandEnv(value, env);
15
+ }
16
+ return result;
17
+ }
18
+ return obj;
19
+ }
20
+ //# sourceMappingURL=expand-env.js.map