@northflare/runner 0.0.30 → 0.0.32
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/bin/northflare-runner +1 -1
- package/dist/chunk-3QTLJ4CG.js +33622 -0
- package/dist/chunk-3QTLJ4CG.js.map +1 -0
- package/dist/chunk-7D4SUZUM.js +38 -0
- package/dist/chunk-7D4SUZUM.js.map +1 -0
- package/dist/dist-W7DZRE4U.js +365 -0
- package/dist/dist-W7DZRE4U.js.map +1 -0
- package/dist/index.d.ts +764 -5
- package/dist/index.js +9872 -202
- package/dist/index.js.map +1 -1
- package/dist/sdk-query-TRMSGGID-EIENWDKW.js +14 -0
- package/dist/sdk-query-TRMSGGID-EIENWDKW.js.map +1 -0
- package/package.json +17 -17
- package/tsup.config.ts +5 -2
- package/dist/components/claude-sdk-manager.d.ts +0 -60
- package/dist/components/claude-sdk-manager.d.ts.map +0 -1
- package/dist/components/claude-sdk-manager.js +0 -1378
- package/dist/components/claude-sdk-manager.js.map +0 -1
- package/dist/components/codex-sdk-manager.d.ts +0 -94
- package/dist/components/codex-sdk-manager.d.ts.map +0 -1
- package/dist/components/codex-sdk-manager.js +0 -1450
- package/dist/components/codex-sdk-manager.js.map +0 -1
- package/dist/components/enhanced-repository-manager.d.ts +0 -173
- package/dist/components/enhanced-repository-manager.d.ts.map +0 -1
- package/dist/components/enhanced-repository-manager.js +0 -1097
- package/dist/components/enhanced-repository-manager.js.map +0 -1
- package/dist/components/message-handler-sse.d.ts +0 -77
- package/dist/components/message-handler-sse.d.ts.map +0 -1
- package/dist/components/message-handler-sse.js +0 -1224
- package/dist/components/message-handler-sse.js.map +0 -1
- package/dist/components/northflare-agent-sdk-manager.d.ts +0 -58
- package/dist/components/northflare-agent-sdk-manager.d.ts.map +0 -1
- package/dist/components/northflare-agent-sdk-manager.js +0 -2032
- package/dist/components/northflare-agent-sdk-manager.js.map +0 -1
- package/dist/components/repository-manager.d.ts +0 -51
- package/dist/components/repository-manager.d.ts.map +0 -1
- package/dist/components/repository-manager.js +0 -256
- package/dist/components/repository-manager.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/runner-sse.d.ts +0 -102
- package/dist/runner-sse.d.ts.map +0 -1
- package/dist/runner-sse.js +0 -877
- package/dist/runner-sse.js.map +0 -1
- package/dist/services/RunnerAPIClient.d.ts +0 -61
- package/dist/services/RunnerAPIClient.d.ts.map +0 -1
- package/dist/services/RunnerAPIClient.js +0 -187
- package/dist/services/RunnerAPIClient.js.map +0 -1
- package/dist/services/SSEClient.d.ts +0 -62
- package/dist/services/SSEClient.d.ts.map +0 -1
- package/dist/services/SSEClient.js +0 -225
- package/dist/services/SSEClient.js.map +0 -1
- package/dist/types/claude.d.ts +0 -80
- package/dist/types/claude.d.ts.map +0 -1
- package/dist/types/claude.js +0 -5
- package/dist/types/claude.js.map +0 -1
- package/dist/types/index.d.ts +0 -52
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -7
- package/dist/types/index.js.map +0 -1
- package/dist/types/messages.d.ts +0 -33
- package/dist/types/messages.d.ts.map +0 -1
- package/dist/types/messages.js +0 -5
- package/dist/types/messages.js.map +0 -1
- package/dist/types/runner-interface.d.ts +0 -38
- package/dist/types/runner-interface.d.ts.map +0 -1
- package/dist/types/runner-interface.js +0 -5
- package/dist/types/runner-interface.js.map +0 -1
- package/dist/utils/StateManager.d.ts +0 -61
- package/dist/utils/StateManager.d.ts.map +0 -1
- package/dist/utils/StateManager.js +0 -170
- package/dist/utils/StateManager.js.map +0 -1
- package/dist/utils/config.d.ts +0 -48
- package/dist/utils/config.d.ts.map +0 -1
- package/dist/utils/config.js +0 -378
- package/dist/utils/config.js.map +0 -1
- package/dist/utils/console.d.ts +0 -8
- package/dist/utils/console.d.ts.map +0 -1
- package/dist/utils/console.js +0 -31
- package/dist/utils/console.js.map +0 -1
- package/dist/utils/debug.d.ts +0 -12
- package/dist/utils/debug.d.ts.map +0 -1
- package/dist/utils/debug.js +0 -94
- package/dist/utils/debug.js.map +0 -1
- package/dist/utils/expand-env.d.ts +0 -2
- package/dist/utils/expand-env.d.ts.map +0 -1
- package/dist/utils/expand-env.js +0 -17
- package/dist/utils/expand-env.js.map +0 -1
- package/dist/utils/inactivity-timeout.d.ts +0 -19
- package/dist/utils/inactivity-timeout.d.ts.map +0 -1
- package/dist/utils/inactivity-timeout.js +0 -72
- package/dist/utils/inactivity-timeout.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -10
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -129
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/message-log.d.ts +0 -23
- package/dist/utils/message-log.d.ts.map +0 -1
- package/dist/utils/message-log.js +0 -69
- package/dist/utils/message-log.js.map +0 -1
- package/dist/utils/model.d.ts +0 -8
- package/dist/utils/model.d.ts.map +0 -1
- package/dist/utils/model.js +0 -37
- package/dist/utils/model.js.map +0 -1
- package/dist/utils/status-line.d.ts +0 -34
- package/dist/utils/status-line.d.ts.map +0 -1
- package/dist/utils/status-line.js +0 -131
- package/dist/utils/status-line.js.map +0 -1
- package/dist/utils/tool-response-sanitizer.d.ts +0 -9
- package/dist/utils/tool-response-sanitizer.d.ts.map +0 -1
- package/dist/utils/tool-response-sanitizer.js +0 -118
- package/dist/utils/tool-response-sanitizer.js.map +0 -1
- package/dist/utils/update-coordinator.d.ts +0 -53
- package/dist/utils/update-coordinator.d.ts.map +0 -1
- package/dist/utils/update-coordinator.js +0 -159
- package/dist/utils/update-coordinator.js.map +0 -1
- package/dist/utils/version.d.ts +0 -10
- package/dist/utils/version.d.ts.map +0 -1
- package/dist/utils/version.js +0 -33
- package/dist/utils/version.js.map +0 -1
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
export const TOOL_RESPONSE_BYTE_LIMIT = 500 * 1024; // 500 KiB cap per tool response payload
|
|
2
|
-
export const TOOL_RESPONSE_SUFFIX = "... [truncated]";
|
|
3
|
-
export function sanitizeToolResponsePayload(method, params) {
|
|
4
|
-
if (method !== "message.agent" || !params) {
|
|
5
|
-
return { params, truncated: false };
|
|
6
|
-
}
|
|
7
|
-
if (!isToolResultPayload(params)) {
|
|
8
|
-
return { params, truncated: false };
|
|
9
|
-
}
|
|
10
|
-
const context = {
|
|
11
|
-
bytesRemaining: TOOL_RESPONSE_BYTE_LIMIT,
|
|
12
|
-
truncated: false,
|
|
13
|
-
};
|
|
14
|
-
const [sanitized, changed] = truncateStringsRecursively(params, context);
|
|
15
|
-
if (!changed && !context.truncated) {
|
|
16
|
-
return { params, truncated: false };
|
|
17
|
-
}
|
|
18
|
-
return {
|
|
19
|
-
params: sanitized,
|
|
20
|
-
truncated: true,
|
|
21
|
-
toolUseId: extractToolUseId(params),
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
function isToolResultPayload(payload) {
|
|
25
|
-
if (!payload) {
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
if (payload.type === "tool_result" || payload.subtype === "tool_result") {
|
|
29
|
-
return true;
|
|
30
|
-
}
|
|
31
|
-
if (Array.isArray(payload.content)) {
|
|
32
|
-
return payload.content.some((entry) => isToolResultBlock(entry));
|
|
33
|
-
}
|
|
34
|
-
return isToolResultBlock(payload.content);
|
|
35
|
-
}
|
|
36
|
-
function isToolResultBlock(block) {
|
|
37
|
-
if (!block) {
|
|
38
|
-
return false;
|
|
39
|
-
}
|
|
40
|
-
return (block.type === "tool_result" ||
|
|
41
|
-
block.subtype === "tool_result" ||
|
|
42
|
-
typeof block.tool_use_id === "string");
|
|
43
|
-
}
|
|
44
|
-
function extractToolUseId(payload) {
|
|
45
|
-
if (!payload) {
|
|
46
|
-
return undefined;
|
|
47
|
-
}
|
|
48
|
-
if (typeof payload.tool_use_id === "string") {
|
|
49
|
-
return payload.tool_use_id;
|
|
50
|
-
}
|
|
51
|
-
if (Array.isArray(payload.content)) {
|
|
52
|
-
const match = payload.content.find((entry) => entry && typeof entry.tool_use_id === "string");
|
|
53
|
-
if (match) {
|
|
54
|
-
return match.tool_use_id;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
if (payload.content && typeof payload.content === "object") {
|
|
58
|
-
return extractToolUseId(payload.content);
|
|
59
|
-
}
|
|
60
|
-
return undefined;
|
|
61
|
-
}
|
|
62
|
-
function truncateStringsRecursively(value, context) {
|
|
63
|
-
if (typeof value === "string") {
|
|
64
|
-
return truncateStringValue(value, context);
|
|
65
|
-
}
|
|
66
|
-
if (Array.isArray(value)) {
|
|
67
|
-
let mutated = false;
|
|
68
|
-
let result = value;
|
|
69
|
-
for (let i = 0; i < value.length; i++) {
|
|
70
|
-
const [newItem, changed] = truncateStringsRecursively(value[i], context);
|
|
71
|
-
if (changed) {
|
|
72
|
-
if (!mutated) {
|
|
73
|
-
result = value.slice();
|
|
74
|
-
mutated = true;
|
|
75
|
-
}
|
|
76
|
-
result[i] = newItem;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
return [result, mutated];
|
|
80
|
-
}
|
|
81
|
-
if (value && typeof value === "object") {
|
|
82
|
-
let mutated = false;
|
|
83
|
-
let result = value;
|
|
84
|
-
for (const key of Object.keys(value)) {
|
|
85
|
-
const [newVal, changed] = truncateStringsRecursively(value[key], context);
|
|
86
|
-
if (changed) {
|
|
87
|
-
if (!mutated) {
|
|
88
|
-
result = { ...value };
|
|
89
|
-
mutated = true;
|
|
90
|
-
}
|
|
91
|
-
result[key] = newVal;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
return [result, mutated];
|
|
95
|
-
}
|
|
96
|
-
return [value, false];
|
|
97
|
-
}
|
|
98
|
-
function truncateStringValue(value, context) {
|
|
99
|
-
if (context.bytesRemaining <= 0) {
|
|
100
|
-
if (value.length === 0) {
|
|
101
|
-
return [value, false];
|
|
102
|
-
}
|
|
103
|
-
context.truncated = true;
|
|
104
|
-
return ["", true];
|
|
105
|
-
}
|
|
106
|
-
const byteLength = Buffer.byteLength(value, "utf8");
|
|
107
|
-
if (byteLength <= context.bytesRemaining) {
|
|
108
|
-
context.bytesRemaining -= byteLength;
|
|
109
|
-
return [value, false];
|
|
110
|
-
}
|
|
111
|
-
const suffixBytes = Buffer.byteLength(TOOL_RESPONSE_SUFFIX, "utf8");
|
|
112
|
-
const maxBytes = Math.max(0, context.bytesRemaining - suffixBytes);
|
|
113
|
-
const truncatedBuffer = Buffer.from(value, "utf8").subarray(0, maxBytes);
|
|
114
|
-
context.bytesRemaining = 0;
|
|
115
|
-
context.truncated = true;
|
|
116
|
-
return [truncatedBuffer.toString("utf8") + TOOL_RESPONSE_SUFFIX, true];
|
|
117
|
-
}
|
|
118
|
-
//# sourceMappingURL=tool-response-sanitizer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tool-response-sanitizer.js","sourceRoot":"","sources":["../../src/utils/tool-response-sanitizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Coordinates runner auto-updates.
|
|
3
|
-
*
|
|
4
|
-
* When the server sends an expectedRunnerVersion that is newer than the current
|
|
5
|
-
* version, the coordinator notes the pending update and waits for the runner to
|
|
6
|
-
* become idle (no active conversations) before executing the update.
|
|
7
|
-
*
|
|
8
|
-
* The update is performed by spawning a new process with npx, which ensures
|
|
9
|
-
* the latest version is fetched and executed with the same arguments/env.
|
|
10
|
-
*/
|
|
11
|
-
export type UpdateState = "idle" | "pending" | "updating" | "restarting";
|
|
12
|
-
export interface UpdateCoordinatorOptions {
|
|
13
|
-
/** If true, auto-updates are disabled */
|
|
14
|
-
autoUpdateDisabled: boolean;
|
|
15
|
-
/** Returns the current number of active conversations */
|
|
16
|
-
getActiveConversationCount: () => number;
|
|
17
|
-
/** Saves runner state before restart */
|
|
18
|
-
saveState: () => Promise<void>;
|
|
19
|
-
/** Gets the config path for restart args */
|
|
20
|
-
getConfigPath: () => string | undefined;
|
|
21
|
-
}
|
|
22
|
-
export declare class UpdateCoordinator {
|
|
23
|
-
private state;
|
|
24
|
-
private pendingVersion;
|
|
25
|
-
private readonly options;
|
|
26
|
-
constructor(options: UpdateCoordinatorOptions);
|
|
27
|
-
get currentState(): UpdateState;
|
|
28
|
-
get hasPendingUpdate(): boolean;
|
|
29
|
-
get pendingVersionNumber(): string | null;
|
|
30
|
-
/**
|
|
31
|
-
* Called when a message is received with an expectedRunnerVersion.
|
|
32
|
-
* If the version is newer, marks an update as pending.
|
|
33
|
-
* If the runner is already idle, triggers the update immediately.
|
|
34
|
-
*
|
|
35
|
-
* @returns true if an update was triggered or marked as pending
|
|
36
|
-
*/
|
|
37
|
-
checkVersion(serverVersion: string): Promise<boolean>;
|
|
38
|
-
/**
|
|
39
|
-
* Called when a conversation ends. If there's a pending update and the
|
|
40
|
-
* runner is now idle, triggers the update.
|
|
41
|
-
*/
|
|
42
|
-
onConversationEnd(): Promise<void>;
|
|
43
|
-
/**
|
|
44
|
-
* Executes the update by spawning a new runner process and exiting.
|
|
45
|
-
*/
|
|
46
|
-
private executeUpdate;
|
|
47
|
-
/**
|
|
48
|
-
* Builds the command-line arguments for the restarted runner.
|
|
49
|
-
* Most config is passed via environment variables which are inherited.
|
|
50
|
-
*/
|
|
51
|
-
private buildRestartArgs;
|
|
52
|
-
}
|
|
53
|
-
//# sourceMappingURL=update-coordinator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"update-coordinator.d.ts","sourceRoot":"","sources":["../../src/utils/update-coordinator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,SAAS,GACT,UAAU,GACV,YAAY,CAAC;AAEjB,MAAM,WAAW,wBAAwB;IACvC,yCAAyC;IACzC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,yDAAyD;IACzD,0BAA0B,EAAE,MAAM,MAAM,CAAC;IACzC,wCAAwC;IACxC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,4CAA4C;IAC5C,aAAa,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CACzC;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;gBAEvC,OAAO,EAAE,wBAAwB;IAI7C,IAAI,YAAY,IAAI,WAAW,CAE9B;IAED,IAAI,gBAAgB,IAAI,OAAO,CAE9B;IAED,IAAI,oBAAoB,IAAI,MAAM,GAAG,IAAI,CAExC;IAED;;;;;;OAMG;IACG,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2C3D;;;OAGG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBxC;;OAEG;YACW,aAAa;IAwD3B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CAsBzB"}
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Coordinates runner auto-updates.
|
|
3
|
-
*
|
|
4
|
-
* When the server sends an expectedRunnerVersion that is newer than the current
|
|
5
|
-
* version, the coordinator notes the pending update and waits for the runner to
|
|
6
|
-
* become idle (no active conversations) before executing the update.
|
|
7
|
-
*
|
|
8
|
-
* The update is performed by spawning a new process with npx, which ensures
|
|
9
|
-
* the latest version is fetched and executed with the same arguments/env.
|
|
10
|
-
*/
|
|
11
|
-
import { spawn } from "child_process";
|
|
12
|
-
import { logger } from "./logger.js";
|
|
13
|
-
import { RUNNER_VERSION, isNewerVersion } from "./version.js";
|
|
14
|
-
export class UpdateCoordinator {
|
|
15
|
-
state = "idle";
|
|
16
|
-
pendingVersion = null;
|
|
17
|
-
options;
|
|
18
|
-
constructor(options) {
|
|
19
|
-
this.options = options;
|
|
20
|
-
}
|
|
21
|
-
get currentState() {
|
|
22
|
-
return this.state;
|
|
23
|
-
}
|
|
24
|
-
get hasPendingUpdate() {
|
|
25
|
-
return this.state === "pending";
|
|
26
|
-
}
|
|
27
|
-
get pendingVersionNumber() {
|
|
28
|
-
return this.pendingVersion;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Called when a message is received with an expectedRunnerVersion.
|
|
32
|
-
* If the version is newer, marks an update as pending.
|
|
33
|
-
* If the runner is already idle, triggers the update immediately.
|
|
34
|
-
*
|
|
35
|
-
* @returns true if an update was triggered or marked as pending
|
|
36
|
-
*/
|
|
37
|
-
async checkVersion(serverVersion) {
|
|
38
|
-
if (this.options.autoUpdateDisabled) {
|
|
39
|
-
logger.debug("Auto-update disabled via NORTHFLARE_DISABLE_AUTO_UPDATE");
|
|
40
|
-
return false;
|
|
41
|
-
}
|
|
42
|
-
// Already handling an update
|
|
43
|
-
if (this.state !== "idle" && this.state !== "pending") {
|
|
44
|
-
logger.debug("Update already in progress", { state: this.state });
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
// Check if server version is newer
|
|
48
|
-
if (!isNewerVersion(serverVersion, RUNNER_VERSION)) {
|
|
49
|
-
return false;
|
|
50
|
-
}
|
|
51
|
-
// Already have this version pending
|
|
52
|
-
if (this.pendingVersion === serverVersion) {
|
|
53
|
-
return false;
|
|
54
|
-
}
|
|
55
|
-
// Mark update as pending
|
|
56
|
-
this.pendingVersion = serverVersion;
|
|
57
|
-
this.state = "pending";
|
|
58
|
-
logger.info(`Update available: ${serverVersion} (current: ${RUNNER_VERSION}). ` +
|
|
59
|
-
`Will update when idle.`);
|
|
60
|
-
// If already idle, update now
|
|
61
|
-
if (this.options.getActiveConversationCount() === 0) {
|
|
62
|
-
await this.executeUpdate();
|
|
63
|
-
return true;
|
|
64
|
-
}
|
|
65
|
-
logger.info(`${this.options.getActiveConversationCount()} active conversation(s). ` +
|
|
66
|
-
`Update will proceed when all complete.`);
|
|
67
|
-
return true;
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Called when a conversation ends. If there's a pending update and the
|
|
71
|
-
* runner is now idle, triggers the update.
|
|
72
|
-
*/
|
|
73
|
-
async onConversationEnd() {
|
|
74
|
-
if (this.state !== "pending" || !this.pendingVersion) {
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
const activeCount = this.options.getActiveConversationCount();
|
|
78
|
-
if (activeCount > 0) {
|
|
79
|
-
logger.debug(`Conversation ended, but ${activeCount} still active. ` +
|
|
80
|
-
`Waiting for idle before update.`);
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
logger.info("Runner now idle, proceeding with pending update");
|
|
84
|
-
await this.executeUpdate();
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Executes the update by spawning a new runner process and exiting.
|
|
88
|
-
*/
|
|
89
|
-
async executeUpdate() {
|
|
90
|
-
if (!this.pendingVersion) {
|
|
91
|
-
logger.error("executeUpdate called but no pending version");
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
this.state = "updating";
|
|
95
|
-
logger.info(`Installing @northflare/runner@${this.pendingVersion}...`);
|
|
96
|
-
try {
|
|
97
|
-
// Save state before restart so we don't lose lastProcessedAt, etc.
|
|
98
|
-
await this.options.saveState();
|
|
99
|
-
logger.debug("State saved before update");
|
|
100
|
-
}
|
|
101
|
-
catch (error) {
|
|
102
|
-
logger.error("Failed to save state before update:", error);
|
|
103
|
-
// Continue anyway - better to update than to stay on old version
|
|
104
|
-
}
|
|
105
|
-
// Build the npx command
|
|
106
|
-
// Using -y to auto-confirm and specifying the exact version
|
|
107
|
-
const npxCommand = "npx";
|
|
108
|
-
const npxArgs = [
|
|
109
|
-
"-y",
|
|
110
|
-
`@northflare/runner@${this.pendingVersion}`,
|
|
111
|
-
...this.buildRestartArgs(),
|
|
112
|
-
];
|
|
113
|
-
logger.info(`Restarting with: ${npxCommand} ${npxArgs.join(" ")}`);
|
|
114
|
-
this.state = "restarting";
|
|
115
|
-
// Spawn new process detached so it survives our exit
|
|
116
|
-
const child = spawn(npxCommand, npxArgs, {
|
|
117
|
-
detached: true,
|
|
118
|
-
stdio: "inherit",
|
|
119
|
-
env: process.env,
|
|
120
|
-
shell: true,
|
|
121
|
-
});
|
|
122
|
-
// Prevent parent from waiting for child
|
|
123
|
-
child.unref();
|
|
124
|
-
// Handle spawn errors
|
|
125
|
-
child.on("error", (error) => {
|
|
126
|
-
logger.error("Failed to spawn update process:", error);
|
|
127
|
-
// Reset state so we can try again
|
|
128
|
-
this.state = "pending";
|
|
129
|
-
});
|
|
130
|
-
// Give the new process a moment to start before we exit
|
|
131
|
-
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
132
|
-
// Exit current process
|
|
133
|
-
logger.info("Exiting for update...");
|
|
134
|
-
process.exit(0);
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Builds the command-line arguments for the restarted runner.
|
|
138
|
-
* Most config is passed via environment variables which are inherited.
|
|
139
|
-
*/
|
|
140
|
-
buildRestartArgs() {
|
|
141
|
-
const args = [];
|
|
142
|
-
// Add start command explicitly
|
|
143
|
-
args.push("start");
|
|
144
|
-
// Config path if provided
|
|
145
|
-
const configPath = this.options.getConfigPath();
|
|
146
|
-
if (configPath) {
|
|
147
|
-
args.push("--config", configPath);
|
|
148
|
-
}
|
|
149
|
-
// Other options are passed via inherited env vars:
|
|
150
|
-
// - NORTHFLARE_RUNNER_TOKEN
|
|
151
|
-
// - NORTHFLARE_WORKSPACE_PATH
|
|
152
|
-
// - NORTHFLARE_DATA_DIR
|
|
153
|
-
// - NORTHFLARE_RUNNER_DEBUG
|
|
154
|
-
// - NORTHFLARE_RUNNER_INACTIVITY_TIMEOUT
|
|
155
|
-
// - NORTHFLARE_ORCHESTRATOR_URL
|
|
156
|
-
return args;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
//# sourceMappingURL=update-coordinator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"update-coordinator.js","sourceRoot":"","sources":["../../src/utils/update-coordinator.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/version.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Version utilities for runner auto-update
|
|
3
|
-
*/
|
|
4
|
-
export declare const RUNNER_VERSION: string;
|
|
5
|
-
/**
|
|
6
|
-
* Compare two semver versions.
|
|
7
|
-
* Returns true if serverVersion is newer than currentVersion.
|
|
8
|
-
*/
|
|
9
|
-
export declare function isNewerVersion(serverVersion: string, currentVersion: string): boolean;
|
|
10
|
-
//# sourceMappingURL=version.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,eAAO,MAAM,cAAc,EAAE,MAAoB,CAAC;AAElD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAoBrF"}
|
package/dist/utils/version.js
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Version utilities for runner auto-update
|
|
3
|
-
*/
|
|
4
|
-
import { createRequire } from "module";
|
|
5
|
-
const require = createRequire(import.meta.url);
|
|
6
|
-
const pkg = require("../../package.json");
|
|
7
|
-
export const RUNNER_VERSION = pkg.version;
|
|
8
|
-
/**
|
|
9
|
-
* Compare two semver versions.
|
|
10
|
-
* Returns true if serverVersion is newer than currentVersion.
|
|
11
|
-
*/
|
|
12
|
-
export function isNewerVersion(serverVersion, currentVersion) {
|
|
13
|
-
const parse = (v) => {
|
|
14
|
-
// Handle versions like "0.0.26" or "1.2.3-beta.1"
|
|
15
|
-
const match = v.match(/^(\d+)\.(\d+)\.(\d+)/);
|
|
16
|
-
if (!match) {
|
|
17
|
-
return [0, 0, 0];
|
|
18
|
-
}
|
|
19
|
-
return [
|
|
20
|
-
parseInt(match[1], 10),
|
|
21
|
-
parseInt(match[2], 10),
|
|
22
|
-
parseInt(match[3], 10),
|
|
23
|
-
];
|
|
24
|
-
};
|
|
25
|
-
const [sMajor, sMinor, sPatch] = parse(serverVersion);
|
|
26
|
-
const [cMajor, cMinor, cPatch] = parse(currentVersion);
|
|
27
|
-
if (sMajor !== cMajor)
|
|
28
|
-
return sMajor > cMajor;
|
|
29
|
-
if (sMinor !== cMinor)
|
|
30
|
-
return sMinor > cMinor;
|
|
31
|
-
return sPatch > cPatch;
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=version.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAE1C,MAAM,CAAC,MAAM,cAAc,GAAW,GAAG,CAAC,OAAO,CAAC;AAElD;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,aAAqB,EAAE,cAAsB;IAC1E,MAAM,KAAK,GAAG,CAAC,CAAS,EAA4B,EAAE;QACpD,kDAAkD;QAClD,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACnB,CAAC;QACD,OAAO;YACL,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC;YACvB,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC;YACvB,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC;SACxB,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;IACtD,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;IAEvD,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,MAAM,GAAG,MAAM,CAAC;IAC9C,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,MAAM,GAAG,MAAM,CAAC;IAC9C,OAAO,MAAM,GAAG,MAAM,CAAC;AACzB,CAAC"}
|