@northflare/runner 0.0.23 → 0.0.25
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/README.md +3 -3
- package/bin/northflare-runner +234 -172
- package/dist/components/claude-sdk-manager.d.ts +6 -0
- package/dist/components/claude-sdk-manager.d.ts.map +1 -1
- package/dist/components/claude-sdk-manager.js +46 -5
- package/dist/components/claude-sdk-manager.js.map +1 -1
- package/dist/components/message-handler-sse.d.ts +3 -0
- package/dist/components/message-handler-sse.d.ts.map +1 -1
- package/dist/components/message-handler-sse.js +148 -72
- package/dist/components/message-handler-sse.js.map +1 -1
- package/dist/components/repository-manager.js +4 -4
- package/dist/components/repository-manager.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -14
- package/dist/index.js.map +1 -1
- package/dist/runner-sse.d.ts +10 -6
- package/dist/runner-sse.d.ts.map +1 -1
- package/dist/runner-sse.js +130 -109
- package/dist/runner-sse.js.map +1 -1
- package/dist/services/RunnerAPIClient.d.ts +20 -0
- package/dist/services/RunnerAPIClient.d.ts.map +1 -1
- package/dist/services/RunnerAPIClient.js +50 -1
- package/dist/services/RunnerAPIClient.js.map +1 -1
- package/dist/services/SSEClient.d.ts.map +1 -1
- package/dist/services/SSEClient.js +22 -0
- package/dist/services/SSEClient.js.map +1 -1
- package/dist/types/index.d.ts +4 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/runner-interface.d.ts +4 -1
- package/dist/types/runner-interface.d.ts.map +1 -1
- package/dist/utils/config.d.ts +7 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +185 -62
- package/dist/utils/config.js.map +1 -1
- package/docs/claude-manager.md +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository-manager.js","sourceRoot":"","sources":["../../src/components/repository-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAa,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAE5C,MAAM,OAAO,iBAAiB;IACpB,YAAY,CAAmC;IAC7C,YAAY,CAAS;IACvB,MAAM,CAAa;IACnB,GAAG,CAAY;IAEvB,YAAY,MAAkB;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;QAE9B,
|
|
1
|
+
{"version":3,"file":"repository-manager.js","sourceRoot":"","sources":["../../src/components/repository-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Main entry point for the Northflare Runner App
|
|
3
3
|
*/
|
|
4
|
+
declare let isShuttingDown: boolean;
|
|
4
5
|
declare function main(): Promise<void>;
|
|
5
6
|
export { RunnerApp } from './runner-sse.js';
|
|
6
7
|
export { ConfigManager } from './utils/config.js';
|
|
7
8
|
export * from './types/index.js';
|
|
8
|
-
export { main };
|
|
9
|
+
export { main, isShuttingDown };
|
|
9
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyCH,QAAA,IAAI,cAAc,SAAQ,CAAC;AAK3B,iBAAe,IAAI,kBAgHlB;AAiID,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -8,15 +8,34 @@ import { isRunnerDebugEnabled } from './utils/debug.js';
|
|
|
8
8
|
import { parseInactivityTimeout, formatInactivityTimeoutFromMs, } from './utils/inactivity-timeout.js';
|
|
9
9
|
import path from "path";
|
|
10
10
|
import fs from "fs/promises";
|
|
11
|
+
import { existsSync } from "fs";
|
|
11
12
|
import envPaths from "env-paths";
|
|
12
13
|
const INACTIVITY_TIMEOUT_ENV_KEY = "NORTHFLARE_RUNNER_INACTIVITY_TIMEOUT";
|
|
13
14
|
const INACTIVITY_CHECK_INTERVAL_MS = 1000;
|
|
14
|
-
|
|
15
|
+
function resolveEnvPathsAppName() {
|
|
16
|
+
if (process.env["NODE_ENV"] === "development")
|
|
17
|
+
return "northflare-runner-dev";
|
|
18
|
+
try {
|
|
19
|
+
const __dirname = path.dirname(new URL(import.meta.url).pathname);
|
|
20
|
+
const repoRoot = path.resolve(__dirname, "../..");
|
|
21
|
+
if (existsSync(path.join(repoRoot, "pnpm-workspace.yaml"))) {
|
|
22
|
+
return "northflare-runner-dev";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// ignore and fall back
|
|
27
|
+
}
|
|
28
|
+
return "northflare-runner";
|
|
29
|
+
}
|
|
30
|
+
const ENV_PATHS_APP_NAME = resolveEnvPathsAppName();
|
|
15
31
|
const ENV_PATHS_OPTIONS = { suffix: "" };
|
|
32
|
+
const IS_DEV_APP = ENV_PATHS_APP_NAME.endsWith("-dev");
|
|
33
|
+
const SHUTDOWN_TIMEOUT_MS = 10_000;
|
|
16
34
|
let runner = null;
|
|
17
35
|
let isShuttingDown = false;
|
|
18
36
|
let inactivityMonitorHandle = null;
|
|
19
37
|
let inactivityCountdownStart = null;
|
|
38
|
+
let shutdownTimeoutHandle = null;
|
|
20
39
|
async function main() {
|
|
21
40
|
try {
|
|
22
41
|
logger.info("Starting Northflare Runner...");
|
|
@@ -40,20 +59,25 @@ async function main() {
|
|
|
40
59
|
if (!configPath) {
|
|
41
60
|
try {
|
|
42
61
|
const paths = envPaths(ENV_PATHS_APP_NAME, ENV_PATHS_OPTIONS);
|
|
43
|
-
|
|
44
|
-
// Check if default config exists
|
|
45
|
-
if (await fs
|
|
46
|
-
.access(defaultConfigPath)
|
|
47
|
-
.then(() => true)
|
|
48
|
-
.catch(() => false)) {
|
|
49
|
-
configPath = defaultConfigPath;
|
|
50
|
-
}
|
|
62
|
+
configPath = path.join(paths.config, "config.json");
|
|
51
63
|
}
|
|
52
64
|
catch (error) {
|
|
53
65
|
// env-paths not available or error accessing default location
|
|
66
|
+
const localDir = IS_DEV_APP ? "./config/dev" : "./config";
|
|
67
|
+
configPath = path.resolve(localDir, "config.json");
|
|
54
68
|
}
|
|
55
69
|
}
|
|
56
|
-
|
|
70
|
+
// Normalize for downstream consumers and logging
|
|
71
|
+
configPath = path.resolve(configPath);
|
|
72
|
+
if (debugEnabled) {
|
|
73
|
+
logger.debug("Using configuration file", {
|
|
74
|
+
configPath,
|
|
75
|
+
exists: existsSync(configPath),
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
const config = await ConfigManager.loadConfig(configPath, {
|
|
79
|
+
promptForWorkspacePath: true,
|
|
80
|
+
});
|
|
57
81
|
if (inactivitySetting) {
|
|
58
82
|
config.inactivityTimeoutMs = inactivitySetting.milliseconds;
|
|
59
83
|
config.inactivityTimeoutDisplay = inactivitySetting.display;
|
|
@@ -168,17 +192,24 @@ function clearInactivityMonitor() {
|
|
|
168
192
|
function beginShutdown(exitCode = 0, message) {
|
|
169
193
|
if (isShuttingDown) {
|
|
170
194
|
if (message) {
|
|
171
|
-
logger.
|
|
195
|
+
logger.warn(`Shutdown already in progress. Forcing exit now (${message})`);
|
|
172
196
|
}
|
|
173
197
|
else {
|
|
174
|
-
logger.
|
|
198
|
+
logger.warn("Shutdown already in progress. Forcing exit now");
|
|
175
199
|
}
|
|
176
|
-
|
|
200
|
+
// If a second signal arrives while we're still stopping, exit immediately
|
|
201
|
+
process.exit(exitCode || 1);
|
|
177
202
|
}
|
|
178
203
|
if (message) {
|
|
179
204
|
logger.info(message);
|
|
180
205
|
}
|
|
181
206
|
isShuttingDown = true;
|
|
207
|
+
// Ensure we don't hang forever waiting for async cleanup
|
|
208
|
+
shutdownTimeoutHandle = setTimeout(() => {
|
|
209
|
+
logger.error(`Shutdown did not complete within ${SHUTDOWN_TIMEOUT_MS}ms. Forcing exit.`);
|
|
210
|
+
process.exit(1);
|
|
211
|
+
}, SHUTDOWN_TIMEOUT_MS);
|
|
212
|
+
shutdownTimeoutHandle.unref?.();
|
|
182
213
|
void shutdown(exitCode);
|
|
183
214
|
}
|
|
184
215
|
async function shutdown(exitCode = 0) {
|
|
@@ -193,6 +224,10 @@ async function shutdown(exitCode = 0) {
|
|
|
193
224
|
exitCode = 1;
|
|
194
225
|
}
|
|
195
226
|
}
|
|
227
|
+
if (shutdownTimeoutHandle) {
|
|
228
|
+
clearTimeout(shutdownTimeoutHandle);
|
|
229
|
+
shutdownTimeoutHandle = null;
|
|
230
|
+
}
|
|
196
231
|
process.exit(exitCode);
|
|
197
232
|
}
|
|
198
233
|
// Note: In ESM, the bin/northflare-runner script handles calling main() directly
|
|
@@ -200,5 +235,5 @@ async function shutdown(exitCode = 0) {
|
|
|
200
235
|
export { RunnerApp } from './runner-sse.js';
|
|
201
236
|
export { ConfigManager } from './utils/config.js';
|
|
202
237
|
export * from './types/index.js';
|
|
203
|
-
export { main };
|
|
238
|
+
export { main, isShuttingDown };
|
|
204
239
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EACL,sBAAsB,EACtB,6BAA6B,GAC9B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,MAAM,0BAA0B,GAAG,sCAAsC,CAAC;AAC1E,MAAM,4BAA4B,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/runner-sse.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Main RunnerApp class - entry point and lifecycle manager for the runner app
|
|
3
3
|
* Updated to use SSE for real-time messaging instead of ElectricSQL
|
|
4
4
|
*/
|
|
5
|
-
import { RunnerConfig, ConversationContext, JsonRpcMessage } from './types/index.js';
|
|
5
|
+
import { RunnerConfig, ConversationContext, JsonRpcMessage, RunnerRepo } from './types/index.js';
|
|
6
6
|
import { IRunnerApp } from './types/runner-interface.js';
|
|
7
7
|
import { ClaudeManager } from './components/claude-sdk-manager.js';
|
|
8
8
|
import { CodexManager } from './components/codex-sdk-manager.js';
|
|
@@ -18,6 +18,7 @@ export declare class RunnerApp implements IRunnerApp {
|
|
|
18
18
|
private agentConversations;
|
|
19
19
|
private config;
|
|
20
20
|
private configPath?;
|
|
21
|
+
private runnerReposCachePath?;
|
|
21
22
|
private heartbeatInterval?;
|
|
22
23
|
private isRunning;
|
|
23
24
|
private isRegistered;
|
|
@@ -50,11 +51,6 @@ export declare class RunnerApp implements IRunnerApp {
|
|
|
50
51
|
private cleanupCompletedConversations;
|
|
51
52
|
private registerRunner;
|
|
52
53
|
private registerWithRetry;
|
|
53
|
-
/**
|
|
54
|
-
* Load runnerRepos for a specific runnerId from the config file
|
|
55
|
-
*/
|
|
56
|
-
private loadRunnerReposForId;
|
|
57
|
-
private updateRunnerReposWithIds;
|
|
58
54
|
private sendToOrchestratorWithRetry;
|
|
59
55
|
private startHeartbeat;
|
|
60
56
|
private stopAllConversations;
|
|
@@ -65,6 +61,7 @@ export declare class RunnerApp implements IRunnerApp {
|
|
|
65
61
|
get codexManager_(): CodexManager;
|
|
66
62
|
get northflareAgentManager_(): NorthflareAgentManager;
|
|
67
63
|
get repositoryManager_(): EnhancedRepositoryManager;
|
|
64
|
+
getConfigPath(): string | undefined;
|
|
68
65
|
getRunnerId(): string | undefined;
|
|
69
66
|
getRunnerUid(): string | null;
|
|
70
67
|
getLastProcessedAt(): Date | null;
|
|
@@ -73,6 +70,13 @@ export declare class RunnerApp implements IRunnerApp {
|
|
|
73
70
|
setLastProcessedAt(timestamp: Date | null): void;
|
|
74
71
|
getPreHandoffConversations(): Set<string>;
|
|
75
72
|
setDelayFunction(fn: (ms: number) => Promise<void>): void;
|
|
73
|
+
getWorkspacePath(): string | undefined;
|
|
74
|
+
replaceRunnerRepos(repos: RunnerRepo[]): Promise<void>;
|
|
75
|
+
private saveRunnerRepoCache;
|
|
76
|
+
private loadRunnerRepoCache;
|
|
77
|
+
private isRepoAllowed;
|
|
78
|
+
private prepareRunnerRepos;
|
|
79
|
+
private refreshRunnerReposFromServer;
|
|
76
80
|
private getManagerForContext;
|
|
77
81
|
}
|
|
78
82
|
//# sourceMappingURL=runner-sse.d.ts.map
|
package/dist/runner-sse.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner-sse.d.ts","sourceRoot":"","sources":["../src/runner-sse.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,cAAc,
|
|
1
|
+
{"version":3,"file":"runner-sse.d.ts","sourceRoot":"","sources":["../src/runner-sse.ts"],"names":[],"mappings":"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"}
|
package/dist/runner-sse.js
CHANGED
|
@@ -16,6 +16,16 @@ import path from "path";
|
|
|
16
16
|
import computerName from "computer-name";
|
|
17
17
|
import { sanitizeToolResponsePayload, TOOL_RESPONSE_BYTE_LIMIT, } from './utils/tool-response-sanitizer.js';
|
|
18
18
|
import { buildOutgoingMessageLog, messageFlowLogger, messagesDebugEnabled, } from './utils/message-log.js';
|
|
19
|
+
import { RunnerAPIClient } from './services/RunnerAPIClient.js';
|
|
20
|
+
function isSubPath(base, candidate) {
|
|
21
|
+
if (!base)
|
|
22
|
+
return false;
|
|
23
|
+
const normalizedBase = path.resolve(base);
|
|
24
|
+
const normalizedCandidate = path.resolve(candidate);
|
|
25
|
+
const baseWithSep = normalizedBase.endsWith(path.sep) ? normalizedBase : normalizedBase + path.sep;
|
|
26
|
+
return (normalizedCandidate === normalizedBase ||
|
|
27
|
+
normalizedCandidate.startsWith(baseWithSep));
|
|
28
|
+
}
|
|
19
29
|
const logger = createLogger("RunnerApp");
|
|
20
30
|
function logToolResponseTruncation(toolUseId) {
|
|
21
31
|
const message = `Tool response exceeded ${TOOL_RESPONSE_BYTE_LIMIT} bytes and was truncated`;
|
|
@@ -36,6 +46,7 @@ export class RunnerApp {
|
|
|
36
46
|
agentConversations; // Keyed by conversation.id
|
|
37
47
|
config;
|
|
38
48
|
configPath;
|
|
49
|
+
runnerReposCachePath;
|
|
39
50
|
heartbeatInterval;
|
|
40
51
|
isRunning = false;
|
|
41
52
|
isRegistered = false;
|
|
@@ -54,6 +65,7 @@ export class RunnerApp {
|
|
|
54
65
|
this.config = config;
|
|
55
66
|
this.configPath = configPath;
|
|
56
67
|
this.agentConversations = new Map();
|
|
68
|
+
this.runnerReposCachePath = path.join(this.config.dataDir, "runner-repos-cache.json");
|
|
57
69
|
// Note: State manager will be initialized in start() after fetching runnerId
|
|
58
70
|
}
|
|
59
71
|
async fetchRunnerId() {
|
|
@@ -124,11 +136,9 @@ export class RunnerApp {
|
|
|
124
136
|
lastProcessedAt: savedState.lastProcessedAt,
|
|
125
137
|
isActiveRunner: savedState.isActiveRunner,
|
|
126
138
|
});
|
|
127
|
-
// Load runnerRepos for this specific runnerId
|
|
128
|
-
if (this.configPath && savedState.runnerId) {
|
|
129
|
-
await this.loadRunnerReposForId(savedState.runnerId);
|
|
130
|
-
}
|
|
131
139
|
}
|
|
140
|
+
// Bootstrap runner repos from server (with cache fallback)
|
|
141
|
+
await this.refreshRunnerReposFromServer(true);
|
|
132
142
|
// Register with retry strategy
|
|
133
143
|
await this.registerWithRetry();
|
|
134
144
|
// Log debug info after registration
|
|
@@ -335,26 +345,12 @@ export class RunnerApp {
|
|
|
335
345
|
}
|
|
336
346
|
async registerRunner() {
|
|
337
347
|
try {
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
if (this.config.runnerRepos && Array.isArray(this.config.runnerRepos)) {
|
|
341
|
-
for (const repo of this.config.runnerRepos) {
|
|
342
|
-
try {
|
|
343
|
-
const resolvedPath = path.resolve(repo.path);
|
|
344
|
-
const stats = await fs.stat(resolvedPath);
|
|
345
|
-
if (stats.isDirectory()) {
|
|
346
|
-
filteredRunnerRepos.push(repo);
|
|
347
|
-
logger.info(`RunnerRepo validated: ${repo.name} at ${resolvedPath}`);
|
|
348
|
-
}
|
|
349
|
-
else {
|
|
350
|
-
logger.warn(`RunnerRepo path is not a directory: ${repo.name} at ${resolvedPath}`);
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
catch (error) {
|
|
354
|
-
logger.warn(`RunnerRepo path does not exist: ${repo.name} at ${repo.path}`);
|
|
355
|
-
}
|
|
356
|
-
}
|
|
348
|
+
if (!this.config.workspacePath || !path.isAbsolute(this.config.workspacePath)) {
|
|
349
|
+
throw new Error("workspacePath must be an absolute path");
|
|
357
350
|
}
|
|
351
|
+
const filteredRunnerRepos = Array.isArray(this.config.runnerRepos)
|
|
352
|
+
? this.config.runnerRepos
|
|
353
|
+
: [];
|
|
358
354
|
// Get computer name for registration
|
|
359
355
|
let hostComputerName;
|
|
360
356
|
try {
|
|
@@ -371,6 +367,7 @@ export class RunnerApp {
|
|
|
371
367
|
version: "1.0.0",
|
|
372
368
|
runnerRepos: filteredRunnerRepos,
|
|
373
369
|
computerName: hostComputerName,
|
|
370
|
+
workspacePath: this.config.workspacePath,
|
|
374
371
|
},
|
|
375
372
|
});
|
|
376
373
|
// Debug log the full response
|
|
@@ -410,7 +407,8 @@ export class RunnerApp {
|
|
|
410
407
|
logger.info(`Runner registered successfully with ID: ${this.config.runnerId} and UID: ${this.runnerUid}`);
|
|
411
408
|
// Process runnerRepos from response
|
|
412
409
|
if (result.runnerRepos && Array.isArray(result.runnerRepos)) {
|
|
413
|
-
await this.
|
|
410
|
+
const prepared = await this.prepareRunnerRepos(result.runnerRepos);
|
|
411
|
+
await this.replaceRunnerRepos(prepared);
|
|
414
412
|
}
|
|
415
413
|
// Debug logging for registration details
|
|
416
414
|
if (isRunnerDebugEnabled()) {
|
|
@@ -515,91 +513,6 @@ export class RunnerApp {
|
|
|
515
513
|
}
|
|
516
514
|
}
|
|
517
515
|
}
|
|
518
|
-
/**
|
|
519
|
-
* Load runnerRepos for a specific runnerId from the config file
|
|
520
|
-
*/
|
|
521
|
-
async loadRunnerReposForId(runnerId) {
|
|
522
|
-
if (!this.configPath) {
|
|
523
|
-
logger.debug("No config path specified, cannot load runnerRepos");
|
|
524
|
-
return;
|
|
525
|
-
}
|
|
526
|
-
try {
|
|
527
|
-
const configContent = await fs.readFile(path.resolve(this.configPath), "utf-8");
|
|
528
|
-
const configFile = JSON.parse(configContent);
|
|
529
|
-
if (!configFile.runnerRepos || typeof configFile.runnerRepos !== "object") {
|
|
530
|
-
logger.debug("No runnerRepos in config file");
|
|
531
|
-
this.config.runnerRepos = [];
|
|
532
|
-
return;
|
|
533
|
-
}
|
|
534
|
-
const reposForThisRunner = configFile.runnerRepos[runnerId];
|
|
535
|
-
if (reposForThisRunner && Array.isArray(reposForThisRunner)) {
|
|
536
|
-
this.config.runnerRepos = reposForThisRunner;
|
|
537
|
-
logger.info(`Loaded ${reposForThisRunner.length} runnerRepos for runner ${runnerId}`);
|
|
538
|
-
}
|
|
539
|
-
else {
|
|
540
|
-
this.config.runnerRepos = [];
|
|
541
|
-
logger.debug(`No runnerRepos found for runner ${runnerId}, using empty array`);
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
catch (error) {
|
|
545
|
-
logger.error("Failed to load runnerRepos for runner", error);
|
|
546
|
-
this.config.runnerRepos = [];
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
async updateRunnerReposWithIds(serverRunnerRepos) {
|
|
550
|
-
if (!this.configPath || !this.config.runnerId) {
|
|
551
|
-
logger.info("No config path or runnerId specified, cannot update runnerRepos with IDs");
|
|
552
|
-
return;
|
|
553
|
-
}
|
|
554
|
-
try {
|
|
555
|
-
const { ConfigManager } = await import("./utils/config.js");
|
|
556
|
-
const configContent = await fs.readFile(path.resolve(this.configPath), "utf-8");
|
|
557
|
-
const configFile = JSON.parse(configContent);
|
|
558
|
-
// Initialize runnerRepos namespace if not present
|
|
559
|
-
if (!configFile.runnerRepos) {
|
|
560
|
-
configFile.runnerRepos = {};
|
|
561
|
-
}
|
|
562
|
-
// Get or create repos array for this runnerId
|
|
563
|
-
let reposForThisRunner = configFile.runnerRepos[this.config.runnerId];
|
|
564
|
-
if (!reposForThisRunner || !Array.isArray(reposForThisRunner)) {
|
|
565
|
-
reposForThisRunner = [];
|
|
566
|
-
configFile.runnerRepos[this.config.runnerId] = reposForThisRunner;
|
|
567
|
-
}
|
|
568
|
-
// Update runnerRepos with UUIDs from server
|
|
569
|
-
let hasUpdates = false;
|
|
570
|
-
for (const serverRepo of serverRunnerRepos) {
|
|
571
|
-
const localRepo = reposForThisRunner.find((r) => r.name === serverRepo.name && r.path === serverRepo.path);
|
|
572
|
-
if (localRepo && serverRepo.uuid) {
|
|
573
|
-
// Store UUID if not already present or different
|
|
574
|
-
if (!localRepo.uuid || localRepo.uuid !== serverRepo.uuid) {
|
|
575
|
-
localRepo.uuid = serverRepo.uuid;
|
|
576
|
-
hasUpdates = true;
|
|
577
|
-
logger.info(`Updated RunnerRepo "${localRepo.name}" with UUID: ${serverRepo.uuid}`);
|
|
578
|
-
}
|
|
579
|
-
}
|
|
580
|
-
else if (serverRepo.uuid) {
|
|
581
|
-
// Add new repo from server
|
|
582
|
-
reposForThisRunner.push({
|
|
583
|
-
uuid: serverRepo.uuid,
|
|
584
|
-
name: serverRepo.name,
|
|
585
|
-
path: serverRepo.path,
|
|
586
|
-
});
|
|
587
|
-
hasUpdates = true;
|
|
588
|
-
logger.info(`Added new RunnerRepo "${serverRepo.name}" with UUID: ${serverRepo.uuid}`);
|
|
589
|
-
}
|
|
590
|
-
}
|
|
591
|
-
// Save the updated config if there were changes
|
|
592
|
-
if (hasUpdates) {
|
|
593
|
-
await ConfigManager.saveConfigFile(this.configPath, configFile);
|
|
594
|
-
// Update our in-memory config
|
|
595
|
-
this.config.runnerRepos = reposForThisRunner;
|
|
596
|
-
logger.info(`Saved ${reposForThisRunner.length} runnerRepos for runner ${this.config.runnerId}`);
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
catch (error) {
|
|
600
|
-
logger.error("Failed to update runnerRepos with IDs", error);
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
516
|
async sendToOrchestratorWithRetry(message) {
|
|
604
517
|
const maxRetries = 5;
|
|
605
518
|
const initialDelayMs = 1000; // Start with 1 second
|
|
@@ -721,6 +634,9 @@ export class RunnerApp {
|
|
|
721
634
|
get repositoryManager_() {
|
|
722
635
|
return this.repositoryManager;
|
|
723
636
|
}
|
|
637
|
+
getConfigPath() {
|
|
638
|
+
return this.configPath;
|
|
639
|
+
}
|
|
724
640
|
getRunnerId() {
|
|
725
641
|
return this.config.runnerId;
|
|
726
642
|
}
|
|
@@ -769,6 +685,111 @@ export class RunnerApp {
|
|
|
769
685
|
setDelayFunction(fn) {
|
|
770
686
|
this.delayFn = fn;
|
|
771
687
|
}
|
|
688
|
+
getWorkspacePath() {
|
|
689
|
+
return this.config.workspacePath;
|
|
690
|
+
}
|
|
691
|
+
async replaceRunnerRepos(repos) {
|
|
692
|
+
this.config.runnerRepos = repos;
|
|
693
|
+
await this.saveRunnerRepoCache(repos);
|
|
694
|
+
}
|
|
695
|
+
async saveRunnerRepoCache(repos) {
|
|
696
|
+
if (!this.runnerReposCachePath)
|
|
697
|
+
return;
|
|
698
|
+
try {
|
|
699
|
+
await fs.mkdir(path.dirname(this.runnerReposCachePath), { recursive: true });
|
|
700
|
+
await fs.writeFile(this.runnerReposCachePath, JSON.stringify({ updatedAt: new Date().toISOString(), repos }, null, 2), "utf-8");
|
|
701
|
+
}
|
|
702
|
+
catch (err) {
|
|
703
|
+
logger.warn("Failed to persist runner repo cache", err);
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
async loadRunnerRepoCache() {
|
|
707
|
+
if (!this.runnerReposCachePath)
|
|
708
|
+
return null;
|
|
709
|
+
try {
|
|
710
|
+
const content = await fs.readFile(this.runnerReposCachePath, "utf-8");
|
|
711
|
+
const parsed = JSON.parse(content);
|
|
712
|
+
if (Array.isArray(parsed?.repos)) {
|
|
713
|
+
logger.info(`Loaded ${parsed.repos.length} runner repos from cache at ${this.runnerReposCachePath}`);
|
|
714
|
+
return parsed.repos;
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
catch (err) {
|
|
718
|
+
if (err?.code !== "ENOENT") {
|
|
719
|
+
logger.warn("Failed to load runner repo cache", err);
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
return null;
|
|
723
|
+
}
|
|
724
|
+
isRepoAllowed(repo, workspacePath) {
|
|
725
|
+
const base = workspacePath || this.config.workspacePath;
|
|
726
|
+
const resolvedPath = path.resolve(repo.path);
|
|
727
|
+
const external = repo.external === true || !isSubPath(base, resolvedPath);
|
|
728
|
+
if (!external && base && !isSubPath(base, resolvedPath)) {
|
|
729
|
+
return false;
|
|
730
|
+
}
|
|
731
|
+
return true;
|
|
732
|
+
}
|
|
733
|
+
async prepareRunnerRepos(repos, workspacePath) {
|
|
734
|
+
const prepared = [];
|
|
735
|
+
for (const repo of repos || []) {
|
|
736
|
+
if (!repo?.path || !repo?.name)
|
|
737
|
+
continue;
|
|
738
|
+
const resolvedPath = path.resolve(repo.path);
|
|
739
|
+
const external = repo.external === true || !isSubPath(workspacePath || this.config.workspacePath, resolvedPath);
|
|
740
|
+
if (!external && workspacePath && !isSubPath(workspacePath, resolvedPath)) {
|
|
741
|
+
logger.warn(`Ignoring runnerRepo ${repo.name} because path is outside workspace: ${resolvedPath}`);
|
|
742
|
+
continue;
|
|
743
|
+
}
|
|
744
|
+
if (!external && this.config.workspacePath && !isSubPath(this.config.workspacePath, resolvedPath)) {
|
|
745
|
+
logger.warn(`Ignoring runnerRepo ${repo.name} because path is outside configured workspace: ${resolvedPath}`);
|
|
746
|
+
continue;
|
|
747
|
+
}
|
|
748
|
+
try {
|
|
749
|
+
await fs.mkdir(resolvedPath, { recursive: true });
|
|
750
|
+
const stats = await fs.stat(resolvedPath);
|
|
751
|
+
if (!stats.isDirectory()) {
|
|
752
|
+
logger.warn(`RunnerRepo path is not a directory: ${repo.name} at ${resolvedPath}`);
|
|
753
|
+
continue;
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
catch (err) {
|
|
757
|
+
logger.warn(`RunnerRepo path could not be prepared: ${repo.name} at ${resolvedPath}`, err);
|
|
758
|
+
continue;
|
|
759
|
+
}
|
|
760
|
+
prepared.push({
|
|
761
|
+
...repo,
|
|
762
|
+
path: resolvedPath,
|
|
763
|
+
external,
|
|
764
|
+
});
|
|
765
|
+
}
|
|
766
|
+
return prepared;
|
|
767
|
+
}
|
|
768
|
+
async refreshRunnerReposFromServer(useCacheOnFailure = true) {
|
|
769
|
+
const apiClient = new RunnerAPIClient(this.config);
|
|
770
|
+
if (this.config.runnerId) {
|
|
771
|
+
apiClient.setRunnerId(this.config.runnerId);
|
|
772
|
+
}
|
|
773
|
+
try {
|
|
774
|
+
const snapshot = await apiClient.listRunnerRepos();
|
|
775
|
+
const prepared = await this.prepareRunnerRepos(snapshot.repos || [], snapshot.workspacePath);
|
|
776
|
+
await this.replaceRunnerRepos(prepared);
|
|
777
|
+
logger.info(`Hydrated runner repos from server snapshot (${prepared.length})`);
|
|
778
|
+
}
|
|
779
|
+
catch (err) {
|
|
780
|
+
logger.error("Failed to fetch runner repo snapshot from server", err);
|
|
781
|
+
if (useCacheOnFailure) {
|
|
782
|
+
const cached = await this.loadRunnerRepoCache();
|
|
783
|
+
if (cached) {
|
|
784
|
+
const prepared = await this.prepareRunnerRepos(cached);
|
|
785
|
+
await this.replaceRunnerRepos(prepared);
|
|
786
|
+
logger.info(`Hydrated runner repos from local cache (${prepared.length}) after snapshot failure`);
|
|
787
|
+
return;
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
throw err;
|
|
791
|
+
}
|
|
792
|
+
}
|
|
772
793
|
getManagerForContext(context) {
|
|
773
794
|
const provider = context?.provider?.toLowerCase();
|
|
774
795
|
if (provider === "openai") {
|