@northflare/runner 0.0.25 → 0.0.27
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/dist/components/claude-sdk-manager.d.ts +1 -1
- package/dist/components/claude-sdk-manager.d.ts.map +1 -1
- package/dist/components/claude-sdk-manager.js +80 -65
- package/dist/components/claude-sdk-manager.js.map +1 -1
- package/dist/components/codex-sdk-manager.d.ts +18 -0
- package/dist/components/codex-sdk-manager.d.ts.map +1 -1
- package/dist/components/codex-sdk-manager.js +210 -8
- package/dist/components/codex-sdk-manager.js.map +1 -1
- package/dist/components/message-handler-sse.d.ts +7 -0
- package/dist/components/message-handler-sse.d.ts.map +1 -1
- package/dist/components/message-handler-sse.js +75 -11
- package/dist/components/message-handler-sse.js.map +1 -1
- package/dist/components/northflare-agent-sdk-manager.d.ts +9 -0
- package/dist/components/northflare-agent-sdk-manager.d.ts.map +1 -1
- package/dist/components/northflare-agent-sdk-manager.js +159 -20
- package/dist/components/northflare-agent-sdk-manager.js.map +1 -1
- package/dist/runner-sse.d.ts +16 -0
- package/dist/runner-sse.d.ts.map +1 -1
- package/dist/runner-sse.js +55 -7
- package/dist/runner-sse.js.map +1 -1
- package/dist/services/SSEClient.d.ts +2 -0
- package/dist/services/SSEClient.d.ts.map +1 -1
- package/dist/services/SSEClient.js +4 -1
- package/dist/services/SSEClient.js.map +1 -1
- package/dist/types/claude.d.ts +7 -2
- package/dist/types/claude.d.ts.map +1 -1
- package/dist/types/messages.d.ts +2 -0
- package/dist/types/messages.d.ts.map +1 -1
- package/dist/types/runner-interface.d.ts +3 -0
- package/dist/types/runner-interface.d.ts.map +1 -1
- package/dist/utils/StateManager.d.ts +10 -1
- package/dist/utils/StateManager.d.ts.map +1 -1
- package/dist/utils/StateManager.js +38 -23
- package/dist/utils/StateManager.js.map +1 -1
- package/dist/utils/update-coordinator.d.ts +53 -0
- package/dist/utils/update-coordinator.d.ts.map +1 -0
- package/dist/utils/update-coordinator.js +159 -0
- package/dist/utils/update-coordinator.js.map +1 -0
- package/dist/utils/version.d.ts +10 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +33 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +2 -2
package/dist/types/claude.d.ts
CHANGED
|
@@ -6,7 +6,12 @@ import type { Thread } from "@northflare/codex-sdk";
|
|
|
6
6
|
export interface AgentConversation {
|
|
7
7
|
send: (payload: {
|
|
8
8
|
type: string;
|
|
9
|
-
text
|
|
9
|
+
text?: string;
|
|
10
|
+
content?: Array<{
|
|
11
|
+
type: string;
|
|
12
|
+
text?: string;
|
|
13
|
+
image?: string;
|
|
14
|
+
}>;
|
|
10
15
|
}) => void;
|
|
11
16
|
end: () => Promise<void> | void;
|
|
12
17
|
}
|
|
@@ -66,7 +71,7 @@ export interface CodexAuthConfig {
|
|
|
66
71
|
lastRefresh?: string | null;
|
|
67
72
|
}
|
|
68
73
|
export interface Message {
|
|
69
|
-
content:
|
|
74
|
+
content: any;
|
|
70
75
|
role?: "user" | "assistant";
|
|
71
76
|
}
|
|
72
77
|
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/types/claude.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,CAAC,OAAO,EAAE;
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/types/claude.ts"],"names":[],"mappings":"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"}
|
package/dist/types/messages.d.ts
CHANGED
|
@@ -26,6 +26,8 @@ export interface RunnerMessage {
|
|
|
26
26
|
payload: JsonRpcMessage;
|
|
27
27
|
createdAt: string;
|
|
28
28
|
expiresAt: string;
|
|
29
|
+
/** Server's expected runner version. If newer than current, triggers auto-update. */
|
|
30
|
+
expectedRunnerVersion?: string;
|
|
29
31
|
}
|
|
30
32
|
export type MethodHandler = (params: any, message: RunnerMessage) => Promise<void>;
|
|
31
33
|
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/types/messages.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAGD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,WAAW,GAAG,iBAAiB,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,sBAAsB,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC7C,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/types/messages.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAGD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,WAAW,GAAG,iBAAiB,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,sBAAsB,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC7C,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAGD,MAAM,MAAM,aAAa,GAAG,CAC1B,MAAM,EAAE,GAAG,EACX,OAAO,EAAE,aAAa,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -29,5 +29,8 @@ export interface IRunnerApp {
|
|
|
29
29
|
getPreHandoffConversations(): Set<string>;
|
|
30
30
|
updateLastProcessedAt?(timestamp: Date | null): Promise<void>;
|
|
31
31
|
replaceRunnerRepos?(repos: RunnerRepo[]): Promise<void>;
|
|
32
|
+
checkForUpdate(serverVersion: string): Promise<void>;
|
|
33
|
+
onConversationEnd(): Promise<void>;
|
|
34
|
+
hasPendingUpdate(): boolean;
|
|
32
35
|
}
|
|
33
36
|
//# sourceMappingURL=runner-interface.d.ts.map
|
|
@@ -1 +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,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAC;AAEzF,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;IAChF,wBAAwB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1D,yBAAyB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAGxD,IAAI,OAAO,IAAI,YAAY,CAAC;IAC5B,IAAI,oBAAoB,IAAI,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC7D,IAAI,cAAc,IAAI,aAAa,CAAC;IACpC,IAAI,aAAa,IAAI,YAAY,CAAC;IAClC,IAAI,uBAAuB,IAAI,sBAAsB,CAAC;IACtD,IAAI,kBAAkB,IAAI,yBAAyB,CAAC;IACpD,aAAa,CAAC,IAAI,MAAM,GAAG,SAAS,CAAC;IACrC,gBAAgB,CAAC,IAAI,MAAM,GAAG,SAAS,CAAC;IAGxC,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;IAC9D,kBAAkB,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
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,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAC;AAEzF,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;IAChF,wBAAwB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1D,yBAAyB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAGxD,IAAI,OAAO,IAAI,YAAY,CAAC;IAC5B,IAAI,oBAAoB,IAAI,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC7D,IAAI,cAAc,IAAI,aAAa,CAAC;IACpC,IAAI,aAAa,IAAI,YAAY,CAAC;IAClC,IAAI,uBAAuB,IAAI,sBAAsB,CAAC;IACtD,IAAI,kBAAkB,IAAI,yBAAyB,CAAC;IACpD,aAAa,CAAC,IAAI,MAAM,GAAG,SAAS,CAAC;IACrC,gBAAgB,CAAC,IAAI,MAAM,GAAG,SAAS,CAAC;IAGxC,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;IAC9D,kBAAkB,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAGxD,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,gBAAgB,IAAI,OAAO,CAAC;CAC7B"}
|
|
@@ -21,11 +21,20 @@ export declare class StateManager {
|
|
|
21
21
|
*/
|
|
22
22
|
loadState(): Promise<RunnerState | null>;
|
|
23
23
|
/**
|
|
24
|
-
* Save state to disk
|
|
24
|
+
* Save state to disk (debounced for non-critical updates)
|
|
25
25
|
*/
|
|
26
26
|
saveState(state: RunnerState): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Write state to disk immediately (no debounce)
|
|
29
|
+
* Used for critical state like lastProcessedAt watermark
|
|
30
|
+
*/
|
|
31
|
+
private writeStateToDisk;
|
|
27
32
|
/**
|
|
28
33
|
* Update lastProcessedAt timestamp
|
|
34
|
+
*
|
|
35
|
+
* CRITICAL: This writes to disk immediately (no debounce) to prevent
|
|
36
|
+
* message replay on runner reconnection. If the watermark isn't persisted
|
|
37
|
+
* before a disconnect, already-processed messages will be replayed.
|
|
29
38
|
*/
|
|
30
39
|
updateLastProcessedAt(timestamp: Date | string): Promise<void>;
|
|
31
40
|
/**
|
|
@@ -1 +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;
|
|
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;IAelD;;;OAGG;YACW,gBAAgB;IAyB9B;;;;;;OAMG;IACG,qBAAqB,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBpE;;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"}
|
|
@@ -42,7 +42,7 @@ export class StateManager {
|
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
/**
|
|
45
|
-
* Save state to disk
|
|
45
|
+
* Save state to disk (debounced for non-critical updates)
|
|
46
46
|
*/
|
|
47
47
|
async saveState(state) {
|
|
48
48
|
this.state = state;
|
|
@@ -51,31 +51,43 @@ export class StateManager {
|
|
|
51
51
|
clearTimeout(this.saveTimer);
|
|
52
52
|
}
|
|
53
53
|
// Debounce saves to avoid excessive disk writes
|
|
54
|
+
// NOTE: lastProcessedAt updates use saveStateImmediate() instead
|
|
54
55
|
this.saveTimer = setTimeout(async () => {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
56
|
+
await this.writeStateToDisk(state);
|
|
57
|
+
}, 1000); // 1 second debounce for non-critical state
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Write state to disk immediately (no debounce)
|
|
61
|
+
* Used for critical state like lastProcessedAt watermark
|
|
62
|
+
*/
|
|
63
|
+
async writeStateToDisk(state) {
|
|
64
|
+
try {
|
|
65
|
+
// Ensure directory exists
|
|
66
|
+
const dir = path.dirname(this.statePath);
|
|
67
|
+
await fs.mkdir(dir, { recursive: true });
|
|
68
|
+
// Update timestamp
|
|
69
|
+
state.updatedAt = new Date().toISOString();
|
|
70
|
+
// Write atomically by writing to temp file first
|
|
71
|
+
const tempPath = `${this.statePath}.tmp`;
|
|
72
|
+
await fs.writeFile(tempPath, JSON.stringify(state, null, 2), 'utf-8');
|
|
73
|
+
await fs.rename(tempPath, this.statePath);
|
|
74
|
+
logger.debug('Saved runner state', {
|
|
75
|
+
runnerId: state.runnerId,
|
|
76
|
+
lastProcessedAt: state.lastProcessedAt,
|
|
77
|
+
isActiveRunner: state.isActiveRunner,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
logger.error('Failed to save state file:', error);
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
76
84
|
}
|
|
77
85
|
/**
|
|
78
86
|
* Update lastProcessedAt timestamp
|
|
87
|
+
*
|
|
88
|
+
* CRITICAL: This writes to disk immediately (no debounce) to prevent
|
|
89
|
+
* message replay on runner reconnection. If the watermark isn't persisted
|
|
90
|
+
* before a disconnect, already-processed messages will be replayed.
|
|
79
91
|
*/
|
|
80
92
|
async updateLastProcessedAt(timestamp) {
|
|
81
93
|
if (!this.state) {
|
|
@@ -86,7 +98,10 @@ export class StateManager {
|
|
|
86
98
|
...this.state,
|
|
87
99
|
lastProcessedAt: isoString,
|
|
88
100
|
};
|
|
89
|
-
|
|
101
|
+
// Update in-memory state immediately
|
|
102
|
+
this.state = updatedState;
|
|
103
|
+
// Write to disk immediately - critical for correctness on reconnection
|
|
104
|
+
await this.writeStateToDisk(updatedState);
|
|
90
105
|
}
|
|
91
106
|
/**
|
|
92
107
|
* Update runner registration details
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StateManager.js","sourceRoot":"","sources":["../../src/utils/StateManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,MAAM,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;AAU5C,MAAM,OAAO,YAAY;IACf,SAAS,CAAS;IAClB,KAAK,GAAuB,IAAI,CAAC;IACjC,SAAS,GAA0B,IAAI,CAAC;IAEhD,YAAY,OAAe,EAAE,QAAgB;QAC3C,oFAAoF;QACpF,MAAM,SAAS,GAAG,gBAAgB,QAAQ,OAAO,CAAC;QAClD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC3D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE;gBACjC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ;gBAC9B,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS;gBAChC,eAAe,EAAE,IAAI,CAAC,KAAK,EAAE,eAAe;gBAC5C,cAAc,EAAE,IAAI,CAAC,KAAK,EAAE,cAAc;aAC3C,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAAa,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBACpD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,KAAkB;QAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAEnB,0BAA0B;QAC1B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;QAED,gDAAgD;QAChD,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YACrC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"StateManager.js","sourceRoot":"","sources":["../../src/utils/StateManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,159 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-coordinator.js","sourceRoot":"","sources":["../../src/utils/update-coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@northflare/runner",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.27",
|
|
4
4
|
"description": "Distributed conversation runner for Northflare",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"@anthropic-ai/claude-agent-sdk": "0.1.51",
|
|
13
13
|
"@botanicastudios/claude-code-sdk-ts": "0.2.22-fork",
|
|
14
14
|
"@botanicastudios/mcp-host-rpc": "^0.4.0",
|
|
15
|
-
"@openai/codex-sdk": "^0.
|
|
15
|
+
"@openai/codex-sdk": "^0.77.0",
|
|
16
16
|
"@openrouter/ai-sdk-provider": "^1.2.8",
|
|
17
17
|
"@tanstack/react-query": "^5.x.x",
|
|
18
18
|
"@types/jsonwebtoken": "^9.0.10",
|