@okclaw-build/cli 1.0.0-beta.53 → 1.0.0-beta.56
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/bridge/daemon/config.d.ts +24 -0
- package/dist/bridge/daemon/config.js +96 -0
- package/dist/bridge/daemon/config.js.map +1 -0
- package/dist/bridge/daemon/daemon.d.ts +7 -0
- package/dist/bridge/daemon/daemon.js +23 -0
- package/dist/bridge/daemon/daemon.js.map +1 -0
- package/dist/bridge/daemon/event-id.d.ts +2 -0
- package/dist/bridge/daemon/event-id.js +18 -0
- package/dist/bridge/daemon/event-id.js.map +1 -0
- package/dist/bridge/daemon/frames.d.ts +81 -0
- package/dist/bridge/daemon/frames.js +64 -0
- package/dist/bridge/daemon/frames.js.map +1 -0
- package/dist/bridge/daemon/openclaw-chat-runtime.d.ts +80 -0
- package/dist/bridge/daemon/openclaw-chat-runtime.js +1121 -0
- package/dist/bridge/daemon/openclaw-chat-runtime.js.map +1 -0
- package/dist/bridge/daemon/openclaw-gateway-client.d.ts +58 -0
- package/dist/bridge/daemon/openclaw-gateway-client.js +251 -0
- package/dist/bridge/daemon/openclaw-gateway-client.js.map +1 -0
- package/dist/bridge/daemon/relay-client.d.ts +75 -0
- package/dist/bridge/daemon/relay-client.js +369 -0
- package/dist/bridge/daemon/relay-client.js.map +1 -0
- package/dist/bridge/daemon/stub-chat-runtime.d.ts +4 -0
- package/dist/bridge/daemon/stub-chat-runtime.js +89 -0
- package/dist/bridge/daemon/stub-chat-runtime.js.map +1 -0
- package/dist/bridge/service.d.ts +12 -0
- package/dist/bridge/service.js +86 -0
- package/dist/bridge/service.js.map +1 -0
- package/dist/commands/bridge.d.ts +7 -0
- package/dist/commands/bridge.js +100 -0
- package/dist/commands/bridge.js.map +1 -0
- package/dist/commands/edit.js +2 -2
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/install.js +20 -0
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/openclaw-channel-login.d.ts +54 -0
- package/dist/commands/openclaw-channel-login.js +334 -0
- package/dist/commands/openclaw-channel-login.js.map +1 -0
- package/dist/index.js +18 -3
- package/dist/index.js.map +1 -1
- package/dist/installers/channel.d.ts +1 -0
- package/dist/installers/channel.js +40 -0
- package/dist/installers/channel.js.map +1 -1
- package/dist/installers/openclaw.js +3 -0
- package/dist/installers/openclaw.js.map +1 -1
- package/dist/utils/constants.d.ts +6 -0
- package/dist/utils/constants.js +9 -1
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/install-safety.js +4 -2
- package/dist/utils/install-safety.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface BridgeCapabilities {
|
|
2
|
+
chatSend: boolean;
|
|
3
|
+
attachments: boolean;
|
|
4
|
+
artifacts: boolean;
|
|
5
|
+
suppressCommandInterpretation: boolean;
|
|
6
|
+
}
|
|
7
|
+
export type BridgeRuntimeMode = 'disabled' | 'stub' | 'openclaw';
|
|
8
|
+
export interface BridgeGatewayConfig {
|
|
9
|
+
url: string;
|
|
10
|
+
authTokenEnv: string;
|
|
11
|
+
authTokenFile?: string;
|
|
12
|
+
connectTimeoutMs: number;
|
|
13
|
+
requestTimeoutMs: number;
|
|
14
|
+
}
|
|
15
|
+
export interface BridgeConfig {
|
|
16
|
+
bridgeId: string;
|
|
17
|
+
secret: string;
|
|
18
|
+
relayUrl: string;
|
|
19
|
+
heartbeatIntervalSeconds: number;
|
|
20
|
+
runtimeMode: BridgeRuntimeMode;
|
|
21
|
+
gateway: BridgeGatewayConfig;
|
|
22
|
+
capabilities: BridgeCapabilities;
|
|
23
|
+
}
|
|
24
|
+
export declare function loadBridgeConfig(path: string): BridgeConfig;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { isAbsolute } from 'node:path';
|
|
3
|
+
const DEFAULT_CAPABILITIES = {
|
|
4
|
+
chatSend: false,
|
|
5
|
+
attachments: false,
|
|
6
|
+
artifacts: false,
|
|
7
|
+
suppressCommandInterpretation: false,
|
|
8
|
+
};
|
|
9
|
+
const DEFAULT_HEARTBEAT_SECONDS = 30;
|
|
10
|
+
const DEFAULT_GATEWAY_URL = 'ws://127.0.0.1:18789';
|
|
11
|
+
const DEFAULT_GATEWAY_AUTH_TOKEN_ENV = 'OPENCLAW_GATEWAY_TOKEN';
|
|
12
|
+
const DEFAULT_GATEWAY_CONNECT_TIMEOUT_MS = 8000;
|
|
13
|
+
const DEFAULT_GATEWAY_REQUEST_TIMEOUT_MS = 120000;
|
|
14
|
+
export function loadBridgeConfig(path) {
|
|
15
|
+
let raw;
|
|
16
|
+
try {
|
|
17
|
+
raw = readFileSync(path, 'utf8');
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
throw new Error('E_BRIDGE_CONFIG_MISSING');
|
|
21
|
+
}
|
|
22
|
+
let parsed;
|
|
23
|
+
try {
|
|
24
|
+
parsed = JSON.parse(raw);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
throw new Error('E_BRIDGE_CONFIG_INVALID');
|
|
28
|
+
}
|
|
29
|
+
if (!isRecord(parsed)) {
|
|
30
|
+
throw new Error('E_BRIDGE_CONFIG_INVALID');
|
|
31
|
+
}
|
|
32
|
+
const bridgeId = stringValue(parsed.bridgeId);
|
|
33
|
+
const secret = stringValue(parsed.secret);
|
|
34
|
+
const relayUrl = stringValue(parsed.relayUrl);
|
|
35
|
+
if (!bridgeId || !secret || !relayUrl) {
|
|
36
|
+
throw new Error('E_BRIDGE_CONFIG_INVALID');
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
bridgeId,
|
|
40
|
+
secret,
|
|
41
|
+
relayUrl,
|
|
42
|
+
heartbeatIntervalSeconds: positiveNumber(parsed.heartbeatIntervalSeconds) ?? DEFAULT_HEARTBEAT_SECONDS,
|
|
43
|
+
runtimeMode: parseRuntimeMode(parsed.runtimeMode),
|
|
44
|
+
gateway: parseGatewayConfig(parsed.gateway),
|
|
45
|
+
capabilities: parseCapabilities(parsed.capabilities),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function parseRuntimeMode(value) {
|
|
49
|
+
if (value === 'stub' || value === 'openclaw') {
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
return 'disabled';
|
|
53
|
+
}
|
|
54
|
+
function parseGatewayConfig(value) {
|
|
55
|
+
if (!isRecord(value)) {
|
|
56
|
+
return {
|
|
57
|
+
url: DEFAULT_GATEWAY_URL,
|
|
58
|
+
authTokenEnv: DEFAULT_GATEWAY_AUTH_TOKEN_ENV,
|
|
59
|
+
authTokenFile: undefined,
|
|
60
|
+
connectTimeoutMs: DEFAULT_GATEWAY_CONNECT_TIMEOUT_MS,
|
|
61
|
+
requestTimeoutMs: DEFAULT_GATEWAY_REQUEST_TIMEOUT_MS,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const authTokenFile = stringValue(value.authTokenFile);
|
|
65
|
+
if (authTokenFile !== undefined && !isAbsolute(authTokenFile)) {
|
|
66
|
+
throw new Error('E_BRIDGE_CONFIG_INVALID');
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
url: stringValue(value.url) ?? DEFAULT_GATEWAY_URL,
|
|
70
|
+
authTokenEnv: stringValue(value.authTokenEnv) ?? DEFAULT_GATEWAY_AUTH_TOKEN_ENV,
|
|
71
|
+
authTokenFile,
|
|
72
|
+
connectTimeoutMs: positiveNumber(value.connectTimeoutMs) ?? DEFAULT_GATEWAY_CONNECT_TIMEOUT_MS,
|
|
73
|
+
requestTimeoutMs: positiveNumber(value.requestTimeoutMs) ?? DEFAULT_GATEWAY_REQUEST_TIMEOUT_MS,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function parseCapabilities(value) {
|
|
77
|
+
if (!isRecord(value)) {
|
|
78
|
+
return { ...DEFAULT_CAPABILITIES };
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
chatSend: value.chatSend === true,
|
|
82
|
+
attachments: value.attachments === true,
|
|
83
|
+
artifacts: value.artifacts === true,
|
|
84
|
+
suppressCommandInterpretation: false,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function stringValue(value) {
|
|
88
|
+
return typeof value === 'string' && value.trim().length > 0 ? value : undefined;
|
|
89
|
+
}
|
|
90
|
+
function positiveNumber(value) {
|
|
91
|
+
return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : undefined;
|
|
92
|
+
}
|
|
93
|
+
function isRecord(value) {
|
|
94
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/bridge/daemon/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { loadBridgeConfig } from './config.js';
|
|
2
|
+
import { OpenClawChatRuntime } from './openclaw-chat-runtime.js';
|
|
3
|
+
import { BridgeRelayClient } from './relay-client.js';
|
|
4
|
+
export function runBridgeDaemon(options) {
|
|
5
|
+
const config = loadBridgeConfig(options.configPath);
|
|
6
|
+
const chatRuntime = createChatRuntime(config, options.installedVersion ?? 'unknown');
|
|
7
|
+
const client = new BridgeRelayClient(config, {
|
|
8
|
+
installedVersion: options.installedVersion,
|
|
9
|
+
chatRuntime,
|
|
10
|
+
});
|
|
11
|
+
client.connect();
|
|
12
|
+
console.log(`[okclaw-bridge] connected bridgeId=${config.bridgeId}`);
|
|
13
|
+
return client;
|
|
14
|
+
}
|
|
15
|
+
function createChatRuntime(config, installedVersion) {
|
|
16
|
+
if (config.runtimeMode !== 'openclaw') {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
return new OpenClawChatRuntime(config, {
|
|
20
|
+
installedVersion,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../src/bridge/daemon/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAA0B,MAAM,4BAA4B,CAAC;AACzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAOtD,MAAM,UAAU,eAAe,CAAC,OAAsB;IACpD,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,IAAI,SAAS,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,MAAM,EAAE;QAC3C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,WAAW;KACZ,CAAC,CAAC;IACH,MAAM,CAAC,OAAO,EAAE,CAAC;IACjB,OAAO,CAAC,GAAG,CAAC,sCAAsC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CACxB,MAA2C,EAC3C,gBAAwB;IAExB,IAAI,MAAM,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,mBAAmB,CAAC,MAAM,EAAE;QACrC,gBAAgB;KACjB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
const EVENT_ID_PREFIX = 'rbevt_';
|
|
3
|
+
const EVENT_ID_MAX_LENGTH = 96;
|
|
4
|
+
export function bridgeEventId(requestId, suffix) {
|
|
5
|
+
const safeRequestId = stableToken(requestId);
|
|
6
|
+
const direct = `${EVENT_ID_PREFIX}${safeRequestId}_${suffix}`;
|
|
7
|
+
if (direct.length <= EVENT_ID_MAX_LENGTH) {
|
|
8
|
+
return direct;
|
|
9
|
+
}
|
|
10
|
+
const hash = createHash('sha256').update(requestId).digest('base64url').slice(0, 16);
|
|
11
|
+
const reserved = EVENT_ID_PREFIX.length + suffix.length + hash.length + 2;
|
|
12
|
+
const headLength = Math.max(EVENT_ID_MAX_LENGTH - reserved, 8);
|
|
13
|
+
return `${EVENT_ID_PREFIX}${safeRequestId.slice(0, headLength)}_${hash}_${suffix}`.slice(0, EVENT_ID_MAX_LENGTH);
|
|
14
|
+
}
|
|
15
|
+
export function stableToken(value, maxLength = EVENT_ID_MAX_LENGTH) {
|
|
16
|
+
return value.replace(/[^A-Za-z0-9_-]/g, '_').slice(0, maxLength) || 'unknown';
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=event-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-id.js","sourceRoot":"","sources":["../../../src/bridge/daemon/event-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,eAAe,GAAG,QAAQ,CAAC;AACjC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,MAAc;IAC7D,MAAM,aAAa,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,GAAG,eAAe,GAAG,aAAa,IAAI,MAAM,EAAE,CAAC;IAC9D,IAAI,MAAM,CAAC,MAAM,IAAI,mBAAmB,EAAE,CAAC;QACzC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrF,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC/D,OAAO,GAAG,eAAe,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;AACnH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,SAAS,GAAG,mBAAmB;IACxE,OAAO,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,SAAS,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { BridgeCapabilities } from './config.js';
|
|
2
|
+
export interface HelloFrame {
|
|
3
|
+
type: 'hello';
|
|
4
|
+
protocolVersion: 1;
|
|
5
|
+
bridgeId: string;
|
|
6
|
+
secret: string;
|
|
7
|
+
timestamp: string;
|
|
8
|
+
nonce: string;
|
|
9
|
+
installedVersion: string;
|
|
10
|
+
openclawVersion: string;
|
|
11
|
+
gatewayVersion: string;
|
|
12
|
+
gatewayConnected?: boolean;
|
|
13
|
+
lastGatewayErrorCode?: string;
|
|
14
|
+
capabilities: BridgeCapabilities;
|
|
15
|
+
}
|
|
16
|
+
export interface HeartbeatFrame {
|
|
17
|
+
type: 'heartbeat';
|
|
18
|
+
timestamp: string;
|
|
19
|
+
installedVersion: string;
|
|
20
|
+
openclawVersion: string;
|
|
21
|
+
gatewayVersion: string;
|
|
22
|
+
gatewayConnected?: boolean;
|
|
23
|
+
lastGatewayErrorCode?: string;
|
|
24
|
+
capabilities: BridgeCapabilities;
|
|
25
|
+
}
|
|
26
|
+
export interface HelloAckFrame {
|
|
27
|
+
type: 'hello_ack';
|
|
28
|
+
heartbeatIntervalSeconds: number;
|
|
29
|
+
}
|
|
30
|
+
export interface HeartbeatAckFrame {
|
|
31
|
+
type: 'heartbeat_ack';
|
|
32
|
+
serverTime?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface RpcFrame {
|
|
35
|
+
type: 'rpc';
|
|
36
|
+
requestId?: string;
|
|
37
|
+
method?: string;
|
|
38
|
+
params?: Record<string, unknown>;
|
|
39
|
+
deadlineMs?: number;
|
|
40
|
+
}
|
|
41
|
+
export interface EventAckFrame {
|
|
42
|
+
type: 'event_ack';
|
|
43
|
+
eventId?: string;
|
|
44
|
+
requestId?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface OpsResponseFrame {
|
|
47
|
+
type: 'ops_response';
|
|
48
|
+
requestId?: string;
|
|
49
|
+
ok: boolean;
|
|
50
|
+
result?: Record<string, unknown>;
|
|
51
|
+
errorCode?: string;
|
|
52
|
+
errorMessage?: string;
|
|
53
|
+
}
|
|
54
|
+
export type BridgeInboundFrame = HelloAckFrame | HeartbeatAckFrame | EventAckFrame | RpcFrame | OpsResponseFrame | {
|
|
55
|
+
type: 'unknown';
|
|
56
|
+
};
|
|
57
|
+
export interface RpcResultFrame {
|
|
58
|
+
type: 'rpc_result';
|
|
59
|
+
eventId: string;
|
|
60
|
+
requestId: string;
|
|
61
|
+
ok: boolean;
|
|
62
|
+
result?: Record<string, unknown>;
|
|
63
|
+
errorCode?: string;
|
|
64
|
+
errorMessage?: string;
|
|
65
|
+
}
|
|
66
|
+
export interface EventFrame {
|
|
67
|
+
type: 'event';
|
|
68
|
+
eventId: string;
|
|
69
|
+
requestId: string;
|
|
70
|
+
eventType: string;
|
|
71
|
+
payload: Record<string, unknown>;
|
|
72
|
+
}
|
|
73
|
+
export interface OpsRequestFrame {
|
|
74
|
+
type: 'ops_request';
|
|
75
|
+
requestId: string;
|
|
76
|
+
method: string;
|
|
77
|
+
params: Record<string, unknown>;
|
|
78
|
+
deadlineMs?: number;
|
|
79
|
+
}
|
|
80
|
+
export type BridgeOutboundFrame = HelloFrame | HeartbeatFrame | RpcResultFrame | EventFrame | OpsRequestFrame;
|
|
81
|
+
export declare function parseBridgeFrame(raw: string): BridgeInboundFrame;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export function parseBridgeFrame(raw) {
|
|
2
|
+
let parsed;
|
|
3
|
+
try {
|
|
4
|
+
parsed = JSON.parse(raw);
|
|
5
|
+
}
|
|
6
|
+
catch {
|
|
7
|
+
return { type: 'unknown' };
|
|
8
|
+
}
|
|
9
|
+
if (!isRecord(parsed) || typeof parsed.type !== 'string') {
|
|
10
|
+
return { type: 'unknown' };
|
|
11
|
+
}
|
|
12
|
+
if (parsed.type === 'hello_ack') {
|
|
13
|
+
return {
|
|
14
|
+
type: 'hello_ack',
|
|
15
|
+
heartbeatIntervalSeconds: typeof parsed.heartbeatIntervalSeconds === 'number' && parsed.heartbeatIntervalSeconds > 0
|
|
16
|
+
? parsed.heartbeatIntervalSeconds
|
|
17
|
+
: 30,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
if (parsed.type === 'heartbeat_ack') {
|
|
21
|
+
return {
|
|
22
|
+
type: 'heartbeat_ack',
|
|
23
|
+
serverTime: typeof parsed.serverTime === 'string' ? parsed.serverTime : undefined,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
if (parsed.type === 'rpc') {
|
|
27
|
+
return {
|
|
28
|
+
type: 'rpc',
|
|
29
|
+
requestId: typeof parsed.requestId === 'string' ? parsed.requestId : undefined,
|
|
30
|
+
method: typeof parsed.method === 'string' ? parsed.method : undefined,
|
|
31
|
+
params: isRecord(parsed.params) ? parsed.params : undefined,
|
|
32
|
+
deadlineMs: typeof parsed.deadlineMs === 'number' ? parsed.deadlineMs : undefined,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
if (parsed.type === 'event_ack') {
|
|
36
|
+
return {
|
|
37
|
+
type: 'event_ack',
|
|
38
|
+
eventId: typeof parsed.eventId === 'string' ? parsed.eventId : undefined,
|
|
39
|
+
requestId: typeof parsed.requestId === 'string' ? parsed.requestId : undefined,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
if (parsed.type === 'ops_response') {
|
|
43
|
+
const frame = {
|
|
44
|
+
type: 'ops_response',
|
|
45
|
+
requestId: typeof parsed.requestId === 'string' ? parsed.requestId : undefined,
|
|
46
|
+
ok: parsed.ok === true,
|
|
47
|
+
result: isRecord(parsed.result) ? parsed.result : undefined,
|
|
48
|
+
};
|
|
49
|
+
if (typeof parsed.errorCode === 'string') {
|
|
50
|
+
frame.errorCode = parsed.errorCode;
|
|
51
|
+
}
|
|
52
|
+
if (typeof parsed.errorMessage === 'string') {
|
|
53
|
+
frame.errorMessage = parsed.errorMessage;
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
...frame,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return { type: 'unknown' };
|
|
60
|
+
}
|
|
61
|
+
function isRecord(value) {
|
|
62
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=frames.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frames.js","sourceRoot":"","sources":["../../../src/bridge/daemon/frames.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { BridgeConfig } from './config.js';
|
|
2
|
+
import type { EventFrame, RpcResultFrame } from './frames.js';
|
|
3
|
+
import { type GatewayWebSocketFactory } from './openclaw-gateway-client.js';
|
|
4
|
+
import type { TimerApi } from './relay-client.js';
|
|
5
|
+
export interface BridgeOpsRequest {
|
|
6
|
+
method: string;
|
|
7
|
+
params: Record<string, unknown>;
|
|
8
|
+
deadlineMs?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface BridgeChatRuntimeSink {
|
|
11
|
+
sendRpcResult(frame: RpcResultFrame): void;
|
|
12
|
+
sendEvent(frame: EventFrame): void;
|
|
13
|
+
sendOpsRequest(request: BridgeOpsRequest): Promise<Record<string, unknown>>;
|
|
14
|
+
}
|
|
15
|
+
export interface BridgeChatSendRequest {
|
|
16
|
+
requestId: string;
|
|
17
|
+
deadlineMs?: number;
|
|
18
|
+
params: Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
export interface BridgeRuntimeInfo {
|
|
21
|
+
gatewayConnected?: boolean;
|
|
22
|
+
gatewayVersion?: string;
|
|
23
|
+
lastGatewayErrorCode?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface BridgeChatRuntime {
|
|
26
|
+
start?(): Promise<void> | void;
|
|
27
|
+
stop?(): void;
|
|
28
|
+
getRuntimeInfo?(): BridgeRuntimeInfo;
|
|
29
|
+
handleChatSend(request: BridgeChatSendRequest, sink: BridgeChatRuntimeSink): Promise<void> | void;
|
|
30
|
+
}
|
|
31
|
+
interface OpenClawChatRuntimeOptions {
|
|
32
|
+
installedVersion: string;
|
|
33
|
+
tokenProvider?: () => string | undefined;
|
|
34
|
+
nonce?: () => string;
|
|
35
|
+
gatewayWebSocketFactory?: GatewayWebSocketFactory;
|
|
36
|
+
timers?: TimerApi;
|
|
37
|
+
fetch?: typeof fetch;
|
|
38
|
+
workspaceRoots?: string[];
|
|
39
|
+
openclawConfigPath?: string;
|
|
40
|
+
}
|
|
41
|
+
export declare class OpenClawChatRuntime implements BridgeChatRuntime {
|
|
42
|
+
private readonly config;
|
|
43
|
+
private readonly options;
|
|
44
|
+
private gateway;
|
|
45
|
+
private startPromise;
|
|
46
|
+
private gatewayConnected;
|
|
47
|
+
private gatewayVersion;
|
|
48
|
+
private lastGatewayErrorCode;
|
|
49
|
+
private readonly byRequestId;
|
|
50
|
+
private readonly requestIdByRunId;
|
|
51
|
+
private readonly publishedArtifactKeys;
|
|
52
|
+
private workspaceRootsCache;
|
|
53
|
+
constructor(config: BridgeConfig, options: OpenClawChatRuntimeOptions);
|
|
54
|
+
start(): Promise<void>;
|
|
55
|
+
stop(): void;
|
|
56
|
+
getRuntimeInfo(): BridgeRuntimeInfo;
|
|
57
|
+
handleChatSend(request: BridgeChatSendRequest, sink: BridgeChatRuntimeSink): Promise<void>;
|
|
58
|
+
private connectGateway;
|
|
59
|
+
private buildGatewayAttachments;
|
|
60
|
+
private downloadFileRef;
|
|
61
|
+
private handleGatewayEvent;
|
|
62
|
+
private handleGatewayClose;
|
|
63
|
+
private emitDelta;
|
|
64
|
+
private emitFinal;
|
|
65
|
+
private publishOutboundMedia;
|
|
66
|
+
private publishOneOutboundMedia;
|
|
67
|
+
private resolveOutboundMediaBytes;
|
|
68
|
+
private resolveGatewayHttpUrl;
|
|
69
|
+
private resolveGatewayToken;
|
|
70
|
+
private extractOutboundFileRefs;
|
|
71
|
+
private readOutboundLocalFile;
|
|
72
|
+
private resolveWorkspaceRoots;
|
|
73
|
+
private uploadArtifact;
|
|
74
|
+
private emitOutboundUnsupported;
|
|
75
|
+
private emitFailure;
|
|
76
|
+
private registerActive;
|
|
77
|
+
private unregisterActive;
|
|
78
|
+
private activeByRunId;
|
|
79
|
+
}
|
|
80
|
+
export {};
|