@clawapps/cli 0.6.6 → 0.7.0
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/commands/connect.js +60 -57
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/send.js +39 -48
- package/dist/commands/send.js.map +1 -1
- package/dist/lib/relay-client.d.ts +33 -18
- package/dist/lib/relay-client.js +151 -56
- package/dist/lib/relay-client.js.map +1 -1
- package/package.json +1 -1
- package/dist/lib/sse-parser.d.ts +0 -12
- package/dist/lib/sse-parser.js +0 -61
- package/dist/lib/sse-parser.js.map +0 -1
package/dist/commands/connect.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { createInterface } from 'node:readline';
|
|
3
3
|
import { resolveCredentials } from './helpers/resolve-credentials.js';
|
|
4
|
-
import {
|
|
4
|
+
import { connectRelay, saveSession } from '../lib/relay-client.js';
|
|
5
5
|
function jsonOut(obj) {
|
|
6
6
|
process.stdout.write(JSON.stringify(obj) + '\n');
|
|
7
7
|
}
|
|
@@ -9,42 +9,32 @@ export async function connectCommand(options) {
|
|
|
9
9
|
const isHuman = !!options.human;
|
|
10
10
|
try {
|
|
11
11
|
const creds = await resolveCredentials();
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
if (options.sessionId) {
|
|
15
|
-
sessionId = options.sessionId;
|
|
16
|
-
}
|
|
17
|
-
else {
|
|
18
|
-
const session = await createSession(token);
|
|
19
|
-
sessionId = session.session_id;
|
|
20
|
-
await saveSession({ session_id: sessionId, created_at: new Date().toISOString() });
|
|
21
|
-
}
|
|
12
|
+
const relay = await connectRelay(creds.access_token);
|
|
13
|
+
await saveSession({ session_id: relay.sessionId, created_at: new Date().toISOString() });
|
|
22
14
|
if (isHuman) {
|
|
23
|
-
console.log(chalk.green(`Connected to session: ${sessionId}`));
|
|
15
|
+
console.log(chalk.green(`Connected to session: ${relay.sessionId}`));
|
|
24
16
|
console.log(chalk.gray('Type your message and press Enter. Use Ctrl+C to exit.\n'));
|
|
25
17
|
}
|
|
26
18
|
else {
|
|
27
|
-
jsonOut({ event: 'session_created', session_id: sessionId });
|
|
19
|
+
jsonOut({ event: 'session_created', session_id: relay.sessionId });
|
|
28
20
|
jsonOut({ event: 'ready' });
|
|
29
21
|
}
|
|
22
|
+
// Graceful shutdown
|
|
30
23
|
let shuttingDown = false;
|
|
31
|
-
const cleanup =
|
|
24
|
+
const cleanup = () => {
|
|
32
25
|
if (shuttingDown)
|
|
33
26
|
return;
|
|
34
27
|
shuttingDown = true;
|
|
35
|
-
|
|
36
|
-
await closeSession(token, sessionId);
|
|
37
|
-
}
|
|
38
|
-
catch { /* ignore */ }
|
|
28
|
+
relay.close();
|
|
39
29
|
process.exit(0);
|
|
40
30
|
};
|
|
41
31
|
process.on('SIGINT', cleanup);
|
|
42
32
|
process.on('SIGTERM', cleanup);
|
|
43
33
|
if (isHuman) {
|
|
44
|
-
await interactiveMode(
|
|
34
|
+
await interactiveMode(relay);
|
|
45
35
|
}
|
|
46
36
|
else {
|
|
47
|
-
await jsonMode(
|
|
37
|
+
await jsonMode(relay);
|
|
48
38
|
}
|
|
49
39
|
}
|
|
50
40
|
catch (err) {
|
|
@@ -58,8 +48,15 @@ export async function connectCommand(options) {
|
|
|
58
48
|
process.exit(msg.includes('authenticated') || msg.includes('expired') ? 2 : 1);
|
|
59
49
|
}
|
|
60
50
|
}
|
|
61
|
-
async function jsonMode(
|
|
51
|
+
async function jsonMode(relay) {
|
|
52
|
+
// Read commands from stdin, send to relay
|
|
62
53
|
const rl = createInterface({ input: process.stdin });
|
|
54
|
+
// Also listen for push messages from Bridge
|
|
55
|
+
const pushListener = (async () => {
|
|
56
|
+
for await (const msg of relay.listen()) {
|
|
57
|
+
jsonOut({ event: msg.type, ...msg });
|
|
58
|
+
}
|
|
59
|
+
})();
|
|
63
60
|
for await (const line of rl) {
|
|
64
61
|
if (!line.trim())
|
|
65
62
|
continue;
|
|
@@ -72,25 +69,54 @@ async function jsonMode(token, sessionId) {
|
|
|
72
69
|
continue;
|
|
73
70
|
}
|
|
74
71
|
if (cmd.action === 'stop') {
|
|
75
|
-
|
|
72
|
+
relay.stop();
|
|
76
73
|
jsonOut({ event: 'stopped' });
|
|
77
|
-
continue;
|
|
78
74
|
}
|
|
79
|
-
if (cmd.action === 'message' && cmd.content) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
75
|
+
else if (cmd.action === 'message' && cmd.content) {
|
|
76
|
+
relay.send({ action: 'message', content: cmd.content });
|
|
77
|
+
// Responses come through the pushListener
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
jsonOut({ event: 'error', code: 'UNKNOWN_ACTION', message: `Unknown action: ${cmd.action}` });
|
|
84
81
|
}
|
|
85
|
-
jsonOut({ event: 'error', code: 'UNKNOWN_ACTION', message: `Unknown action: ${cmd.action}` });
|
|
86
82
|
}
|
|
87
83
|
}
|
|
88
|
-
async function interactiveMode(
|
|
84
|
+
async function interactiveMode(relay) {
|
|
89
85
|
const rl = createInterface({
|
|
90
86
|
input: process.stdin,
|
|
91
87
|
output: process.stderr,
|
|
92
88
|
prompt: chalk.cyan('> '),
|
|
93
89
|
});
|
|
90
|
+
// Listen for Bridge messages and display them
|
|
91
|
+
const pushListener = (async () => {
|
|
92
|
+
for await (const msg of relay.listen()) {
|
|
93
|
+
switch (msg.type) {
|
|
94
|
+
case 'assistant_text':
|
|
95
|
+
case 'assistant':
|
|
96
|
+
process.stdout.write(String(msg.content || msg.text || ''));
|
|
97
|
+
break;
|
|
98
|
+
case 'formatted':
|
|
99
|
+
if (msg.intro)
|
|
100
|
+
process.stdout.write(String(msg.intro));
|
|
101
|
+
break;
|
|
102
|
+
case 'complete':
|
|
103
|
+
process.stdout.write('\n');
|
|
104
|
+
rl.prompt();
|
|
105
|
+
break;
|
|
106
|
+
case 'cost': {
|
|
107
|
+
const used = msg.credits_used;
|
|
108
|
+
const after = msg.balance_after;
|
|
109
|
+
if (used > 0)
|
|
110
|
+
console.log(chalk.gray(`[Credits: -${used} | Balance: ${after}]`));
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
case 'error':
|
|
114
|
+
console.error(chalk.red(`Error: ${msg.message}`));
|
|
115
|
+
rl.prompt();
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
})();
|
|
94
120
|
rl.prompt();
|
|
95
121
|
for await (const line of rl) {
|
|
96
122
|
const input = line.trim();
|
|
@@ -101,37 +127,14 @@ async function interactiveMode(token, sessionId) {
|
|
|
101
127
|
if (input.toLowerCase() === '/quit' || input.toLowerCase() === '/exit')
|
|
102
128
|
break;
|
|
103
129
|
if (input.toLowerCase() === '/stop') {
|
|
104
|
-
|
|
130
|
+
relay.stop();
|
|
105
131
|
console.log(chalk.yellow('Stopped.'));
|
|
106
132
|
rl.prompt();
|
|
107
133
|
continue;
|
|
108
134
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
switch (evt.event) {
|
|
112
|
-
case 'text':
|
|
113
|
-
process.stdout.write(String(evt.data.content || ''));
|
|
114
|
-
break;
|
|
115
|
-
case 'complete':
|
|
116
|
-
process.stdout.write('\n');
|
|
117
|
-
break;
|
|
118
|
-
case 'cost': {
|
|
119
|
-
const used = evt.data.credits_used;
|
|
120
|
-
const after = evt.data.balance_after;
|
|
121
|
-
if (used > 0)
|
|
122
|
-
console.log(chalk.gray(`[Credits: -${used} | Balance: ${after}]`));
|
|
123
|
-
break;
|
|
124
|
-
}
|
|
125
|
-
case 'error':
|
|
126
|
-
console.error(chalk.red(`Error: ${evt.data.message}`));
|
|
127
|
-
break;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
catch (err) {
|
|
132
|
-
console.error(chalk.red(err instanceof Error ? err.message : String(err)));
|
|
133
|
-
}
|
|
134
|
-
rl.prompt();
|
|
135
|
+
relay.send({ action: 'message', content: input });
|
|
136
|
+
// Response comes through pushListener
|
|
135
137
|
}
|
|
138
|
+
relay.close();
|
|
136
139
|
}
|
|
137
140
|
//# sourceMappingURL=connect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/send.js
CHANGED
|
@@ -1,99 +1,90 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import ora from 'ora';
|
|
3
3
|
import { resolveCredentials } from './helpers/resolve-credentials.js';
|
|
4
|
-
import {
|
|
4
|
+
import { connectRelay, saveSession } from '../lib/relay-client.js';
|
|
5
5
|
export async function sendCommand(message, options) {
|
|
6
6
|
const isHuman = !!options.human;
|
|
7
7
|
try {
|
|
8
8
|
const creds = await resolveCredentials();
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
let sessionId;
|
|
12
|
-
if (options.sessionId) {
|
|
13
|
-
sessionId = options.sessionId;
|
|
14
|
-
}
|
|
15
|
-
else if (options.newSession) {
|
|
16
|
-
const session = await createSession(token);
|
|
17
|
-
sessionId = session.session_id;
|
|
18
|
-
await saveSession({ session_id: sessionId, created_at: new Date().toISOString() });
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
const lastId = await getLastSessionId();
|
|
22
|
-
if (lastId) {
|
|
23
|
-
sessionId = lastId;
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
const session = await createSession(token);
|
|
27
|
-
sessionId = session.session_id;
|
|
28
|
-
await saveSession({ session_id: sessionId, created_at: new Date().toISOString() });
|
|
29
|
-
}
|
|
30
|
-
}
|
|
9
|
+
const relay = await connectRelay(creds.access_token);
|
|
10
|
+
await saveSession({ session_id: relay.sessionId, created_at: new Date().toISOString() });
|
|
31
11
|
if (!isHuman) {
|
|
32
|
-
process.stdout.write(JSON.stringify({ event: 'session_created', session_id: sessionId }) + '\n');
|
|
12
|
+
process.stdout.write(JSON.stringify({ event: 'session_created', session_id: relay.sessionId }) + '\n');
|
|
33
13
|
}
|
|
34
|
-
// Send message and collect response
|
|
35
14
|
const spinner = isHuman ? ora('Thinking...').start() : null;
|
|
36
15
|
let fullResponse = '';
|
|
37
16
|
let creditsUsed = 0;
|
|
38
17
|
let balanceAfter = 0;
|
|
39
|
-
for await (const
|
|
40
|
-
switch (
|
|
41
|
-
case '
|
|
42
|
-
|
|
18
|
+
for await (const msg of relay.sendMessage(message)) {
|
|
19
|
+
switch (msg.type) {
|
|
20
|
+
case 'assistant_text':
|
|
21
|
+
case 'assistant':
|
|
22
|
+
fullResponse += msg.content || msg.text || '';
|
|
43
23
|
if (isHuman) {
|
|
44
24
|
if (spinner?.isSpinning)
|
|
45
25
|
spinner.stop();
|
|
46
26
|
}
|
|
47
27
|
else {
|
|
48
|
-
process.stdout.write(JSON.stringify({ event: 'text', content:
|
|
28
|
+
process.stdout.write(JSON.stringify({ event: 'text', content: msg.content || msg.text }) + '\n');
|
|
49
29
|
}
|
|
50
30
|
break;
|
|
31
|
+
case 'formatted': {
|
|
32
|
+
const intro = msg.intro || '';
|
|
33
|
+
if (intro && !fullResponse.includes(intro)) {
|
|
34
|
+
fullResponse += intro;
|
|
35
|
+
if (isHuman) {
|
|
36
|
+
if (spinner?.isSpinning)
|
|
37
|
+
spinner.stop();
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
process.stdout.write(JSON.stringify({ event: 'text', content: intro }) + '\n');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (!isHuman) {
|
|
44
|
+
process.stdout.write(JSON.stringify({ event: 'formatted', mode: msg.mode, intro, ui_tree: msg.ui_tree, timing: msg.timing }) + '\n');
|
|
45
|
+
}
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
51
48
|
case 'status':
|
|
52
49
|
case 'log':
|
|
53
50
|
if (isHuman && spinner?.isSpinning) {
|
|
54
|
-
spinner.text = (
|
|
51
|
+
spinner.text = (msg.state || msg.level || 'processing');
|
|
55
52
|
}
|
|
56
53
|
else if (!isHuman) {
|
|
57
|
-
process.stdout.write(JSON.stringify({ event:
|
|
58
|
-
}
|
|
59
|
-
break;
|
|
60
|
-
case 'formatted':
|
|
61
|
-
// Agent mode: forward structured data
|
|
62
|
-
if (!isHuman) {
|
|
63
|
-
process.stdout.write(JSON.stringify({ event: 'formatted', ...evt.data }) + '\n');
|
|
54
|
+
process.stdout.write(JSON.stringify({ event: msg.type, ...msg }) + '\n');
|
|
64
55
|
}
|
|
65
56
|
break;
|
|
66
57
|
case 'mode_change':
|
|
67
58
|
if (!isHuman) {
|
|
68
|
-
process.stdout.write(JSON.stringify({ event: 'mode_change',
|
|
59
|
+
process.stdout.write(JSON.stringify({ event: 'mode_change', mode: msg.mode, reason: msg.reason }) + '\n');
|
|
69
60
|
}
|
|
70
61
|
break;
|
|
71
62
|
case 'complete':
|
|
72
63
|
if (!isHuman) {
|
|
73
|
-
process.stdout.write(JSON.stringify({ event: 'complete',
|
|
64
|
+
process.stdout.write(JSON.stringify({ event: 'complete', success: msg.success, mode: msg.mode, usage: msg.usage }) + '\n');
|
|
74
65
|
}
|
|
75
66
|
break;
|
|
76
67
|
case 'cost':
|
|
77
|
-
creditsUsed =
|
|
78
|
-
balanceAfter =
|
|
68
|
+
creditsUsed = msg.credits_used || 0;
|
|
69
|
+
balanceAfter = msg.balance_after || 0;
|
|
79
70
|
if (!isHuman) {
|
|
80
|
-
process.stdout.write(JSON.stringify({ event: 'cost',
|
|
71
|
+
process.stdout.write(JSON.stringify({ event: 'cost', credits_used: creditsUsed, balance_after: balanceAfter }) + '\n');
|
|
81
72
|
}
|
|
82
73
|
break;
|
|
83
74
|
case 'error':
|
|
84
75
|
if (isHuman) {
|
|
85
76
|
if (spinner?.isSpinning)
|
|
86
|
-
spinner.fail(
|
|
87
|
-
console.error(chalk.red(`Error: ${
|
|
77
|
+
spinner.fail(msg.message);
|
|
78
|
+
console.error(chalk.red(`Error: ${msg.message}`));
|
|
88
79
|
}
|
|
89
80
|
else {
|
|
90
|
-
process.stdout.write(JSON.stringify({ event: 'error',
|
|
81
|
+
process.stdout.write(JSON.stringify({ event: 'error', code: msg.code, message: msg.message }) + '\n');
|
|
91
82
|
}
|
|
92
83
|
break;
|
|
93
84
|
}
|
|
94
85
|
}
|
|
95
|
-
|
|
96
|
-
|
|
86
|
+
spinner?.stop();
|
|
87
|
+
relay.close();
|
|
97
88
|
if (isHuman && fullResponse) {
|
|
98
89
|
console.log(fullResponse);
|
|
99
90
|
if (creditsUsed > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,38 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { RelayBalanceResponse, SessionInfo, SessionStore } from './types.js';
|
|
2
|
+
export interface RelayMessage {
|
|
3
|
+
type: string;
|
|
4
|
+
[key: string]: unknown;
|
|
5
|
+
}
|
|
2
6
|
/**
|
|
3
|
-
*
|
|
4
|
-
*/
|
|
5
|
-
export declare function createSession(token: string): Promise<RelaySessionResponse>;
|
|
6
|
-
/**
|
|
7
|
-
* Send a message and yield SSE events as they arrive.
|
|
8
|
-
*/
|
|
9
|
-
export declare function sendMessage(token: string, sessionId: string, content: string): AsyncGenerator<SSEEvent>;
|
|
10
|
-
/**
|
|
11
|
-
* Stop processing for a session.
|
|
12
|
-
*/
|
|
13
|
-
export declare function stopProcessing(token: string, sessionId: string): Promise<void>;
|
|
14
|
-
/**
|
|
15
|
-
* Close a session.
|
|
16
|
-
*/
|
|
17
|
-
export declare function closeSession(token: string, sessionId: string): Promise<void>;
|
|
18
|
-
/**
|
|
19
|
-
* Get credit balance.
|
|
7
|
+
* Connect to Relay via WebSocket. Returns helpers to send/receive messages.
|
|
20
8
|
*/
|
|
9
|
+
export declare function connectRelay(token: string): Promise<RelayConnection>;
|
|
10
|
+
export declare class RelayConnection {
|
|
11
|
+
ws: WebSocket;
|
|
12
|
+
sessionId: string;
|
|
13
|
+
mode: string;
|
|
14
|
+
constructor(ws: WebSocket, sessionId: string, mode: string);
|
|
15
|
+
/**
|
|
16
|
+
* Send an action to Bridge via Relay.
|
|
17
|
+
*/
|
|
18
|
+
send(action: Record<string, unknown>): void;
|
|
19
|
+
/**
|
|
20
|
+
* Send a message and yield Bridge responses until complete.
|
|
21
|
+
*/
|
|
22
|
+
sendMessage(content: string): AsyncGenerator<RelayMessage>;
|
|
23
|
+
/**
|
|
24
|
+
* Listen for all messages (including push messages).
|
|
25
|
+
*/
|
|
26
|
+
listen(): AsyncGenerator<RelayMessage>;
|
|
27
|
+
/**
|
|
28
|
+
* Stop current processing.
|
|
29
|
+
*/
|
|
30
|
+
stop(): void;
|
|
31
|
+
/**
|
|
32
|
+
* Close the connection.
|
|
33
|
+
*/
|
|
34
|
+
close(): void;
|
|
35
|
+
}
|
|
21
36
|
export declare function getBalance(token: string): Promise<RelayBalanceResponse>;
|
|
22
37
|
export declare function loadSessions(): Promise<SessionStore>;
|
|
23
38
|
export declare function saveSession(info: SessionInfo): Promise<void>;
|
package/dist/lib/relay-client.js
CHANGED
|
@@ -2,75 +2,170 @@ import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
import { CONFIG } from './config.js';
|
|
5
|
-
|
|
6
|
-
function relayUrl(path) {
|
|
5
|
+
function relayHttpUrl(path) {
|
|
7
6
|
const base = process.env.CLAWAPPS_RELAY_URL || CONFIG.CLI_RELAY_BASE;
|
|
8
7
|
return `${base}${path}`;
|
|
9
8
|
}
|
|
10
|
-
function
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
9
|
+
function relayWsUrl(token) {
|
|
10
|
+
const base = process.env.CLAWAPPS_RELAY_URL || CONFIG.CLI_RELAY_BASE;
|
|
11
|
+
// Convert https://.../ to wss://.../ws?token=xxx
|
|
12
|
+
const wsBase = base.replace(/^http/, 'ws');
|
|
13
|
+
return `${wsBase}/ws?token=${encodeURIComponent(token)}`;
|
|
15
14
|
}
|
|
16
15
|
/**
|
|
17
|
-
*
|
|
16
|
+
* Connect to Relay via WebSocket. Returns helpers to send/receive messages.
|
|
18
17
|
*/
|
|
19
|
-
export async function
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
export async function connectRelay(token) {
|
|
19
|
+
const wsUrl = relayWsUrl(token);
|
|
20
|
+
const ws = await new Promise((resolve, reject) => {
|
|
21
|
+
const socket = new WebSocket(wsUrl);
|
|
22
|
+
const timeout = setTimeout(() => {
|
|
23
|
+
socket.close();
|
|
24
|
+
reject(new Error('Connection timeout'));
|
|
25
|
+
}, CONFIG.CLI_CONNECT_TIMEOUT_MS);
|
|
26
|
+
socket.addEventListener('open', () => { clearTimeout(timeout); resolve(socket); });
|
|
27
|
+
socket.addEventListener('error', (e) => { clearTimeout(timeout); reject(new Error('Connection failed')); });
|
|
24
28
|
});
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
return await res.json();
|
|
29
|
+
// Wait for initial {type:"connected"} from Relay
|
|
30
|
+
const connMsg = await waitForMessage(ws, 'connected', CONFIG.CLI_CONNECT_TIMEOUT_MS);
|
|
31
|
+
return new RelayConnection(ws, connMsg.session_id, connMsg.mode);
|
|
30
32
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
33
|
+
function waitForMessage(ws, expectedType, timeoutMs) {
|
|
34
|
+
return new Promise((resolve, reject) => {
|
|
35
|
+
const timeout = setTimeout(() => {
|
|
36
|
+
ws.removeEventListener('message', handler);
|
|
37
|
+
reject(new Error(`Timeout waiting for "${expectedType}"`));
|
|
38
|
+
}, timeoutMs);
|
|
39
|
+
function handler(event) {
|
|
40
|
+
try {
|
|
41
|
+
const msg = JSON.parse(event.data);
|
|
42
|
+
if (msg.type === expectedType) {
|
|
43
|
+
clearTimeout(timeout);
|
|
44
|
+
ws.removeEventListener('message', handler);
|
|
45
|
+
resolve(msg);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch { /* keep waiting */ }
|
|
49
|
+
}
|
|
50
|
+
ws.addEventListener('message', handler);
|
|
40
51
|
});
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
52
|
+
}
|
|
53
|
+
export class RelayConnection {
|
|
54
|
+
ws;
|
|
55
|
+
sessionId;
|
|
56
|
+
mode;
|
|
57
|
+
constructor(ws, sessionId, mode) {
|
|
58
|
+
this.ws = ws;
|
|
59
|
+
this.sessionId = sessionId;
|
|
60
|
+
this.mode = mode;
|
|
44
61
|
}
|
|
45
|
-
|
|
46
|
-
|
|
62
|
+
/**
|
|
63
|
+
* Send an action to Bridge via Relay.
|
|
64
|
+
*/
|
|
65
|
+
send(action) {
|
|
66
|
+
if (this.ws.readyState === WebSocket.OPEN) {
|
|
67
|
+
this.ws.send(JSON.stringify(action));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Send a message and yield Bridge responses until complete.
|
|
72
|
+
*/
|
|
73
|
+
async *sendMessage(content) {
|
|
74
|
+
this.send({ action: 'message', content });
|
|
75
|
+
const messageQueue = [];
|
|
76
|
+
let resolve = null;
|
|
77
|
+
let done = false;
|
|
78
|
+
const handler = (event) => {
|
|
79
|
+
try {
|
|
80
|
+
const msg = JSON.parse(event.data);
|
|
81
|
+
messageQueue.push(msg);
|
|
82
|
+
if (resolve) {
|
|
83
|
+
resolve();
|
|
84
|
+
resolve = null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch { /* ignore */ }
|
|
88
|
+
};
|
|
89
|
+
this.ws.addEventListener('message', handler);
|
|
90
|
+
try {
|
|
91
|
+
while (!done) {
|
|
92
|
+
if (messageQueue.length === 0) {
|
|
93
|
+
await new Promise((r) => { resolve = r; });
|
|
94
|
+
}
|
|
95
|
+
while (messageQueue.length > 0) {
|
|
96
|
+
const msg = messageQueue.shift();
|
|
97
|
+
yield msg;
|
|
98
|
+
if (msg.type === 'complete' || msg.type === 'error') {
|
|
99
|
+
done = true;
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
this.ws.removeEventListener('message', handler);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Listen for all messages (including push messages).
|
|
111
|
+
*/
|
|
112
|
+
async *listen() {
|
|
113
|
+
const messageQueue = [];
|
|
114
|
+
let resolve = null;
|
|
115
|
+
let closed = false;
|
|
116
|
+
const handler = (event) => {
|
|
117
|
+
try {
|
|
118
|
+
const msg = JSON.parse(event.data);
|
|
119
|
+
messageQueue.push(msg);
|
|
120
|
+
if (resolve) {
|
|
121
|
+
resolve();
|
|
122
|
+
resolve = null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch { /* ignore */ }
|
|
126
|
+
};
|
|
127
|
+
const closeHandler = () => {
|
|
128
|
+
closed = true;
|
|
129
|
+
if (resolve) {
|
|
130
|
+
resolve();
|
|
131
|
+
resolve = null;
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
this.ws.addEventListener('message', handler);
|
|
135
|
+
this.ws.addEventListener('close', closeHandler);
|
|
136
|
+
try {
|
|
137
|
+
while (!closed) {
|
|
138
|
+
if (messageQueue.length === 0) {
|
|
139
|
+
await new Promise((r) => { resolve = r; });
|
|
140
|
+
}
|
|
141
|
+
while (messageQueue.length > 0) {
|
|
142
|
+
yield messageQueue.shift();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
finally {
|
|
147
|
+
this.ws.removeEventListener('message', handler);
|
|
148
|
+
this.ws.removeEventListener('close', closeHandler);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Stop current processing.
|
|
153
|
+
*/
|
|
154
|
+
stop() {
|
|
155
|
+
this.send({ action: 'stop' });
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Close the connection.
|
|
159
|
+
*/
|
|
160
|
+
close() {
|
|
161
|
+
if (this.ws.readyState === WebSocket.OPEN) {
|
|
162
|
+
this.ws.close(1000, 'Client close');
|
|
163
|
+
}
|
|
47
164
|
}
|
|
48
|
-
yield* parseSSE(res.body);
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Stop processing for a session.
|
|
52
|
-
*/
|
|
53
|
-
export async function stopProcessing(token, sessionId) {
|
|
54
|
-
await fetch(relayUrl(`/session/${sessionId}/stop`), {
|
|
55
|
-
method: 'POST',
|
|
56
|
-
headers: authHeaders(token),
|
|
57
|
-
body: '{}',
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Close a session.
|
|
62
|
-
*/
|
|
63
|
-
export async function closeSession(token, sessionId) {
|
|
64
|
-
await fetch(relayUrl(`/session/${sessionId}`), {
|
|
65
|
-
method: 'DELETE',
|
|
66
|
-
headers: { 'Authorization': `Bearer ${token}` },
|
|
67
|
-
});
|
|
68
165
|
}
|
|
69
|
-
|
|
70
|
-
* Get credit balance.
|
|
71
|
-
*/
|
|
166
|
+
// --- HTTP endpoints (balance, no WS needed) ---
|
|
72
167
|
export async function getBalance(token) {
|
|
73
|
-
const res = await fetch(
|
|
168
|
+
const res = await fetch(relayHttpUrl('/balance'), {
|
|
74
169
|
method: 'GET',
|
|
75
170
|
headers: { 'Authorization': `Bearer ${token}` },
|
|
76
171
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-client.js","sourceRoot":"","sources":["../../src/lib/relay-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"relay-client.js","sourceRoot":"","sources":["../../src/lib/relay-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/dist/lib/sse-parser.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { SSEEvent } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Parse a Server-Sent Events stream into structured events.
|
|
4
|
-
*
|
|
5
|
-
* SSE format:
|
|
6
|
-
* event: text
|
|
7
|
-
* data: {"content":"hello"}
|
|
8
|
-
*
|
|
9
|
-
* event: complete
|
|
10
|
-
* data: {"success":true}
|
|
11
|
-
*/
|
|
12
|
-
export declare function parseSSE(body: ReadableStream<Uint8Array>): AsyncGenerator<SSEEvent>;
|
package/dist/lib/sse-parser.js
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Parse a Server-Sent Events stream into structured events.
|
|
3
|
-
*
|
|
4
|
-
* SSE format:
|
|
5
|
-
* event: text
|
|
6
|
-
* data: {"content":"hello"}
|
|
7
|
-
*
|
|
8
|
-
* event: complete
|
|
9
|
-
* data: {"success":true}
|
|
10
|
-
*/
|
|
11
|
-
export async function* parseSSE(body) {
|
|
12
|
-
const reader = body.pipeThrough(new TextDecoderStream()).getReader();
|
|
13
|
-
let buffer = '';
|
|
14
|
-
let currentEvent = '';
|
|
15
|
-
let currentData = '';
|
|
16
|
-
try {
|
|
17
|
-
while (true) {
|
|
18
|
-
const { done, value } = await reader.read();
|
|
19
|
-
if (done)
|
|
20
|
-
break;
|
|
21
|
-
buffer += value;
|
|
22
|
-
const lines = buffer.split('\n');
|
|
23
|
-
// Keep the last incomplete line in buffer
|
|
24
|
-
buffer = lines.pop() || '';
|
|
25
|
-
for (const line of lines) {
|
|
26
|
-
if (line.startsWith('event: ')) {
|
|
27
|
-
currentEvent = line.slice(7).trim();
|
|
28
|
-
}
|
|
29
|
-
else if (line.startsWith('data: ')) {
|
|
30
|
-
currentData = line.slice(6);
|
|
31
|
-
}
|
|
32
|
-
else if (line === '' && currentEvent && currentData) {
|
|
33
|
-
// Empty line = end of event
|
|
34
|
-
try {
|
|
35
|
-
const data = JSON.parse(currentData);
|
|
36
|
-
yield { event: currentEvent, data };
|
|
37
|
-
}
|
|
38
|
-
catch {
|
|
39
|
-
yield { event: currentEvent, data: { raw: currentData } };
|
|
40
|
-
}
|
|
41
|
-
currentEvent = '';
|
|
42
|
-
currentData = '';
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
// Flush any remaining event
|
|
47
|
-
if (currentEvent && currentData) {
|
|
48
|
-
try {
|
|
49
|
-
const data = JSON.parse(currentData);
|
|
50
|
-
yield { event: currentEvent, data };
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
yield { event: currentEvent, data: { raw: currentData } };
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
finally {
|
|
58
|
-
reader.releaseLock();
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=sse-parser.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sse-parser.js","sourceRoot":"","sources":["../../src/lib/sse-parser.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,QAAQ,CAC7B,IAAgC;IAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,iBAAiB,EAAS,CAAC,CAAC,SAAS,EAAE,CAAC;IAE5E,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,WAAW,GAAG,EAAE,CAAC;IAErB,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAEhB,MAAM,IAAI,KAAK,CAAC;YAChB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,0CAA0C;YAC1C,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC/B,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACtC,CAAC;qBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACrC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC9B,CAAC;qBAAM,IAAI,IAAI,KAAK,EAAE,IAAI,YAAY,IAAI,WAAW,EAAE,CAAC;oBACtD,4BAA4B;oBAC5B,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;wBACrC,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;oBACtC,CAAC;oBAAC,MAAM,CAAC;wBACP,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,CAAC;oBAC5D,CAAC;oBACD,YAAY,GAAG,EAAE,CAAC;oBAClB,WAAW,GAAG,EAAE,CAAC;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,IAAI,YAAY,IAAI,WAAW,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBACrC,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;AACH,CAAC"}
|