@northflare/runner 0.0.13 → 0.0.16
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.d.ts.map +1 -1
- package/dist/utils/logger.js +24 -35
- 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/tsup.config.d.ts +3 -0
- package/lib/codex-sdk/dist/tsup.config.js +12 -0
- package/package.json +9 -4
- 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
package/package.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@northflare/runner",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.16",
|
|
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",
|
|
@@ -20,13 +21,17 @@
|
|
|
20
21
|
"release:env": "source .env && npm publish --access public"
|
|
21
22
|
},
|
|
22
23
|
"dependencies": {
|
|
23
|
-
"@
|
|
24
|
+
"@ai-sdk/groq": "^3.0.0-beta.42",
|
|
25
|
+
"@anthropic-ai/claude-agent-sdk": "0.1.51",
|
|
24
26
|
"@botanicastudios/claude-code-sdk-ts": "0.2.22-fork",
|
|
25
27
|
"@botanicastudios/mcp-host-rpc": "^0.4.0",
|
|
28
|
+
"@northflare/agent": "workspace:*",
|
|
26
29
|
"@northflare/codex-sdk": "file:lib/codex-sdk",
|
|
27
|
-
"@openai/codex-sdk": "^0.
|
|
30
|
+
"@openai/codex-sdk": "^0.60.1",
|
|
31
|
+
"@openrouter/ai-sdk-provider": "^1.2.8",
|
|
28
32
|
"@tanstack/react-query": "^5.x.x",
|
|
29
33
|
"@types/jsonwebtoken": "^9.0.10",
|
|
34
|
+
"ai": "^6.0.0-beta.124",
|
|
30
35
|
"ajv": "^8.x.x",
|
|
31
36
|
"commander": "^11.x.x",
|
|
32
37
|
"computer-name": "^0.1.0",
|
|
@@ -36,7 +41,7 @@
|
|
|
36
41
|
"jsonwebtoken": "^9.0.2",
|
|
37
42
|
"simple-git": "^3.x.x",
|
|
38
43
|
"winston": "^3.x.x",
|
|
39
|
-
"zod": "^3.
|
|
44
|
+
"zod": "^3.25.8"
|
|
40
45
|
},
|
|
41
46
|
"devDependencies": {
|
|
42
47
|
"@types/eventsource": "^1.1.15",
|
|
@@ -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":";AAAA;;GAEG;;;AAkLH,wEAEC;AAlLD,iDAA0D;AAC1D,6BAAwB;AAExB,4CAA+C;AAE/C,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,aAAa,CAAC,CAAC;AAE3C,mEAAmE;AACnE,MAAM,qBAAqB,GAAG,OAAC,CAAC,MAAM,CAAC;IACrC,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE;IACd,SAAS,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IACnD,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,EAAE,uBAAuB;IAC3C,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,kCAAkC;IAC/D,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,uBAAuB;IACzD,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,wDAAwD;IAC7F,OAAO,EAAE,OAAC,CAAC,GAAG,EAAE,EAAE,sBAAsB;IACxC,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAEH,sDAAsD;AACzC,QAAA,mBAAmB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC1C,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE;IACd,SAAS,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IACnD,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;IACpB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,cAAc,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,OAAO,EAAE,OAAC,CAAC,GAAG,EAAE,EAAE,sBAAsB;IACxC,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAIH,MAAa,wBAAwB;IAC3B,KAAK,CAAuB;IAC5B,MAAM,CAA6B;IACnC,WAAW,GAAoB,IAAI,GAAG,EAAE,CAAC;IACzC,gBAAgB,CAAc;IAC9B,aAAa,GAAY,KAAK,CAAC;IAChC,KAAK,GAA+B,IAAI,GAAG,EAAE,CAAC;IAErD,YAAY,MAAoB,EAAE,eAA6B;QAC7D,kDAAkD;QAClD,IAAI,WAAW,GAAG,6CAA6C,MAAM,CAAC,QAAQ,GAAG,CAAC;QAClF,IAAI,eAAe,EAAE,CAAC;YACpB,kDAAkD;YAClD,WAAW,IAAI,uBAAuB,eAAe,CAAC,WAAW,EAAE,GAAG,CAAC;QACzE,CAAC;QAED,iDAAiD;QACjD,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE;gBAChD,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,IAAI,MAAM;gBACzD,WAAW,EAAE,WAAW;gBACxB,KAAK,EAAE,iBAAiB;gBACxB,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;aACzE,CAAC,CAAC;QACL,CAAC;QAED,yBAAyB;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,oBAAW,CAAC;YAC5B,GAAG,EAAE,GAAG,MAAM,CAAC,WAAW,WAAW;YACrC,MAAM,EAAE;gBACN,KAAK,EAAE,iBAAiB;gBACxB,KAAK,EAAE,WAAW;aACnB;YACD,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE;aACjE;SACF,CAAC,CAAC;QAEH,kCAAkC;QAClC,IAAI,CAAC,KAAK,GAAG,IAAI,cAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEpC,6BAA6B;QAC7B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YACxD,iDAAiD;YACjD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,EAAE;gBACxB,6DAA6D;gBAC7D,2EAA2E;gBAC3E,MAAM,iBAAiB,GAAkB;oBACvC,EAAE,EAAE,GAAG,CAAC,EAAE;oBACV,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,yCAAyC;oBAC/D,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,qCAAqC;oBACvD,WAAW,EAAE,GAAG,CAAC,SAAS,EAAE,+CAA+C;oBAC3E,cAAc,EAAE,GAAG,CAAC,YAAY,IAAI,IAAI;oBACxC,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,SAAS,EAAE,GAAG,CAAC,SAAS;iBACzB,CAAC;gBACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;YAC1D,CAAC,CAAC,CAAC;YAEH,uCAAuC;YACvC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACxB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC5B,CAAC;YAED,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC;gBACpC,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE;oBACxC,YAAY,EAAE,IAAI,CAAC,MAAM;oBACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;iBAC1B,CAAC,CAAC;YACL,CAAC;YAED,yBAAyB;YACzB,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,iCAAiC;QACjC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE;gBAC7C,QAAQ,EAAE,IAAI;gBACd,QAAQ,EAAE,GAAG,MAAM,CAAC,WAAW,WAAW;aAC3C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,SAAS,CAAC,QAAoB;QAC5B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE/B,8BAA8B;QAC9B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC,CAAC;IACJ,CAAC;IAED,uCAAuC;IACvC,KAAK,CAAC,OAAO;QACX,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC9C,CAAC;QAED,gCAAgC;QAChC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAEtB,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE;gBAC3C,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;aAC9B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,OAAO;QACL,oCAAoC;QACpC,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,sBAAsB;IACtB,IAAI;QACF,iCAAiC;QACjC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,CAAC;QAED,gCAAgC;QAChC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAE7B,uBAAuB;QACvB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAEnB,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;CACF;AA3ID,4DA2IC;AAED,SAAgB,8BAA8B,CAAC,MAAoB,EAAE,eAA6B;IAChG,OAAO,IAAI,wBAAwB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -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"}
|