@openclaw-cloud/agent-controller 0.13.0 → 0.14.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/handlers/board-handler.d.ts +1 -1
- package/dist/handlers/board-handler.js +54 -18
- package/dist/handlers/board-handler.js.map +1 -1
- package/dist/handlers/chat.js +4 -4
- package/dist/handlers/chat.js.map +1 -1
- package/dist/handlers/deploy.js +46 -42
- package/dist/handlers/deploy.js.map +1 -1
- package/dist/handlers/update-auth-profiles.js +10 -4
- package/dist/handlers/update-auth-profiles.js.map +1 -1
- package/dist/heartbeat.js +12 -15
- package/dist/heartbeat.js.map +1 -1
- package/dist/index.js +25 -10
- package/dist/index.js.map +1 -1
- package/dist/openclaw/gateway-adapter.d.ts +5 -23
- package/dist/openclaw/gateway-adapter.js +3 -178
- package/dist/openclaw/gateway-adapter.js.map +1 -1
- package/dist/openclaw/index.d.ts +10 -9
- package/dist/openclaw/index.js +19 -61
- package/dist/openclaw/index.js.map +1 -1
- package/dist/openclaw/types.d.ts +5 -37
- package/dist/providers/chat-types.d.ts +39 -0
- package/dist/providers/chat-types.js +6 -0
- package/dist/providers/chat-types.js.map +1 -0
- package/dist/providers/index.d.ts +11 -0
- package/dist/providers/index.js +26 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/mock/index.d.ts +25 -0
- package/dist/providers/mock/index.js +40 -0
- package/dist/providers/mock/index.js.map +1 -0
- package/dist/providers/openclaw/gateway-adapter.d.ts +24 -0
- package/dist/providers/openclaw/gateway-adapter.js +181 -0
- package/dist/providers/openclaw/gateway-adapter.js.map +1 -0
- package/dist/providers/openclaw/gateway-client.d.ts +21 -0
- package/dist/providers/openclaw/gateway-client.js +138 -0
- package/dist/providers/openclaw/gateway-client.js.map +1 -0
- package/dist/providers/openclaw/index.d.ts +21 -0
- package/dist/providers/openclaw/index.js +120 -0
- package/dist/providers/openclaw/index.js.map +1 -0
- package/dist/providers/types.d.ts +38 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/types.d.ts +6 -0
- package/dist/utils/gateway-restart.d.ts +7 -4
- package/dist/utils/gateway-restart.js +15 -19
- package/dist/utils/gateway-restart.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,181 +1,6 @@
|
|
|
1
|
-
import { GatewayClient } from './gateway-client.js';
|
|
2
|
-
import { toErrorMessage } from '../utils/response.js';
|
|
3
|
-
const STREAM_TTL = 300_000; // 5 min
|
|
4
1
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* - string: "hello"
|
|
8
|
-
* - content array: [{type:"text", text:"hello"}]
|
|
9
|
-
* - message object: {role, content: [{type:"text", text:"hello"}], timestamp}
|
|
2
|
+
* @deprecated — moved to src/providers/openclaw/gateway-adapter.ts
|
|
3
|
+
* This file is kept for backward compatibility.
|
|
10
4
|
*/
|
|
11
|
-
|
|
12
|
-
if (typeof msg === 'string')
|
|
13
|
-
return msg;
|
|
14
|
-
if (Array.isArray(msg)) {
|
|
15
|
-
return msg
|
|
16
|
-
.filter((c) => c.type === 'text')
|
|
17
|
-
.map((c) => c.text)
|
|
18
|
-
.join('');
|
|
19
|
-
}
|
|
20
|
-
if (typeof msg === 'object' && msg !== null) {
|
|
21
|
-
const obj = msg;
|
|
22
|
-
// {role, content: [...], timestamp} format
|
|
23
|
-
if (Array.isArray(obj['content'])) {
|
|
24
|
-
return obj['content']
|
|
25
|
-
.filter((c) => c.type === 'text')
|
|
26
|
-
.map((c) => c.text)
|
|
27
|
-
.join('');
|
|
28
|
-
}
|
|
29
|
-
// {text: "..."} shorthand
|
|
30
|
-
if (typeof obj['text'] === 'string')
|
|
31
|
-
return obj['text'];
|
|
32
|
-
}
|
|
33
|
-
return '';
|
|
34
|
-
}
|
|
35
|
-
export class OpenclawGatewayAdapter {
|
|
36
|
-
client;
|
|
37
|
-
streamCallbacks = new Map();
|
|
38
|
-
constructor(url, token) {
|
|
39
|
-
this.client = new GatewayClient(url, token);
|
|
40
|
-
this.client.setEventHandler(this.handleEvent.bind(this));
|
|
41
|
-
}
|
|
42
|
-
async connect() {
|
|
43
|
-
await this.client.connect();
|
|
44
|
-
}
|
|
45
|
-
disconnect() {
|
|
46
|
-
// Notify all in-flight streams before closing
|
|
47
|
-
for (const [, cb] of this.streamCallbacks) {
|
|
48
|
-
clearTimeout(cb.timer);
|
|
49
|
-
cb.onError?.('Connection closed');
|
|
50
|
-
}
|
|
51
|
-
this.streamCallbacks.clear();
|
|
52
|
-
this.client.disconnect();
|
|
53
|
-
}
|
|
54
|
-
isConnected() {
|
|
55
|
-
return this.client.isConnected();
|
|
56
|
-
}
|
|
57
|
-
async listSessions() {
|
|
58
|
-
const result = await this.client.request('sessions.list', {});
|
|
59
|
-
return (result?.sessions ?? []).map((s) => ({
|
|
60
|
-
key: s.key,
|
|
61
|
-
sessionId: s.sessionId ?? '',
|
|
62
|
-
kind: s.kind ?? 'direct',
|
|
63
|
-
label: s.key.split(':').pop() ?? s.key,
|
|
64
|
-
updatedAt: s.updatedAt ?? 0,
|
|
65
|
-
model: s.model,
|
|
66
|
-
}));
|
|
67
|
-
}
|
|
68
|
-
async getHistory(sessionKey, limit = 200) {
|
|
69
|
-
const result = await this.client.request('chat.history', { sessionKey, limit });
|
|
70
|
-
const messages = (result?.messages ?? [])
|
|
71
|
-
.filter((m) => m.role === 'user' || m.role === 'assistant')
|
|
72
|
-
.map((m) => {
|
|
73
|
-
const content = Array.isArray(m.content)
|
|
74
|
-
? m.content.filter((c) => c.type === 'text').map((c) => c.text).join('')
|
|
75
|
-
: String(m.content ?? '');
|
|
76
|
-
return {
|
|
77
|
-
role: m.role,
|
|
78
|
-
content,
|
|
79
|
-
timestamp: typeof m.timestamp === 'number'
|
|
80
|
-
? new Date(m.timestamp).toISOString()
|
|
81
|
-
: m.timestamp ?? new Date().toISOString(),
|
|
82
|
-
};
|
|
83
|
-
});
|
|
84
|
-
// Deduplicate consecutive assistant messages with same content
|
|
85
|
-
return messages.filter((msg, i) => {
|
|
86
|
-
if (i === 0)
|
|
87
|
-
return true;
|
|
88
|
-
const prev = messages[i - 1];
|
|
89
|
-
return !(msg.role === 'assistant' && prev.role === 'assistant' && msg.content === prev.content);
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
async sendMessage(params) {
|
|
93
|
-
const key = params.idempotencyKey;
|
|
94
|
-
// TTL timer: if no final/error event arrives within 5 min, clean up and error
|
|
95
|
-
const timer = setTimeout(() => {
|
|
96
|
-
const cb = this.streamCallbacks.get(key);
|
|
97
|
-
if (cb) {
|
|
98
|
-
this.streamCallbacks.delete(key);
|
|
99
|
-
cb.onError?.('Stream timeout');
|
|
100
|
-
}
|
|
101
|
-
}, STREAM_TTL);
|
|
102
|
-
// Register stream callbacks BEFORE sending
|
|
103
|
-
this.streamCallbacks.set(key, {
|
|
104
|
-
onDelta: params.onDelta,
|
|
105
|
-
onDone: params.onDone,
|
|
106
|
-
onError: params.onError,
|
|
107
|
-
lastText: '',
|
|
108
|
-
timer,
|
|
109
|
-
});
|
|
110
|
-
const payload = {
|
|
111
|
-
sessionKey: params.sessionKey,
|
|
112
|
-
message: params.text,
|
|
113
|
-
deliver: false,
|
|
114
|
-
idempotencyKey: key,
|
|
115
|
-
};
|
|
116
|
-
if (params.attachments?.length) {
|
|
117
|
-
payload['attachments'] = params.attachments;
|
|
118
|
-
}
|
|
119
|
-
try {
|
|
120
|
-
await this.client.request('chat.send', payload);
|
|
121
|
-
// Request accepted — response comes via events
|
|
122
|
-
}
|
|
123
|
-
catch (err) {
|
|
124
|
-
const cb = this.streamCallbacks.get(key);
|
|
125
|
-
if (cb) {
|
|
126
|
-
clearTimeout(cb.timer);
|
|
127
|
-
this.streamCallbacks.delete(key);
|
|
128
|
-
}
|
|
129
|
-
params.onError?.(toErrorMessage(err));
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
async abort(sessionKey, runId) {
|
|
133
|
-
await this.client.request('chat.abort', { sessionKey, runId }).catch(() => { });
|
|
134
|
-
}
|
|
135
|
-
deleteStream(runId) {
|
|
136
|
-
const cb = this.streamCallbacks.get(runId);
|
|
137
|
-
if (cb) {
|
|
138
|
-
clearTimeout(cb.timer);
|
|
139
|
-
this.streamCallbacks.delete(runId);
|
|
140
|
-
}
|
|
141
|
-
return cb;
|
|
142
|
-
}
|
|
143
|
-
handleEvent(event) {
|
|
144
|
-
console.log('[chat] Gateway event:', event.event, JSON.stringify(event.payload).slice(0, 500));
|
|
145
|
-
const data = event.payload;
|
|
146
|
-
if (!data || !data['sessionKey'])
|
|
147
|
-
return;
|
|
148
|
-
// Stream events have runId matching idempotencyKey
|
|
149
|
-
const runId = data['runId'];
|
|
150
|
-
const cb = runId ? this.streamCallbacks.get(runId) : null;
|
|
151
|
-
if (!cb)
|
|
152
|
-
return;
|
|
153
|
-
if (data['state'] === 'delta' && data['message'] != null) {
|
|
154
|
-
const msg = data['message'];
|
|
155
|
-
const text = extractText(msg);
|
|
156
|
-
console.log('[chat] delta extracted:', text.slice(0, 100));
|
|
157
|
-
cb.lastText = text;
|
|
158
|
-
cb.onDelta?.(text);
|
|
159
|
-
}
|
|
160
|
-
else if (data['state'] === 'final') {
|
|
161
|
-
const finalMsg = data['message'];
|
|
162
|
-
const finalText = finalMsg ? extractText(finalMsg) : cb.lastText;
|
|
163
|
-
console.log('[chat] final text:', finalText.slice(0, 100), 'lastText:', cb.lastText.slice(0, 100));
|
|
164
|
-
this.deleteStream(runId);
|
|
165
|
-
cb.onDone?.(finalText || cb.lastText);
|
|
166
|
-
}
|
|
167
|
-
else if (data['state'] === 'aborted') {
|
|
168
|
-
this.deleteStream(runId);
|
|
169
|
-
cb.onDone?.(cb.lastText); // still send whatever we have
|
|
170
|
-
}
|
|
171
|
-
else if (data['state'] === 'error') {
|
|
172
|
-
this.deleteStream(runId);
|
|
173
|
-
const errData = data['error'];
|
|
174
|
-
const errMsg = typeof errData === 'string'
|
|
175
|
-
? errData
|
|
176
|
-
: errData?.message ?? 'Unknown error';
|
|
177
|
-
cb.onError?.(errMsg);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
5
|
+
export { OpenclawGatewayAdapter } from '../providers/openclaw/gateway-adapter.js';
|
|
181
6
|
//# sourceMappingURL=gateway-adapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-adapter.js","sourceRoot":"","sources":["../../src/openclaw/gateway-adapter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"gateway-adapter.js","sourceRoot":"","sources":["../../src/openclaw/gateway-adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC"}
|
package/dist/openclaw/index.d.ts
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
|
-
export { OpenclawGatewayAdapter } from './gateway-adapter.js';
|
|
2
|
-
export type { IChatProvider, ChatSession, ChatMessage, ChatAttachment } from './types.js';
|
|
3
|
-
import type { IChatProvider } from './types.js';
|
|
4
1
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
2
|
+
* @deprecated — use src/providers/index.ts instead.
|
|
3
|
+
* Kept for backward compatibility.
|
|
7
4
|
*/
|
|
5
|
+
export { OpenclawGatewayAdapter } from '../providers/openclaw/gateway-adapter.js';
|
|
6
|
+
export type { IChatProvider, ChatSession, ChatMessage, ChatAttachment } from '../providers/chat-types.js';
|
|
7
|
+
import type { IChatProvider } from '../providers/chat-types.js';
|
|
8
|
+
/** @deprecated Use configureProvider() from providers/index.ts */
|
|
8
9
|
export declare function configureChatProvider(url: string, token: string): void;
|
|
9
|
-
/**
|
|
10
|
-
* Get the chat provider, connecting lazily if needed.
|
|
11
|
-
* Returns null if not configured or connect fails.
|
|
12
|
-
*/
|
|
10
|
+
/** @deprecated Use getProvider() from providers/index.ts */
|
|
13
11
|
export declare function getChatProvider(): Promise<IChatProvider | null>;
|
|
12
|
+
/** @deprecated Use getProvider()?.disconnect() */
|
|
14
13
|
export declare function disconnectChatProvider(): void;
|
|
14
|
+
/** @deprecated Use resetProvider() from providers/index.ts */
|
|
15
15
|
export declare function resetChatProvider(): void;
|
|
16
|
+
/** @deprecated Use configureProvider() */
|
|
16
17
|
export declare function createChatProvider(url: string, token: string): {
|
|
17
18
|
connect(): Promise<void>;
|
|
18
19
|
disconnect(): void;
|
package/dist/openclaw/index.js
CHANGED
|
@@ -1,82 +1,40 @@
|
|
|
1
|
-
export { OpenclawGatewayAdapter } from './gateway-adapter.js';
|
|
2
|
-
import { OpenclawGatewayAdapter } from './gateway-adapter.js';
|
|
3
|
-
let _url = null;
|
|
4
|
-
let _token = null;
|
|
5
|
-
let _provider = null;
|
|
6
|
-
let _connecting = null;
|
|
7
1
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
2
|
+
* @deprecated — use src/providers/index.ts instead.
|
|
3
|
+
* Kept for backward compatibility.
|
|
10
4
|
*/
|
|
5
|
+
export { OpenclawGatewayAdapter } from '../providers/openclaw/gateway-adapter.js';
|
|
6
|
+
import { getProvider, configureProvider } from '../providers/index.js';
|
|
7
|
+
import { OpenclawProvider } from '../providers/openclaw/index.js';
|
|
8
|
+
/** @deprecated Use configureProvider() from providers/index.ts */
|
|
11
9
|
export function configureChatProvider(url, token) {
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
const provider = new OpenclawProvider(url, token);
|
|
11
|
+
configureProvider(provider);
|
|
14
12
|
}
|
|
15
|
-
/**
|
|
16
|
-
* Get the chat provider, connecting lazily if needed.
|
|
17
|
-
* Returns null if not configured or connect fails.
|
|
18
|
-
*/
|
|
13
|
+
/** @deprecated Use getProvider() from providers/index.ts */
|
|
19
14
|
export async function getChatProvider() {
|
|
20
|
-
|
|
15
|
+
const provider = getProvider();
|
|
16
|
+
if (!provider)
|
|
21
17
|
return null;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
// Already connecting — wait for it
|
|
25
|
-
if (_connecting) {
|
|
18
|
+
// Ensure connected before returning
|
|
19
|
+
if (!provider.isConnected()) {
|
|
26
20
|
try {
|
|
27
|
-
await
|
|
28
|
-
return _provider;
|
|
21
|
+
await provider.connect();
|
|
29
22
|
}
|
|
30
23
|
catch {
|
|
31
24
|
return null;
|
|
32
25
|
}
|
|
33
26
|
}
|
|
34
|
-
|
|
35
|
-
_connecting = (async () => {
|
|
36
|
-
const maxRetries = 5;
|
|
37
|
-
const baseDelayMs = 2000;
|
|
38
|
-
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
39
|
-
try {
|
|
40
|
-
// Recreate adapter on each attempt for clean state
|
|
41
|
-
_provider = new OpenclawGatewayAdapter(_url, _token);
|
|
42
|
-
await _provider.connect();
|
|
43
|
-
console.log(`OpenClaw Gateway WS connected (attempt ${attempt})`);
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
catch (e) {
|
|
47
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
48
|
-
console.warn(`Chat provider connect failed (attempt ${attempt}/${maxRetries}): ${msg}`);
|
|
49
|
-
_provider?.disconnect();
|
|
50
|
-
_provider = null;
|
|
51
|
-
if (attempt < maxRetries) {
|
|
52
|
-
await new Promise((r) => setTimeout(r, baseDelayMs * Math.min(attempt, 5)));
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
throw new Error('Chat provider connect exhausted');
|
|
57
|
-
})();
|
|
58
|
-
try {
|
|
59
|
-
await _connecting;
|
|
60
|
-
return _provider;
|
|
61
|
-
}
|
|
62
|
-
catch {
|
|
63
|
-
return null;
|
|
64
|
-
}
|
|
65
|
-
finally {
|
|
66
|
-
_connecting = null;
|
|
67
|
-
}
|
|
27
|
+
return provider;
|
|
68
28
|
}
|
|
29
|
+
/** @deprecated Use getProvider()?.disconnect() */
|
|
69
30
|
export function disconnectChatProvider() {
|
|
70
|
-
|
|
71
|
-
_provider = null;
|
|
72
|
-
_connecting = null;
|
|
31
|
+
getProvider()?.disconnect();
|
|
73
32
|
}
|
|
33
|
+
/** @deprecated Use resetProvider() from providers/index.ts */
|
|
74
34
|
export function resetChatProvider() {
|
|
75
|
-
_url = null;
|
|
76
|
-
_token = null;
|
|
77
35
|
disconnectChatProvider();
|
|
78
36
|
}
|
|
79
|
-
|
|
37
|
+
/** @deprecated Use configureProvider() */
|
|
80
38
|
export function createChatProvider(url, token) {
|
|
81
39
|
configureChatProvider(url, token);
|
|
82
40
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/openclaw/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/openclaw/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAGlF,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAGlE,kEAAkE;AAClE,MAAM,UAAU,qBAAqB,CAAC,GAAW,EAAE,KAAa;IAC9D,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClD,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAED,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,oCAAoC;IACpC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,QAAoC,CAAC;AAC9C,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,sBAAsB;IACpC,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC;AAC9B,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,iBAAiB;IAC/B,sBAAsB,EAAE,CAAC;AAC3B,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,KAAa;IAC3D,qBAAqB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClC,OAAO;QACL,OAAO,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC,CAAC,CAAC;QACjD,UAAU,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;KAC3C,CAAC;AACJ,CAAC"}
|
package/dist/openclaw/types.d.ts
CHANGED
|
@@ -1,37 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
updatedAt: number;
|
|
7
|
-
model?: string;
|
|
8
|
-
}
|
|
9
|
-
export interface ChatMessage {
|
|
10
|
-
role: 'user' | 'assistant';
|
|
11
|
-
content: string;
|
|
12
|
-
timestamp: string;
|
|
13
|
-
}
|
|
14
|
-
export interface ChatAttachment {
|
|
15
|
-
type: 'image';
|
|
16
|
-
mimeType: string;
|
|
17
|
-
content: string;
|
|
18
|
-
}
|
|
19
|
-
export interface IChatProvider {
|
|
20
|
-
listSessions(): Promise<ChatSession[]>;
|
|
21
|
-
getHistory(sessionKey: string, limit?: number): Promise<ChatMessage[]>;
|
|
22
|
-
/**
|
|
23
|
-
* Send message. Returns after the agent finishes (full response).
|
|
24
|
-
* Calls onDelta with accumulated text during streaming.
|
|
25
|
-
* Calls onDone when agent response is complete.
|
|
26
|
-
*/
|
|
27
|
-
sendMessage(params: {
|
|
28
|
-
sessionKey: string;
|
|
29
|
-
text: string;
|
|
30
|
-
idempotencyKey: string;
|
|
31
|
-
attachments?: ChatAttachment[];
|
|
32
|
-
onDelta?: (accumulatedText: string) => void;
|
|
33
|
-
onDone?: (finalText: string) => void;
|
|
34
|
-
onError?: (error: string) => void;
|
|
35
|
-
}): Promise<void>;
|
|
36
|
-
abort(sessionKey: string, runId?: string): Promise<void>;
|
|
37
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* @deprecated — moved to src/providers/chat-types.ts
|
|
3
|
+
* This file is kept for backward compatibility.
|
|
4
|
+
*/
|
|
5
|
+
export type { ChatSession, ChatMessage, ChatAttachment, IChatProvider } from '../providers/chat-types.js';
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat types for agent communication.
|
|
3
|
+
* These were previously in src/openclaw/types.ts and are kept there for backward compat.
|
|
4
|
+
*/
|
|
5
|
+
export interface ChatSession {
|
|
6
|
+
key: string;
|
|
7
|
+
sessionId: string;
|
|
8
|
+
kind: string;
|
|
9
|
+
label: string;
|
|
10
|
+
updatedAt: number;
|
|
11
|
+
model?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ChatMessage {
|
|
14
|
+
role: 'user' | 'assistant';
|
|
15
|
+
content: string;
|
|
16
|
+
timestamp: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ChatAttachment {
|
|
19
|
+
type: 'image';
|
|
20
|
+
mimeType: string;
|
|
21
|
+
content: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* @deprecated Use IAgentProvider from providers/types.ts
|
|
25
|
+
*/
|
|
26
|
+
export interface IChatProvider {
|
|
27
|
+
listSessions(): Promise<ChatSession[]>;
|
|
28
|
+
getHistory(sessionKey: string, limit?: number): Promise<ChatMessage[]>;
|
|
29
|
+
sendMessage(params: {
|
|
30
|
+
sessionKey: string;
|
|
31
|
+
text: string;
|
|
32
|
+
idempotencyKey: string;
|
|
33
|
+
attachments?: ChatAttachment[];
|
|
34
|
+
onDelta?: (accumulatedText: string) => void;
|
|
35
|
+
onDone?: (finalText: string) => void;
|
|
36
|
+
onError?: (error: string) => void;
|
|
37
|
+
}): Promise<void>;
|
|
38
|
+
abort(sessionKey: string, runId?: string): Promise<void>;
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-types.js","sourceRoot":"","sources":["../../src/providers/chat-types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { IAgentProvider } from './types.js';
|
|
2
|
+
export type { IAgentProvider, AgentHealthStatus, SendMessageParams } from './types.js';
|
|
3
|
+
export type { ChatSession, ChatMessage, ChatAttachment, IChatProvider } from './chat-types.js';
|
|
4
|
+
export { OpenclawProvider } from './openclaw/index.js';
|
|
5
|
+
export { MockProvider } from './mock/index.js';
|
|
6
|
+
export type { MockAction } from './mock/index.js';
|
|
7
|
+
export declare function configureProvider(provider: IAgentProvider): void;
|
|
8
|
+
export declare function getProvider(): IAgentProvider | null;
|
|
9
|
+
/** For testing only — reset the global provider */
|
|
10
|
+
export declare function resetProvider(): void;
|
|
11
|
+
export declare function createProvider(type: string, config: Record<string, string>): IAgentProvider;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { OpenclawProvider } from './openclaw/index.js';
|
|
2
|
+
import { MockProvider } from './mock/index.js';
|
|
3
|
+
export { OpenclawProvider } from './openclaw/index.js';
|
|
4
|
+
export { MockProvider } from './mock/index.js';
|
|
5
|
+
let _provider = null;
|
|
6
|
+
export function configureProvider(provider) {
|
|
7
|
+
_provider = provider;
|
|
8
|
+
}
|
|
9
|
+
export function getProvider() {
|
|
10
|
+
return _provider;
|
|
11
|
+
}
|
|
12
|
+
/** For testing only — reset the global provider */
|
|
13
|
+
export function resetProvider() {
|
|
14
|
+
_provider = null;
|
|
15
|
+
}
|
|
16
|
+
export function createProvider(type, config) {
|
|
17
|
+
switch (type) {
|
|
18
|
+
case 'openclaw':
|
|
19
|
+
return new OpenclawProvider(config.wsUrl ?? 'ws://localhost:18789', config.wsToken ?? '');
|
|
20
|
+
case 'mock':
|
|
21
|
+
return new MockProvider();
|
|
22
|
+
default:
|
|
23
|
+
throw new Error(`Unknown provider type: ${type}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAI/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,IAAI,SAAS,GAA0B,IAAI,CAAC;AAE5C,MAAM,UAAU,iBAAiB,CAAC,QAAwB;IACxD,SAAS,GAAG,QAAQ,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,aAAa;IAC3B,SAAS,GAAG,IAAI,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,MAA8B;IACzE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,UAAU;YACb,OAAO,IAAI,gBAAgB,CACzB,MAAM,CAAC,KAAK,IAAI,sBAAsB,EACtC,MAAM,CAAC,OAAO,IAAI,EAAE,CACrB,CAAC;QACJ,KAAK,MAAM;YACT,OAAO,IAAI,YAAY,EAAE,CAAC;QAC5B;YACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { IAgentProvider, AgentHealthStatus, SendMessageParams } from '../types.js';
|
|
2
|
+
import type { ChatSession, ChatMessage } from '../chat-types.js';
|
|
3
|
+
export interface MockAction {
|
|
4
|
+
type: 'wait' | 'artifact' | 'comment' | 'result' | 'move';
|
|
5
|
+
ms?: number;
|
|
6
|
+
body?: Record<string, unknown>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Mock provider for testing. Does not connect to any external service.
|
|
10
|
+
* When sendMessage is called, it calls onDone with a mock response.
|
|
11
|
+
*/
|
|
12
|
+
export declare class MockProvider implements IAgentProvider {
|
|
13
|
+
readonly name = "mock";
|
|
14
|
+
private _connected;
|
|
15
|
+
connect(): Promise<void>;
|
|
16
|
+
disconnect(): void;
|
|
17
|
+
isConnected(): boolean;
|
|
18
|
+
sendMessage(params: SendMessageParams): Promise<void>;
|
|
19
|
+
listSessions(): Promise<ChatSession[]>;
|
|
20
|
+
getHistory(_sessionKey: string, _limit?: number): Promise<ChatMessage[]>;
|
|
21
|
+
abort(_sessionKey: string, _runId?: string): Promise<void>;
|
|
22
|
+
healthCheck(): Promise<AgentHealthStatus>;
|
|
23
|
+
restart(): Promise<void>;
|
|
24
|
+
install(_currentVersion?: string): Promise<void>;
|
|
25
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock provider for testing. Does not connect to any external service.
|
|
3
|
+
* When sendMessage is called, it calls onDone with a mock response.
|
|
4
|
+
*/
|
|
5
|
+
export class MockProvider {
|
|
6
|
+
name = 'mock';
|
|
7
|
+
_connected = false;
|
|
8
|
+
async connect() {
|
|
9
|
+
this._connected = true;
|
|
10
|
+
}
|
|
11
|
+
disconnect() {
|
|
12
|
+
this._connected = false;
|
|
13
|
+
}
|
|
14
|
+
isConnected() {
|
|
15
|
+
return this._connected;
|
|
16
|
+
}
|
|
17
|
+
async sendMessage(params) {
|
|
18
|
+
const mockResponse = 'Mock agent completed the task.';
|
|
19
|
+
params.onDone?.(mockResponse);
|
|
20
|
+
}
|
|
21
|
+
async listSessions() {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
async getHistory(_sessionKey, _limit) {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
async abort(_sessionKey, _runId) {
|
|
28
|
+
// no-op
|
|
29
|
+
}
|
|
30
|
+
async healthCheck() {
|
|
31
|
+
return { ok: true, rpcOk: true };
|
|
32
|
+
}
|
|
33
|
+
async restart() {
|
|
34
|
+
// no-op
|
|
35
|
+
}
|
|
36
|
+
async install(_currentVersion) {
|
|
37
|
+
// no-op
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/mock/index.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,MAAM,OAAO,YAAY;IACd,IAAI,GAAG,MAAM,CAAC;IACf,UAAU,GAAG,KAAK,CAAC;IAE3B,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,UAAU;QACR,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAyB;QACzC,MAAM,YAAY,GAAG,gCAAgC,CAAC;QACtD,MAAM,CAAC,MAAM,EAAE,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,MAAe;QACnD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,WAAmB,EAAE,MAAe;QAC9C,QAAQ;IACV,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,QAAQ;IACV,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,eAAwB;QACpC,QAAQ;IACV,CAAC;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { IChatProvider } from '../chat-types.js';
|
|
2
|
+
import type { ChatSession, ChatMessage, ChatAttachment } from '../chat-types.js';
|
|
3
|
+
export declare class OpenclawGatewayAdapter implements IChatProvider {
|
|
4
|
+
private client;
|
|
5
|
+
private streamCallbacks;
|
|
6
|
+
constructor(url: string, token: string);
|
|
7
|
+
connect(): Promise<void>;
|
|
8
|
+
disconnect(): void;
|
|
9
|
+
isConnected(): boolean;
|
|
10
|
+
listSessions(): Promise<ChatSession[]>;
|
|
11
|
+
getHistory(sessionKey: string, limit?: number): Promise<ChatMessage[]>;
|
|
12
|
+
sendMessage(params: {
|
|
13
|
+
sessionKey: string;
|
|
14
|
+
text: string;
|
|
15
|
+
idempotencyKey: string;
|
|
16
|
+
attachments?: ChatAttachment[];
|
|
17
|
+
onDelta?: (text: string) => void;
|
|
18
|
+
onDone?: (text: string) => void;
|
|
19
|
+
onError?: (error: string) => void;
|
|
20
|
+
}): Promise<void>;
|
|
21
|
+
abort(sessionKey: string, runId?: string): Promise<void>;
|
|
22
|
+
private deleteStream;
|
|
23
|
+
private handleEvent;
|
|
24
|
+
}
|