@northflare/runner 0.0.14 → 0.0.17
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 +8 -5
- package/bin/northflare-runner +44 -16
- package/dist/components/claude-sdk-manager.d.ts +3 -3
- package/dist/components/claude-sdk-manager.d.ts.map +1 -1
- package/dist/components/claude-sdk-manager.js +80 -111
- package/dist/components/claude-sdk-manager.js.map +1 -1
- package/dist/components/codex-sdk-manager.d.ts +15 -6
- package/dist/components/codex-sdk-manager.d.ts.map +1 -1
- package/dist/components/codex-sdk-manager.js +128 -97
- package/dist/components/codex-sdk-manager.js.map +1 -1
- package/dist/components/enhanced-repository-manager.d.ts +2 -2
- package/dist/components/enhanced-repository-manager.d.ts.map +1 -1
- package/dist/components/enhanced-repository-manager.js +68 -75
- package/dist/components/enhanced-repository-manager.js.map +1 -1
- package/dist/components/message-handler-sse.d.ts +1 -1
- package/dist/components/message-handler-sse.d.ts.map +1 -1
- package/dist/components/message-handler-sse.js +205 -97
- package/dist/components/message-handler-sse.js.map +1 -1
- package/dist/components/{claude-manager.d.ts → northflare-agent-sdk-manager.d.ts} +17 -14
- package/dist/components/northflare-agent-sdk-manager.d.ts.map +1 -0
- package/dist/components/northflare-agent-sdk-manager.js +1456 -0
- package/dist/components/northflare-agent-sdk-manager.js.map +1 -0
- package/dist/components/repository-manager.d.ts +2 -2
- package/dist/components/repository-manager.d.ts.map +1 -1
- package/dist/components/repository-manager.js +34 -74
- package/dist/components/repository-manager.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +115 -79
- package/dist/index.js.map +1 -1
- package/dist/runner-sse.d.ts +22 -5
- package/dist/runner-sse.d.ts.map +1 -1
- package/dist/runner-sse.js +95 -74
- package/dist/runner-sse.js.map +1 -1
- package/dist/services/RunnerAPIClient.d.ts +1 -1
- package/dist/services/RunnerAPIClient.d.ts.map +1 -1
- package/dist/services/RunnerAPIClient.js +3 -7
- package/dist/services/RunnerAPIClient.js.map +1 -1
- package/dist/services/SSEClient.js +5 -9
- package/dist/services/SSEClient.js.map +1 -1
- package/dist/types/claude.d.ts +16 -2
- package/dist/types/claude.d.ts.map +1 -1
- package/dist/types/claude.js +1 -2
- package/dist/types/claude.js.map +1 -1
- package/dist/types/index.d.ts +5 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -19
- package/dist/types/index.js.map +1 -1
- package/dist/types/messages.js +1 -2
- package/dist/types/messages.js.map +1 -1
- package/dist/types/runner-interface.d.ts +8 -4
- package/dist/types/runner-interface.d.ts.map +1 -1
- package/dist/types/runner-interface.js +1 -2
- package/dist/types/runner-interface.js.map +1 -1
- package/dist/utils/StateManager.js +12 -19
- package/dist/utils/StateManager.js.map +1 -1
- package/dist/utils/config.d.ts +1 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +19 -26
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/console.js +3 -6
- package/dist/utils/console.js.map +1 -1
- package/dist/utils/debug.js +1 -4
- package/dist/utils/debug.js.map +1 -1
- package/dist/utils/expand-env.js +1 -4
- package/dist/utils/expand-env.js.map +1 -1
- package/dist/utils/inactivity-timeout.d.ts +19 -0
- package/dist/utils/inactivity-timeout.d.ts.map +1 -0
- package/dist/utils/inactivity-timeout.js +72 -0
- package/dist/utils/inactivity-timeout.js.map +1 -0
- package/dist/utils/logger.js +21 -29
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/model.d.ts +3 -1
- package/dist/utils/model.d.ts.map +1 -1
- package/dist/utils/model.js +18 -4
- package/dist/utils/model.js.map +1 -1
- package/dist/utils/status-line.d.ts +1 -0
- package/dist/utils/status-line.d.ts.map +1 -1
- package/dist/utils/status-line.js +25 -18
- package/dist/utils/status-line.js.map +1 -1
- package/dist/utils/tool-response-sanitizer.js +6 -10
- package/dist/utils/tool-response-sanitizer.js.map +1 -1
- package/lib/codex-sdk/dist/index.d.ts +1 -1
- package/lib/codex-sdk/dist/samples/basic_streaming.d.ts +3 -0
- package/lib/codex-sdk/dist/samples/basic_streaming.d.ts.map +1 -0
- package/lib/codex-sdk/dist/samples/basic_streaming.js +81 -0
- package/lib/codex-sdk/dist/samples/basic_streaming.js.map +1 -0
- package/lib/codex-sdk/dist/samples/helpers.d.ts +2 -0
- package/lib/codex-sdk/dist/samples/helpers.d.ts.map +1 -0
- package/lib/codex-sdk/dist/samples/helpers.js +6 -0
- package/lib/codex-sdk/dist/samples/helpers.js.map +1 -0
- package/lib/codex-sdk/dist/samples/structured_output.d.ts +3 -0
- package/lib/codex-sdk/dist/samples/structured_output.d.ts.map +1 -0
- package/lib/codex-sdk/dist/samples/structured_output.js +17 -0
- package/lib/codex-sdk/dist/samples/structured_output.js.map +1 -0
- package/lib/codex-sdk/dist/samples/structured_output_zod.d.ts +3 -0
- package/lib/codex-sdk/dist/samples/structured_output_zod.d.ts.map +1 -0
- package/lib/codex-sdk/dist/samples/structured_output_zod.js +16 -0
- package/lib/codex-sdk/dist/samples/structured_output_zod.js.map +1 -0
- package/lib/codex-sdk/dist/src/codex.d.ts +27 -0
- package/lib/codex-sdk/dist/src/codex.d.ts.map +1 -0
- package/lib/codex-sdk/dist/src/codex.js +33 -0
- package/lib/codex-sdk/dist/src/codex.js.map +1 -0
- package/lib/codex-sdk/dist/src/codexOptions.d.ts +11 -0
- package/lib/codex-sdk/dist/src/codexOptions.d.ts.map +1 -0
- package/lib/codex-sdk/dist/src/codexOptions.js +2 -0
- package/lib/codex-sdk/dist/src/codexOptions.js.map +1 -0
- package/lib/codex-sdk/dist/src/events.d.ts +60 -0
- package/lib/codex-sdk/dist/src/events.d.ts.map +1 -0
- package/lib/codex-sdk/dist/src/events.js +3 -0
- package/lib/codex-sdk/dist/src/events.js.map +1 -0
- package/lib/codex-sdk/dist/src/exec.d.ts +27 -0
- package/lib/codex-sdk/dist/src/exec.d.ts.map +1 -0
- package/lib/codex-sdk/dist/src/exec.js +264 -0
- package/lib/codex-sdk/dist/src/exec.js.map +1 -0
- package/lib/codex-sdk/dist/src/index.d.ts +9 -0
- package/lib/codex-sdk/dist/src/index.d.ts.map +1 -0
- package/lib/codex-sdk/dist/src/index.js +3 -0
- package/lib/codex-sdk/dist/src/index.js.map +1 -0
- package/lib/codex-sdk/dist/src/items.d.ts +103 -0
- package/lib/codex-sdk/dist/src/items.d.ts.map +1 -0
- package/lib/codex-sdk/dist/src/items.js +3 -0
- package/lib/codex-sdk/dist/src/items.js.map +1 -0
- package/lib/codex-sdk/dist/src/outputSchemaFile.d.ts +6 -0
- package/lib/codex-sdk/dist/src/outputSchemaFile.d.ts.map +1 -0
- package/lib/codex-sdk/dist/src/outputSchemaFile.js +33 -0
- package/lib/codex-sdk/dist/src/outputSchemaFile.js.map +1 -0
- package/lib/codex-sdk/dist/src/thread.d.ts +41 -0
- package/lib/codex-sdk/dist/src/thread.d.ts.map +1 -0
- package/lib/codex-sdk/dist/src/thread.js +109 -0
- package/lib/codex-sdk/dist/src/thread.js.map +1 -0
- package/lib/codex-sdk/dist/src/threadOptions.d.ts +16 -0
- package/lib/codex-sdk/dist/src/threadOptions.d.ts.map +1 -0
- package/lib/codex-sdk/dist/src/threadOptions.js +2 -0
- package/lib/codex-sdk/dist/src/threadOptions.js.map +1 -0
- package/lib/codex-sdk/dist/src/turnOptions.d.ts +7 -0
- package/lib/codex-sdk/dist/src/turnOptions.d.ts.map +1 -0
- package/lib/codex-sdk/dist/src/turnOptions.js +2 -0
- package/lib/codex-sdk/dist/src/turnOptions.js.map +1 -0
- package/lib/codex-sdk/dist/tests/abort.test.d.ts +2 -0
- package/lib/codex-sdk/dist/tests/abort.test.d.ts.map +1 -0
- package/lib/codex-sdk/dist/tests/abort.test.js +130 -0
- package/lib/codex-sdk/dist/tests/abort.test.js.map +1 -0
- package/lib/codex-sdk/dist/tests/codexExecSpy.d.ts +6 -0
- package/lib/codex-sdk/dist/tests/codexExecSpy.d.ts.map +1 -0
- package/lib/codex-sdk/dist/tests/codexExecSpy.js +28 -0
- package/lib/codex-sdk/dist/tests/codexExecSpy.js.map +1 -0
- package/lib/codex-sdk/dist/tests/responsesProxy.d.ts +56 -0
- package/lib/codex-sdk/dist/tests/responsesProxy.d.ts.map +1 -0
- package/lib/codex-sdk/dist/tests/responsesProxy.js +155 -0
- package/lib/codex-sdk/dist/tests/responsesProxy.js.map +1 -0
- package/lib/codex-sdk/dist/tests/run.test.d.ts +2 -0
- package/lib/codex-sdk/dist/tests/run.test.d.ts.map +1 -0
- package/lib/codex-sdk/dist/tests/run.test.js +524 -0
- package/lib/codex-sdk/dist/tests/run.test.js.map +1 -0
- package/lib/codex-sdk/dist/tests/runStreamed.test.d.ts +2 -0
- package/lib/codex-sdk/dist/tests/runStreamed.test.d.ts.map +1 -0
- package/lib/codex-sdk/dist/tests/runStreamed.test.js +153 -0
- package/lib/codex-sdk/dist/tests/runStreamed.test.js.map +1 -0
- package/lib/codex-sdk/dist/tsup.config.d.ts +3 -0
- package/lib/codex-sdk/dist/tsup.config.js +12 -0
- package/lib/codex-sdk/samples/basic_streaming.ts +0 -0
- package/lib/codex-sdk/samples/structured_output.ts +0 -0
- package/lib/codex-sdk/samples/structured_output_zod.ts +0 -0
- package/lib/codex-sdk/src/codex.ts +38 -0
- package/lib/codex-sdk/src/codexOptions.ts +10 -0
- package/lib/codex-sdk/src/events.ts +80 -0
- package/lib/codex-sdk/src/exec.ts +336 -0
- package/lib/codex-sdk/src/index.ts +39 -0
- package/lib/codex-sdk/src/items.ts +127 -0
- package/lib/codex-sdk/src/outputSchemaFile.ts +40 -0
- package/lib/codex-sdk/src/thread.ts +155 -0
- package/lib/codex-sdk/src/threadOptions.ts +18 -0
- package/lib/codex-sdk/src/turnOptions.ts +6 -0
- package/lib/codex-sdk/tests/abort.test.ts +165 -0
- package/lib/codex-sdk/tests/codexExecSpy.ts +37 -0
- package/lib/codex-sdk/tests/responsesProxy.ts +225 -0
- package/lib/codex-sdk/tests/run.test.ts +687 -0
- package/lib/codex-sdk/tests/runStreamed.test.ts +211 -0
- package/package.json +22 -18
- package/scripts/verify-openrouter-agent.ts +163 -0
- package/dist/collections/runner-messages.d.ts +0 -52
- package/dist/collections/runner-messages.d.ts.map +0 -1
- package/dist/collections/runner-messages.js +0 -161
- package/dist/collections/runner-messages.js.map +0 -1
- package/dist/components/claude-manager.d.ts.map +0 -1
- package/dist/components/claude-manager.js +0 -783
- package/dist/components/claude-manager.js.map +0 -1
- package/dist/components/message-handler.d.ts +0 -35
- package/dist/components/message-handler.d.ts.map +0 -1
- package/dist/components/message-handler.js +0 -689
- package/dist/components/message-handler.js.map +0 -1
- package/dist/runner.d.ts +0 -51
- package/dist/runner.d.ts.map +0 -1
- package/dist/runner.js +0 -530
- package/dist/runner.js.map +0 -1
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
|
|
3
|
+
import { describe, expect, it } from "@jest/globals";
|
|
4
|
+
|
|
5
|
+
import { Codex } from "../src/codex";
|
|
6
|
+
import { ThreadEvent } from "../src/index";
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
assistantMessage,
|
|
10
|
+
responseCompleted,
|
|
11
|
+
responseStarted,
|
|
12
|
+
sse,
|
|
13
|
+
startResponsesTestProxy,
|
|
14
|
+
} from "./responsesProxy";
|
|
15
|
+
|
|
16
|
+
const codexExecPath = path.join(process.cwd(), "..", "..", "codex-rs", "target", "debug", "codex");
|
|
17
|
+
|
|
18
|
+
describe("Codex", () => {
|
|
19
|
+
it("returns thread events", async () => {
|
|
20
|
+
const { url, close } = await startResponsesTestProxy({
|
|
21
|
+
statusCode: 200,
|
|
22
|
+
responseBodies: [sse(responseStarted(), assistantMessage("Hi!"), responseCompleted())],
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
const client = new Codex({ codexPathOverride: codexExecPath, baseUrl: url, apiKey: "test" });
|
|
27
|
+
|
|
28
|
+
const thread = client.startThread();
|
|
29
|
+
const result = await thread.runStreamed("Hello, world!");
|
|
30
|
+
|
|
31
|
+
const events: ThreadEvent[] = [];
|
|
32
|
+
for await (const event of result.events) {
|
|
33
|
+
events.push(event);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
expect(events).toEqual([
|
|
37
|
+
{
|
|
38
|
+
type: "thread.started",
|
|
39
|
+
thread_id: expect.any(String),
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
type: "turn.started",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
type: "item.completed",
|
|
46
|
+
item: {
|
|
47
|
+
id: "item_0",
|
|
48
|
+
type: "agent_message",
|
|
49
|
+
text: "Hi!",
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
type: "turn.completed",
|
|
54
|
+
usage: {
|
|
55
|
+
cached_input_tokens: 12,
|
|
56
|
+
input_tokens: 42,
|
|
57
|
+
output_tokens: 5,
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
]);
|
|
61
|
+
expect(thread.id).toEqual(expect.any(String));
|
|
62
|
+
} finally {
|
|
63
|
+
await close();
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("sends previous items when runStreamed is called twice", async () => {
|
|
68
|
+
const { url, close, requests } = await startResponsesTestProxy({
|
|
69
|
+
statusCode: 200,
|
|
70
|
+
responseBodies: [
|
|
71
|
+
sse(
|
|
72
|
+
responseStarted("response_1"),
|
|
73
|
+
assistantMessage("First response", "item_1"),
|
|
74
|
+
responseCompleted("response_1"),
|
|
75
|
+
),
|
|
76
|
+
sse(
|
|
77
|
+
responseStarted("response_2"),
|
|
78
|
+
assistantMessage("Second response", "item_2"),
|
|
79
|
+
responseCompleted("response_2"),
|
|
80
|
+
),
|
|
81
|
+
],
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
try {
|
|
85
|
+
const client = new Codex({ codexPathOverride: codexExecPath, baseUrl: url, apiKey: "test" });
|
|
86
|
+
|
|
87
|
+
const thread = client.startThread();
|
|
88
|
+
const first = await thread.runStreamed("first input");
|
|
89
|
+
await drainEvents(first.events);
|
|
90
|
+
|
|
91
|
+
const second = await thread.runStreamed("second input");
|
|
92
|
+
await drainEvents(second.events);
|
|
93
|
+
|
|
94
|
+
// Check second request continues the same thread
|
|
95
|
+
expect(requests.length).toBeGreaterThanOrEqual(2);
|
|
96
|
+
const secondRequest = requests[1];
|
|
97
|
+
expect(secondRequest).toBeDefined();
|
|
98
|
+
const payload = secondRequest!.json;
|
|
99
|
+
|
|
100
|
+
const assistantEntry = payload.input.find(
|
|
101
|
+
(entry: { role: string }) => entry.role === "assistant",
|
|
102
|
+
);
|
|
103
|
+
expect(assistantEntry).toBeDefined();
|
|
104
|
+
const assistantText = assistantEntry?.content?.find(
|
|
105
|
+
(item: { type: string; text: string }) => item.type === "output_text",
|
|
106
|
+
)?.text;
|
|
107
|
+
expect(assistantText).toBe("First response");
|
|
108
|
+
} finally {
|
|
109
|
+
await close();
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it("resumes thread by id when streaming", async () => {
|
|
114
|
+
const { url, close, requests } = await startResponsesTestProxy({
|
|
115
|
+
statusCode: 200,
|
|
116
|
+
responseBodies: [
|
|
117
|
+
sse(
|
|
118
|
+
responseStarted("response_1"),
|
|
119
|
+
assistantMessage("First response", "item_1"),
|
|
120
|
+
responseCompleted("response_1"),
|
|
121
|
+
),
|
|
122
|
+
sse(
|
|
123
|
+
responseStarted("response_2"),
|
|
124
|
+
assistantMessage("Second response", "item_2"),
|
|
125
|
+
responseCompleted("response_2"),
|
|
126
|
+
),
|
|
127
|
+
],
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
try {
|
|
131
|
+
const client = new Codex({ codexPathOverride: codexExecPath, baseUrl: url, apiKey: "test" });
|
|
132
|
+
|
|
133
|
+
const originalThread = client.startThread();
|
|
134
|
+
const first = await originalThread.runStreamed("first input");
|
|
135
|
+
await drainEvents(first.events);
|
|
136
|
+
|
|
137
|
+
const resumedThread = client.resumeThread(originalThread.id!);
|
|
138
|
+
const second = await resumedThread.runStreamed("second input");
|
|
139
|
+
await drainEvents(second.events);
|
|
140
|
+
|
|
141
|
+
expect(resumedThread.id).toBe(originalThread.id);
|
|
142
|
+
|
|
143
|
+
expect(requests.length).toBeGreaterThanOrEqual(2);
|
|
144
|
+
const secondRequest = requests[1];
|
|
145
|
+
expect(secondRequest).toBeDefined();
|
|
146
|
+
const payload = secondRequest!.json;
|
|
147
|
+
|
|
148
|
+
const assistantEntry = payload.input.find(
|
|
149
|
+
(entry: { role: string }) => entry.role === "assistant",
|
|
150
|
+
);
|
|
151
|
+
expect(assistantEntry).toBeDefined();
|
|
152
|
+
const assistantText = assistantEntry?.content?.find(
|
|
153
|
+
(item: { type: string; text: string }) => item.type === "output_text",
|
|
154
|
+
)?.text;
|
|
155
|
+
expect(assistantText).toBe("First response");
|
|
156
|
+
} finally {
|
|
157
|
+
await close();
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it("applies output schema turn options when streaming", async () => {
|
|
162
|
+
const { url, close, requests } = await startResponsesTestProxy({
|
|
163
|
+
statusCode: 200,
|
|
164
|
+
responseBodies: [
|
|
165
|
+
sse(
|
|
166
|
+
responseStarted("response_1"),
|
|
167
|
+
assistantMessage("Structured response", "item_1"),
|
|
168
|
+
responseCompleted("response_1"),
|
|
169
|
+
),
|
|
170
|
+
],
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
const schema = {
|
|
174
|
+
type: "object",
|
|
175
|
+
properties: {
|
|
176
|
+
answer: { type: "string" },
|
|
177
|
+
},
|
|
178
|
+
required: ["answer"],
|
|
179
|
+
additionalProperties: false,
|
|
180
|
+
} as const;
|
|
181
|
+
|
|
182
|
+
try {
|
|
183
|
+
const client = new Codex({ codexPathOverride: codexExecPath, baseUrl: url, apiKey: "test" });
|
|
184
|
+
|
|
185
|
+
const thread = client.startThread();
|
|
186
|
+
const streamed = await thread.runStreamed("structured", { outputSchema: schema });
|
|
187
|
+
await drainEvents(streamed.events);
|
|
188
|
+
|
|
189
|
+
expect(requests.length).toBeGreaterThanOrEqual(1);
|
|
190
|
+
const payload = requests[0];
|
|
191
|
+
expect(payload).toBeDefined();
|
|
192
|
+
const text = payload!.json.text;
|
|
193
|
+
expect(text).toBeDefined();
|
|
194
|
+
expect(text?.format).toEqual({
|
|
195
|
+
name: "codex_output_schema",
|
|
196
|
+
type: "json_schema",
|
|
197
|
+
strict: true,
|
|
198
|
+
schema,
|
|
199
|
+
});
|
|
200
|
+
} finally {
|
|
201
|
+
await close();
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
async function drainEvents(events: AsyncGenerator<ThreadEvent>): Promise<void> {
|
|
207
|
+
let done = false;
|
|
208
|
+
do {
|
|
209
|
+
done = (await events.next()).done ?? false;
|
|
210
|
+
} while (!done);
|
|
211
|
+
}
|
package/package.json
CHANGED
|
@@ -1,32 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@northflare/runner",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.17",
|
|
4
4
|
"description": "Distributed conversation runner for Northflare",
|
|
5
5
|
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
6
7
|
"main": "dist/index.js",
|
|
7
8
|
"types": "dist/index.d.ts",
|
|
8
9
|
"bin": "./bin/northflare-runner",
|
|
9
|
-
"scripts": {
|
|
10
|
-
"build": "tsc",
|
|
11
|
-
"start": "node dist/index.js",
|
|
12
|
-
"dev": "tsx src/index.ts",
|
|
13
|
-
"test": "vitest run",
|
|
14
|
-
"test:watch": "vitest watch",
|
|
15
|
-
"test:coverage": "vitest run --coverage",
|
|
16
|
-
"lint": "eslint src",
|
|
17
|
-
"prepublishOnly": "npm run build",
|
|
18
|
-
"postbuild": "chmod +x bin/northflare-runner",
|
|
19
|
-
"release": "npm publish --access public",
|
|
20
|
-
"release:env": "source .env && npm publish --access public"
|
|
21
|
-
},
|
|
22
10
|
"dependencies": {
|
|
23
|
-
"@
|
|
11
|
+
"@ai-sdk/groq": "^3.0.0-beta.42",
|
|
12
|
+
"@anthropic-ai/claude-agent-sdk": "0.1.51",
|
|
24
13
|
"@botanicastudios/claude-code-sdk-ts": "0.2.22-fork",
|
|
25
14
|
"@botanicastudios/mcp-host-rpc": "^0.4.0",
|
|
26
15
|
"@northflare/codex-sdk": "file:lib/codex-sdk",
|
|
27
|
-
"@openai/codex-sdk": "^0.
|
|
16
|
+
"@openai/codex-sdk": "^0.60.1",
|
|
17
|
+
"@openrouter/ai-sdk-provider": "^1.2.8",
|
|
28
18
|
"@tanstack/react-query": "^5.x.x",
|
|
29
19
|
"@types/jsonwebtoken": "^9.0.10",
|
|
20
|
+
"ai": "^6.0.0-beta.124",
|
|
30
21
|
"ajv": "^8.x.x",
|
|
31
22
|
"commander": "^11.x.x",
|
|
32
23
|
"computer-name": "^0.1.0",
|
|
@@ -36,7 +27,8 @@
|
|
|
36
27
|
"jsonwebtoken": "^9.0.2",
|
|
37
28
|
"simple-git": "^3.x.x",
|
|
38
29
|
"winston": "^3.x.x",
|
|
39
|
-
"zod": "^3.
|
|
30
|
+
"zod": "^3.25.8",
|
|
31
|
+
"@northflare/agent": "0.1.2"
|
|
40
32
|
},
|
|
41
33
|
"devDependencies": {
|
|
42
34
|
"@types/eventsource": "^1.1.15",
|
|
@@ -50,5 +42,17 @@
|
|
|
50
42
|
},
|
|
51
43
|
"engines": {
|
|
52
44
|
"node": ">=18.0.0"
|
|
45
|
+
},
|
|
46
|
+
"scripts": {
|
|
47
|
+
"build": "tsc",
|
|
48
|
+
"start": "node dist/index.js",
|
|
49
|
+
"dev": "tsx src/index.ts",
|
|
50
|
+
"test": "vitest run",
|
|
51
|
+
"test:watch": "vitest watch",
|
|
52
|
+
"test:coverage": "vitest run --coverage",
|
|
53
|
+
"lint": "eslint src",
|
|
54
|
+
"postbuild": "chmod +x bin/northflare-runner",
|
|
55
|
+
"release": "pnpm publish --access public --no-git-checks",
|
|
56
|
+
"release:env": "source .env && pnpm publish --access public --no-git-checks"
|
|
53
57
|
}
|
|
54
|
-
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
#!/usr/bin/env -S node --no-warnings
|
|
2
|
+
/**
|
|
3
|
+
* Standalone Northflare Agent SDK reproducer for OpenRouter/Groq hangs.
|
|
4
|
+
*
|
|
5
|
+
* Mirrors the runner's NorthflareAgentManager pipeline:
|
|
6
|
+
* - streams a single user message into sdkQuery()
|
|
7
|
+
* - passes env/cwd/systemPrompt/disallowedTools just like the runner
|
|
8
|
+
* - logs idle status while waiting so hangs are visible
|
|
9
|
+
*
|
|
10
|
+
* Run with tsx from the repo root:
|
|
11
|
+
* OPENROUTER_API_KEY=... GROQ_API_KEY=... npx tsx runner/scripts/verify-openrouter-agent.ts \
|
|
12
|
+
* --model moonshotai/kimi-k2-instruct --provider groq --message "hello"
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { parseArgs } from "node:util";
|
|
16
|
+
import { query as sdkQuery } from "@northflare/agent";
|
|
17
|
+
import { groq as groqProvider } from "@ai-sdk/groq";
|
|
18
|
+
import { createOpenRouter } from "@openrouter/ai-sdk-provider";
|
|
19
|
+
|
|
20
|
+
type Provider = "openrouter" | "groq";
|
|
21
|
+
|
|
22
|
+
const {
|
|
23
|
+
values: {
|
|
24
|
+
model = "moonshotai/kimi-k2-instruct",
|
|
25
|
+
provider = "openrouter",
|
|
26
|
+
message = "hello",
|
|
27
|
+
appendSystemPrompt,
|
|
28
|
+
resume,
|
|
29
|
+
cwd,
|
|
30
|
+
debug = true,
|
|
31
|
+
},
|
|
32
|
+
} = parseArgs({
|
|
33
|
+
options: {
|
|
34
|
+
model: { type: "string" },
|
|
35
|
+
provider: { type: "string" },
|
|
36
|
+
message: { type: "string" },
|
|
37
|
+
appendSystemPrompt: { type: "string" },
|
|
38
|
+
resume: { type: "string" },
|
|
39
|
+
cwd: { type: "string" },
|
|
40
|
+
debug: { type: "boolean" },
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
const normalizedProvider = (provider?.toLowerCase() as Provider) || "openrouter";
|
|
45
|
+
const systemPrompt = appendSystemPrompt
|
|
46
|
+
? { type: "preset" as const, preset: "claude_code" as const, append: appendSystemPrompt }
|
|
47
|
+
: undefined;
|
|
48
|
+
|
|
49
|
+
const envVars: Record<string, string> = {};
|
|
50
|
+
|
|
51
|
+
// Only pass through the env vars the runner would send. Values are not logged.
|
|
52
|
+
if (process.env.OPENROUTER_API_KEY) envVars.OPENROUTER_API_KEY = process.env.OPENROUTER_API_KEY;
|
|
53
|
+
if (process.env.GROQ_API_KEY) envVars.GROQ_API_KEY = process.env.GROQ_API_KEY as string;
|
|
54
|
+
if (process.env.ANTHROPIC_API_KEY) envVars.ANTHROPIC_API_KEY = process.env.ANTHROPIC_API_KEY;
|
|
55
|
+
if (process.env.OPENAI_API_KEY) envVars.OPENAI_API_KEY = process.env.OPENAI_API_KEY;
|
|
56
|
+
if (process.env.GITHUB_TOKEN) envVars.GITHUB_TOKEN = process.env.GITHUB_TOKEN;
|
|
57
|
+
if (process.env.TOOL_TOKEN) envVars.TOOL_TOKEN = process.env.TOOL_TOKEN;
|
|
58
|
+
|
|
59
|
+
// Emit a launch summary similar to the runner for quick visual comparison.
|
|
60
|
+
console.log("[verify-openrouter-agent] Launch config", {
|
|
61
|
+
model,
|
|
62
|
+
provider: normalizedProvider,
|
|
63
|
+
cwd: cwd || process.cwd(),
|
|
64
|
+
hasSystemPrompt: Boolean(systemPrompt),
|
|
65
|
+
env: {
|
|
66
|
+
OPENROUTER_API_KEY: Boolean(envVars.OPENROUTER_API_KEY),
|
|
67
|
+
GROQ_API_KEY: Boolean(envVars.GROQ_API_KEY),
|
|
68
|
+
ANTHROPIC_API_KEY: Boolean(envVars.ANTHROPIC_API_KEY),
|
|
69
|
+
OPENAI_API_KEY: Boolean(envVars.OPENAI_API_KEY),
|
|
70
|
+
GITHUB_TOKEN: Boolean(envVars.GITHUB_TOKEN),
|
|
71
|
+
TOOL_TOKEN: Boolean(envVars.TOOL_TOKEN),
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
function toUserMessage(text: string) {
|
|
76
|
+
return {
|
|
77
|
+
type: "user",
|
|
78
|
+
session_id: "",
|
|
79
|
+
parent_tool_use_id: null,
|
|
80
|
+
message: { role: "user", content: text },
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async function run() {
|
|
85
|
+
// Build the LanguageModel value exactly like NorthflareAgentManager
|
|
86
|
+
const sdkModel = (() => {
|
|
87
|
+
if (normalizedProvider === "groq") return groqProvider(model) as any;
|
|
88
|
+
if (normalizedProvider === "openrouter") {
|
|
89
|
+
const client = createOpenRouter({
|
|
90
|
+
apiKey: process.env.OPENROUTER_API_KEY || "",
|
|
91
|
+
});
|
|
92
|
+
const normalizedModel = model.startsWith("openrouter:")
|
|
93
|
+
? model.slice("openrouter:".length)
|
|
94
|
+
: model;
|
|
95
|
+
const resolved = client(normalizedModel);
|
|
96
|
+
console.log("[verify-openrouter-agent] Model resolution", {
|
|
97
|
+
provider: normalizedProvider,
|
|
98
|
+
rawModel: model,
|
|
99
|
+
normalizedModel,
|
|
100
|
+
openRouterApiKeyPresent: Boolean(process.env.OPENROUTER_API_KEY),
|
|
101
|
+
sdkModelType: (resolved as any)?.constructor?.name,
|
|
102
|
+
});
|
|
103
|
+
return resolved;
|
|
104
|
+
}
|
|
105
|
+
return model;
|
|
106
|
+
})();
|
|
107
|
+
|
|
108
|
+
const promptStream = (async function* () {
|
|
109
|
+
yield toUserMessage(message);
|
|
110
|
+
})();
|
|
111
|
+
|
|
112
|
+
const sdk = sdkQuery({
|
|
113
|
+
prompt: promptStream,
|
|
114
|
+
options: {
|
|
115
|
+
cwd: cwd || process.cwd(),
|
|
116
|
+
env: envVars,
|
|
117
|
+
model: sdkModel,
|
|
118
|
+
resume: resume || undefined,
|
|
119
|
+
debug,
|
|
120
|
+
systemPrompt,
|
|
121
|
+
stderr: (data: string) => console.error(`[agent-sdk:stderr] ${data}`),
|
|
122
|
+
onStepFinish: (step: any) =>
|
|
123
|
+
console.log("[agent-sdk:step]", {
|
|
124
|
+
type: step?.type,
|
|
125
|
+
tool: step?.tool,
|
|
126
|
+
finishReason: step?.finishReason,
|
|
127
|
+
}),
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
let count = 0;
|
|
132
|
+
let last = Date.now();
|
|
133
|
+
const idleTimer = setInterval(() => {
|
|
134
|
+
const idleMs = Date.now() - last;
|
|
135
|
+
if (idleMs >= 5000) {
|
|
136
|
+
console.log("[verify-openrouter-agent] waiting for agent output", {
|
|
137
|
+
streamedMessageCount: count,
|
|
138
|
+
idleMs,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}, 5000);
|
|
142
|
+
|
|
143
|
+
try {
|
|
144
|
+
for await (const msg of sdk) {
|
|
145
|
+
last = Date.now();
|
|
146
|
+
count += 1;
|
|
147
|
+
// Keep logs compact but show the important parts
|
|
148
|
+
console.log(`[agent-sdk] message #${count}`, {
|
|
149
|
+
type: msg?.type,
|
|
150
|
+
session_id: msg?.session_id || msg?.sessionId,
|
|
151
|
+
role: msg?.message?.role,
|
|
152
|
+
contentPreview: JSON.stringify(msg).slice(0, 240),
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
console.log("[verify-openrouter-agent] stream completed", { count });
|
|
156
|
+
} catch (error) {
|
|
157
|
+
console.error("[verify-openrouter-agent] stream errored", error);
|
|
158
|
+
} finally {
|
|
159
|
+
clearInterval(idleTimer);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
run();
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ElectricSQL collection for RunnerMessages with real-time sync
|
|
3
|
-
*/
|
|
4
|
-
import { z } from "zod";
|
|
5
|
-
import { RunnerConfig } from "../types";
|
|
6
|
-
export declare const runnerMessageSchema: z.ZodObject<{
|
|
7
|
-
id: z.ZodString;
|
|
8
|
-
direction: z.ZodEnum<["to_runner", "to_orchestrator"]>;
|
|
9
|
-
runnerId: z.ZodString;
|
|
10
|
-
taskId: z.ZodNullable<z.ZodString>;
|
|
11
|
-
workspaceId: z.ZodNullable<z.ZodString>;
|
|
12
|
-
conversationId: z.ZodNullable<z.ZodString>;
|
|
13
|
-
payload: z.ZodAny;
|
|
14
|
-
expiresAt: z.ZodString;
|
|
15
|
-
createdAt: z.ZodString;
|
|
16
|
-
}, "strip", z.ZodTypeAny, {
|
|
17
|
-
workspaceId: string | null;
|
|
18
|
-
taskId: string | null;
|
|
19
|
-
id: string;
|
|
20
|
-
conversationId: string | null;
|
|
21
|
-
runnerId: string;
|
|
22
|
-
direction: "to_runner" | "to_orchestrator";
|
|
23
|
-
expiresAt: string;
|
|
24
|
-
createdAt: string;
|
|
25
|
-
payload?: any;
|
|
26
|
-
}, {
|
|
27
|
-
workspaceId: string | null;
|
|
28
|
-
taskId: string | null;
|
|
29
|
-
id: string;
|
|
30
|
-
conversationId: string | null;
|
|
31
|
-
runnerId: string;
|
|
32
|
-
direction: "to_runner" | "to_orchestrator";
|
|
33
|
-
expiresAt: string;
|
|
34
|
-
createdAt: string;
|
|
35
|
-
payload?: any;
|
|
36
|
-
}>;
|
|
37
|
-
export type RunnerMessage = z.infer<typeof runnerMessageSchema>;
|
|
38
|
-
export declare class RunnerMessagesCollection {
|
|
39
|
-
private shape;
|
|
40
|
-
private stream;
|
|
41
|
-
private subscribers;
|
|
42
|
-
private shapeUnsubscribe?;
|
|
43
|
-
private isInitialized;
|
|
44
|
-
state: Map<string, RunnerMessage>;
|
|
45
|
-
constructor(config: RunnerConfig, lastProcessedAt?: Date | null);
|
|
46
|
-
subscribe(callback: () => void): () => void;
|
|
47
|
-
preload(): Promise<void>;
|
|
48
|
-
isReady(): boolean;
|
|
49
|
-
stop(): void;
|
|
50
|
-
}
|
|
51
|
-
export declare function createRunnerMessagesCollection(config: RunnerConfig, lastProcessedAt?: Date | null): RunnerMessagesCollection;
|
|
52
|
-
//# sourceMappingURL=runner-messages.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runner-messages.d.ts","sourceRoot":"","sources":["../../src/collections/runner-messages.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAmBxC,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,qBAAa,wBAAwB;IACnC,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,gBAAgB,CAAC,CAAa;IACtC,OAAO,CAAC,aAAa,CAAkB;IAChC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAa;gBAEzC,MAAM,EAAE,YAAY,EAAE,eAAe,CAAC,EAAE,IAAI,GAAG,IAAI;IAkF/D,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAUrC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB9B,OAAO,IAAI,OAAO;IAMlB,IAAI,IAAI,IAAI;CAiBb;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,YAAY,EAAE,eAAe,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,wBAAwB,CAE5H"}
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* ElectricSQL collection for RunnerMessages with real-time sync
|
|
4
|
-
*/
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.RunnerMessagesCollection = exports.runnerMessageSchema = void 0;
|
|
7
|
-
exports.createRunnerMessagesCollection = createRunnerMessagesCollection;
|
|
8
|
-
const client_1 = require("@electric-sql/client");
|
|
9
|
-
const zod_1 = require("zod");
|
|
10
|
-
const logger_1 = require("../utils/logger");
|
|
11
|
-
const logger = (0, logger_1.createLogger)("ElectricSQL");
|
|
12
|
-
// Schema for RunnerMessage from ElectricSQL (raw database columns)
|
|
13
|
-
const electricMessageSchema = zod_1.z.object({
|
|
14
|
-
id: zod_1.z.string(),
|
|
15
|
-
direction: zod_1.z.enum(["to_runner", "to_orchestrator"]),
|
|
16
|
-
runner: zod_1.z.string(), // Database column name
|
|
17
|
-
task: zod_1.z.string().nullable(), // Database column name for taskId
|
|
18
|
-
workspace: zod_1.z.string().nullable(), // Database column name
|
|
19
|
-
conversation: zod_1.z.string().nullable(), // Database column name for conversationId (relation id)
|
|
20
|
-
payload: zod_1.z.any(), // JSONRPC 2.0 message
|
|
21
|
-
expiresAt: zod_1.z.string(),
|
|
22
|
-
createdAt: zod_1.z.string(),
|
|
23
|
-
});
|
|
24
|
-
// Schema for normalized RunnerMessage used internally
|
|
25
|
-
exports.runnerMessageSchema = zod_1.z.object({
|
|
26
|
-
id: zod_1.z.string(),
|
|
27
|
-
direction: zod_1.z.enum(["to_runner", "to_orchestrator"]),
|
|
28
|
-
runnerId: zod_1.z.string(),
|
|
29
|
-
taskId: zod_1.z.string().nullable(),
|
|
30
|
-
workspaceId: zod_1.z.string().nullable(),
|
|
31
|
-
conversationId: zod_1.z.string().nullable(),
|
|
32
|
-
payload: zod_1.z.any(), // JSONRPC 2.0 message
|
|
33
|
-
expiresAt: zod_1.z.string(),
|
|
34
|
-
createdAt: zod_1.z.string(),
|
|
35
|
-
});
|
|
36
|
-
class RunnerMessagesCollection {
|
|
37
|
-
shape;
|
|
38
|
-
stream;
|
|
39
|
-
subscribers = new Set();
|
|
40
|
-
shapeUnsubscribe;
|
|
41
|
-
isInitialized = false;
|
|
42
|
-
state = new Map();
|
|
43
|
-
constructor(config, lastProcessedAt) {
|
|
44
|
-
// Build the where clause based on lastProcessedAt
|
|
45
|
-
let whereClause = `"direction" = 'to_runner' AND "runner" = '${config.runnerId}'`;
|
|
46
|
-
if (lastProcessedAt) {
|
|
47
|
-
// Only get messages created after lastProcessedAt
|
|
48
|
-
whereClause += ` AND "createdAt" > '${lastProcessedAt.toISOString()}'`;
|
|
49
|
-
}
|
|
50
|
-
// Debug logging for ElectricSQL connection setup
|
|
51
|
-
if (process.env["DEBUG"] === "true") {
|
|
52
|
-
logger.debug("Creating ElectricSQL shape stream", {
|
|
53
|
-
electricUrl: config.electricUrl,
|
|
54
|
-
runnerId: config.runnerId,
|
|
55
|
-
lastProcessedAt: lastProcessedAt?.toISOString() || "null",
|
|
56
|
-
whereClause: whereClause,
|
|
57
|
-
table: '"RunnerMessage"',
|
|
58
|
-
authToken: process.env["CLAUDETTE_RUNNER_TOKEN"] ? "present" : "missing"
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
// Create the ShapeStream
|
|
62
|
-
this.stream = new client_1.ShapeStream({
|
|
63
|
-
url: `${config.electricUrl}/v1/shape`,
|
|
64
|
-
params: {
|
|
65
|
-
table: '"RunnerMessage"',
|
|
66
|
-
where: whereClause,
|
|
67
|
-
},
|
|
68
|
-
headers: {
|
|
69
|
-
Authorization: `Bearer ${process.env["CLAUDETTE_RUNNER_TOKEN"]}`,
|
|
70
|
-
},
|
|
71
|
-
});
|
|
72
|
-
// Create the Shape to handle data
|
|
73
|
-
this.shape = new client_1.Shape(this.stream);
|
|
74
|
-
// Subscribe to shape changes
|
|
75
|
-
this.shapeUnsubscribe = this.shape.subscribe(({ rows }) => {
|
|
76
|
-
// Update internal state with normalized messages
|
|
77
|
-
this.state.clear();
|
|
78
|
-
rows.forEach((row) => {
|
|
79
|
-
// Normalize the database column names to our internal schema
|
|
80
|
-
// ElectricSQL always returns raw database columns: task, runner, workspace
|
|
81
|
-
const normalizedMessage = {
|
|
82
|
-
id: row.id,
|
|
83
|
-
direction: row.direction,
|
|
84
|
-
runnerId: row.runner, // Database column 'runner' -> 'runnerId'
|
|
85
|
-
taskId: row.task, // Database column 'task' -> 'taskId'
|
|
86
|
-
workspaceId: row.workspace, // Database column 'workspace' -> 'workspaceId'
|
|
87
|
-
conversationId: row.conversation ?? null,
|
|
88
|
-
payload: row.payload,
|
|
89
|
-
expiresAt: row.expiresAt,
|
|
90
|
-
createdAt: row.createdAt,
|
|
91
|
-
};
|
|
92
|
-
this.state.set(normalizedMessage.id, normalizedMessage);
|
|
93
|
-
});
|
|
94
|
-
// Mark as initialized after first sync
|
|
95
|
-
if (!this.isInitialized) {
|
|
96
|
-
this.isInitialized = true;
|
|
97
|
-
}
|
|
98
|
-
if (process.env["DEBUG"] === "true") {
|
|
99
|
-
logger.debug("ElectricSQL shape updated", {
|
|
100
|
-
messageCount: rows.length,
|
|
101
|
-
runnerId: config.runnerId
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
// Notify all subscribers
|
|
105
|
-
this.subscribers.forEach(callback => callback());
|
|
106
|
-
});
|
|
107
|
-
// Log when collection is created
|
|
108
|
-
if (process.env["DEBUG"] === "true") {
|
|
109
|
-
logger.debug("ElectricSQL collection created", {
|
|
110
|
-
hasState: true,
|
|
111
|
-
shapeUrl: `${config.electricUrl}/v1/shape`
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
// Subscribe to collection changes
|
|
116
|
-
subscribe(callback) {
|
|
117
|
-
this.subscribers.add(callback);
|
|
118
|
-
// Return unsubscribe function
|
|
119
|
-
return () => {
|
|
120
|
-
this.subscribers.delete(callback);
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
// Preload data - wait for initial sync
|
|
124
|
-
async preload() {
|
|
125
|
-
if (process.env["DEBUG"] === "true") {
|
|
126
|
-
logger.debug("Preloading ElectricSQL data");
|
|
127
|
-
}
|
|
128
|
-
// Wait for initial data to load
|
|
129
|
-
await this.shape.rows;
|
|
130
|
-
if (process.env["DEBUG"] === "true") {
|
|
131
|
-
logger.debug("ElectricSQL preload complete", {
|
|
132
|
-
messageCount: this.state.size
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
// Check if collection is ready
|
|
137
|
-
isReady() {
|
|
138
|
-
// Consider ready after initial sync
|
|
139
|
-
return this.isInitialized;
|
|
140
|
-
}
|
|
141
|
-
// Stop the collection
|
|
142
|
-
stop() {
|
|
143
|
-
// Unsubscribe from shape updates
|
|
144
|
-
if (this.shapeUnsubscribe) {
|
|
145
|
-
this.shapeUnsubscribe();
|
|
146
|
-
}
|
|
147
|
-
// Stop all stream subscriptions
|
|
148
|
-
this.stream.unsubscribeAll();
|
|
149
|
-
// Clear internal state
|
|
150
|
-
this.subscribers.clear();
|
|
151
|
-
this.state.clear();
|
|
152
|
-
if (process.env["DEBUG"] === "true") {
|
|
153
|
-
logger.debug("ElectricSQL collection stopped");
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
exports.RunnerMessagesCollection = RunnerMessagesCollection;
|
|
158
|
-
function createRunnerMessagesCollection(config, lastProcessedAt) {
|
|
159
|
-
return new RunnerMessagesCollection(config, lastProcessedAt);
|
|
160
|
-
}
|
|
161
|
-
//# sourceMappingURL=runner-messages.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runner-messages.js","sourceRoot":"","sources":["../../src/collections/runner-messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claude-manager.d.ts","sourceRoot":"","sources":["../../src/components/claude-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAM5E,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,iBAAiB,CAA4B;gBAGnD,MAAM,EAAE,UAAU,EAClB,iBAAiB,EAAE,yBAAyB;IAiB9C,OAAO,CAAC,sBAAsB;IAKxB,iBAAiB,CACrB,sBAAsB,EAAE,MAAM,GAAG,UAAU,EAC3C,oBAAoB,EAAE,MAAM,EAC5B,MAAM,EAAE,kBAAkB,EAC1B,eAAe,EAAE,OAAO,EAAE,EAC1B,gBAAgB,CAAC,EAAE;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,kBAAkB,EAAE,MAAM,CAAC;QAC3B,qBAAqB,EAAE,MAAM,CAAC;QAC9B,eAAe,EAAE,MAAM,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;KACxB,GACA,OAAO,CAAC,mBAAmB,CAAC;IA6XzB,gBAAgB,CACpB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC;IAuBV,kBAAkB,CACtB,sBAAsB,EAAE,MAAM,GAAG,UAAU,EAC3C,oBAAoB,EAAE,MAAM,EAC5B,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,kBAAkB,EAC1B,gBAAgB,CAAC,EAAE,GAAG,EACtB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC;IAmCZ,eAAe,CACnB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,GAAG,EACZ,MAAM,CAAC,EAAE,kBAAkB,EAC3B,sBAAsB,CAAC,EAAE,MAAM,GAAG,UAAU,EAC5C,oBAAoB,CAAC,EAAE,MAAM,EAC7B,YAAY,CAAC,EAAE,GAAG,GACjB,OAAO,CAAC,IAAI,CAAC;YA8JF,iBAAiB;YA2BjB,wBAAwB;IA2BtC,OAAO,CAAC,aAAa;IAerB;;OAEG;IACH,OAAO,CAAC,eAAe;YA2CT,qBAAqB;CAmQpC"}
|