@bowong/clawshow-gateway 2026.3.13 → 2026.3.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 +9 -9
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/src/config.d.ts +2 -2
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +19 -10
- package/dist/src/config.js.map +1 -1
- package/dist/src/gateway.d.ts +3 -3
- package/dist/src/gateway.d.ts.map +1 -1
- package/dist/src/gateway.js +75 -42
- package/dist/src/gateway.js.map +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/outbound.d.ts +1 -1
- package/dist/src/outbound.d.ts.map +1 -1
- package/dist/src/outbound.js +7 -7
- package/dist/src/outbound.js.map +1 -1
- package/dist/src/plugin.d.ts +2 -2
- package/dist/src/plugin.d.ts.map +1 -1
- package/dist/src/plugin.js +14 -14
- package/dist/src/plugin.js.map +1 -1
- package/dist/src/protocol.d.ts +15 -13
- package/dist/src/protocol.d.ts.map +1 -1
- package/dist/src/protocol.js +99 -3
- package/dist/src/protocol.js.map +1 -1
- package/dist/src/runtime.d.ts +1 -1
- package/dist/src/runtime.d.ts.map +1 -1
- package/dist/src/runtime.js +2 -2
- package/dist/src/runtime.js.map +1 -1
- package/dist/src/security.d.ts +2 -2
- package/dist/src/security.d.ts.map +1 -1
- package/dist/src/security.js +4 -4
- package/dist/src/security.js.map +1 -1
- package/dist/src/setup.d.ts +1 -1
- package/dist/src/setup.d.ts.map +1 -1
- package/dist/src/setup.js +10 -8
- package/dist/src/setup.js.map +1 -1
- package/dist/src/types.d.ts +1 -1
- package/dist/src/types.d.ts.map +1 -1
- package/openclaw.plugin.json +2 -2
- package/package.json +7 -8
- package/index.ts +0 -17
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# @
|
|
1
|
+
# @bowong/clawshow-gateway
|
|
2
2
|
|
|
3
|
-
OpenClaw
|
|
3
|
+
OpenClaw Clawshow 频道插件 —— 通过 WebSocket 中继服务器实现浏览器端聊天。
|
|
4
4
|
|
|
5
5
|
## 安装到 OpenClaw
|
|
6
6
|
|
|
@@ -39,14 +39,14 @@ openclaw plugins install ./packages/openclaw-channel-web
|
|
|
39
39
|
|
|
40
40
|
### 配置频道
|
|
41
41
|
|
|
42
|
-
这个插件是 channel plugin,配置写在 `channels.
|
|
42
|
+
这个插件是 channel plugin,配置写在 `channels.clawshow`,不是 `plugins.entries.clawshow-gateway.config`。
|
|
43
43
|
|
|
44
44
|
编辑 `~/.openclaw/openclaw.json`,添加:
|
|
45
45
|
|
|
46
46
|
```json5
|
|
47
47
|
{
|
|
48
48
|
channels: {
|
|
49
|
-
|
|
49
|
+
clawshow: {
|
|
50
50
|
enabled: true,
|
|
51
51
|
relayUrl: "wss://your-relay-server.example.com",
|
|
52
52
|
authToken: "your-secret-token",
|
|
@@ -71,7 +71,7 @@ openclaw plugins install ./packages/openclaw-channel-web
|
|
|
71
71
|
WEB_RELAY_AUTH_TOKEN=your-secret-token
|
|
72
72
|
```
|
|
73
73
|
|
|
74
|
-
对应代码里会优先读取 `channels.
|
|
74
|
+
对应代码里会优先读取 `channels.clawshow.authToken`,否则回退到 `WEB_RELAY_AUTH_TOKEN`。
|
|
75
75
|
|
|
76
76
|
### 本地 relay 联调示例
|
|
77
77
|
|
|
@@ -87,7 +87,7 @@ npm run dev
|
|
|
87
87
|
```json5
|
|
88
88
|
{
|
|
89
89
|
channels: {
|
|
90
|
-
|
|
90
|
+
clawshow: {
|
|
91
91
|
enabled: true,
|
|
92
92
|
relayUrl: "ws://192.168.0.117:8787",
|
|
93
93
|
authToken: "your-secret-token",
|
|
@@ -117,7 +117,7 @@ node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
|
|
|
117
117
|
|
|
118
118
|
然后把同一个值配置到:
|
|
119
119
|
|
|
120
|
-
- `channels.
|
|
120
|
+
- `channels.clawshow.authToken` 或 `WEB_RELAY_AUTH_TOKEN`
|
|
121
121
|
- `apps/web-relay` 的 `OPENCLAW_AUTH_TOKEN`
|
|
122
122
|
|
|
123
123
|
### 多账户配置
|
|
@@ -125,7 +125,7 @@ node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
|
|
|
125
125
|
```json5
|
|
126
126
|
{
|
|
127
127
|
channels: {
|
|
128
|
-
|
|
128
|
+
clawshow: {
|
|
129
129
|
enabled: true,
|
|
130
130
|
relayUrl: "wss://relay-1.example.com",
|
|
131
131
|
authToken: "token-1",
|
|
@@ -155,4 +155,4 @@ openclaw plugins list
|
|
|
155
155
|
openclaw plugins info web
|
|
156
156
|
```
|
|
157
157
|
|
|
158
|
-
如果 `
|
|
158
|
+
如果 `clawshow` 频道显示为已配置并且连接成功,说明安装完成。
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAK5D,QAAA,MAAM,MAAM;;;;;kBAKI,iBAAiB;CAIhC,CAAA;AAED,eAAe,MAAM,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { emptyPluginConfigSchema } from
|
|
2
|
-
import { webChannelPlugin } from
|
|
3
|
-
import { setWebRuntime } from
|
|
1
|
+
import { emptyPluginConfigSchema } from 'openclaw/plugin-sdk';
|
|
2
|
+
import { webChannelPlugin } from './src/plugin.js';
|
|
3
|
+
import { setWebRuntime } from './src/runtime.js';
|
|
4
4
|
const plugin = {
|
|
5
|
-
id:
|
|
6
|
-
name:
|
|
7
|
-
description:
|
|
5
|
+
id: 'clawshow-gateway',
|
|
6
|
+
name: 'clawshow-gateway',
|
|
7
|
+
description: 'Web channel plugin — browser chat via WebSocket relay',
|
|
8
8
|
configSchema: emptyPluginConfigSchema(),
|
|
9
9
|
register(api) {
|
|
10
10
|
setWebRuntime(api.runtime);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD,MAAM,MAAM,GAAG;IACb,EAAE,EAAE,kBAAkB;IACtB,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,uDAAuD;IACpE,YAAY,EAAE,uBAAuB,EAAE;IACvC,QAAQ,CAAC,GAAsB;QAC7B,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAC1B,GAAG,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAA;IACnD,CAAC;CACF,CAAA;AAED,eAAe,MAAM,CAAA"}
|
package/dist/src/config.d.ts
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Web channel configuration adapter.
|
|
3
3
|
* Resolves account configuration from OpenClaw config.
|
|
4
4
|
*/
|
|
5
|
-
import type { ChannelConfigAdapter, OpenClawConfig } from
|
|
6
|
-
import type { ResolvedWebAccount } from
|
|
5
|
+
import type { ChannelConfigAdapter, OpenClawConfig } from 'openclaw/plugin-sdk';
|
|
6
|
+
import type { ResolvedWebAccount } from './types.js';
|
|
7
7
|
export declare function listWebAccountIds(cfg: OpenClawConfig): string[];
|
|
8
8
|
export declare function resolveWebAccount(cfg: OpenClawConfig, accountId?: string | null): ResolvedWebAccount;
|
|
9
9
|
export declare function isWebConfigured(account: ResolvedWebAccount): boolean;
|
package/dist/src/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAEV,oBAAoB,EACpB,cAAc,EACf,MAAM,qBAAqB,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAEV,oBAAoB,EACpB,cAAc,EACf,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,kBAAkB,EAAoB,MAAM,YAAY,CAAA;AAQtE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,EAAE,CAkB/D;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,cAAc,EACnB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GACxB,kBAAkB,CAgCpB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAEpE;AAED,eAAO,MAAM,gBAAgB,EAAE,oBAAoB,CAAC,kBAAkB,CAuBrE,CAAA"}
|
package/dist/src/config.js
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* Web channel configuration adapter.
|
|
3
3
|
* Resolves account configuration from OpenClaw config.
|
|
4
4
|
*/
|
|
5
|
-
const DEFAULT_ACCOUNT_ID =
|
|
5
|
+
const DEFAULT_ACCOUNT_ID = 'default';
|
|
6
6
|
export function listWebAccountIds(cfg) {
|
|
7
|
-
const webConfig = cfg.channels?.
|
|
7
|
+
const webConfig = cfg.channels?.clawshow;
|
|
8
8
|
if (!webConfig)
|
|
9
9
|
return [];
|
|
10
10
|
const ids = [];
|
|
@@ -24,20 +24,29 @@ export function listWebAccountIds(cfg) {
|
|
|
24
24
|
}
|
|
25
25
|
export function resolveWebAccount(cfg, accountId) {
|
|
26
26
|
const id = accountId ?? DEFAULT_ACCOUNT_ID;
|
|
27
|
-
const webConfig = cfg.channels?.
|
|
27
|
+
const webConfig = cfg.channels?.clawshow;
|
|
28
28
|
const accountConfig = id !== DEFAULT_ACCOUNT_ID ? webConfig?.accounts?.[id] : undefined;
|
|
29
|
-
const base = webConfig
|
|
29
|
+
const base = webConfig
|
|
30
|
+
? {
|
|
31
|
+
enabled: webConfig.enabled,
|
|
32
|
+
relayUrl: webConfig.relayUrl,
|
|
33
|
+
authToken: webConfig.authToken,
|
|
34
|
+
dmPolicy: webConfig.dmPolicy,
|
|
35
|
+
allowFrom: webConfig.allowFrom,
|
|
36
|
+
name: webConfig.name,
|
|
37
|
+
}
|
|
38
|
+
: {};
|
|
30
39
|
const merged = {
|
|
31
|
-
relayUrl:
|
|
40
|
+
relayUrl: '',
|
|
32
41
|
...base,
|
|
33
42
|
...accountConfig,
|
|
34
43
|
};
|
|
35
|
-
const authToken = merged.authToken ?? process.env.WEB_RELAY_AUTH_TOKEN ??
|
|
44
|
+
const authToken = merged.authToken ?? process.env.WEB_RELAY_AUTH_TOKEN ?? '';
|
|
36
45
|
return {
|
|
37
46
|
accountId: id,
|
|
38
47
|
name: merged.name,
|
|
39
48
|
enabled: merged.enabled !== false,
|
|
40
|
-
relayUrl: merged.relayUrl ??
|
|
49
|
+
relayUrl: merged.relayUrl ?? '',
|
|
41
50
|
authToken,
|
|
42
51
|
config: merged,
|
|
43
52
|
};
|
|
@@ -53,10 +62,10 @@ export const webConfigAdapter = {
|
|
|
53
62
|
isConfigured: (account, _cfg) => isWebConfigured(account),
|
|
54
63
|
unconfiguredReason: (account, _cfg) => {
|
|
55
64
|
if (!account.relayUrl)
|
|
56
|
-
return
|
|
65
|
+
return 'relayUrl not configured';
|
|
57
66
|
if (!account.authToken)
|
|
58
|
-
return
|
|
59
|
-
return
|
|
67
|
+
return 'authToken not configured (set WEB_RELAY_AUTH_TOKEN or channels.clawshow.authToken)';
|
|
68
|
+
return 'not configured';
|
|
60
69
|
},
|
|
61
70
|
describeAccount: (account, _cfg) => ({
|
|
62
71
|
accountId: account.accountId,
|
package/dist/src/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,kBAAkB,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/src/gateway.d.ts
CHANGED
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
* - Auto-reconnects with exponential backoff
|
|
8
8
|
* - Responds to AbortSignal for graceful shutdown
|
|
9
9
|
*/
|
|
10
|
-
import WebSocket from
|
|
11
|
-
import type { ChannelGatewayAdapter, ChannelGatewayContext } from
|
|
12
|
-
import type { ResolvedWebAccount } from
|
|
10
|
+
import WebSocket from 'ws';
|
|
11
|
+
import type { ChannelGatewayAdapter, ChannelGatewayContext } from 'openclaw/plugin-sdk';
|
|
12
|
+
import type { ResolvedWebAccount } from './types.js';
|
|
13
13
|
export declare function getActiveWebSocket(accountId?: string): WebSocket | null;
|
|
14
14
|
export declare function startWebGateway(ctx: ChannelGatewayContext<ResolvedWebAccount>): Promise<void>;
|
|
15
15
|
export declare function sendTextToSession(sessionId: string, text: string, accountId?: string): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,SAAS,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,SAAS,MAAM,IAAI,CAAA;AAC1B,OAAO,KAAK,EAEV,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,qBAAqB,CAAA;AAQ5B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAUpD,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAOvE;AAED,wBAAsB,eAAe,CACnC,GAAG,EAAE,qBAAqB,CAAC,kBAAkB,CAAC,GAC7C,OAAO,CAAC,IAAI,CAAC,CAqLf;AA+FD,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAeT;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,OAAO,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAaT;AAED,eAAO,MAAM,iBAAiB,EAAE,qBAAqB,CAAC,kBAAkB,CAIvE,CAAA"}
|
package/dist/src/gateway.js
CHANGED
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
* - Auto-reconnects with exponential backoff
|
|
8
8
|
* - Responds to AbortSignal for graceful shutdown
|
|
9
9
|
*/
|
|
10
|
-
import WebSocket from
|
|
11
|
-
import { generateMessageId, HEARTBEAT_INTERVAL_MS, parseRelayMessage, serializeRelayMessage, } from
|
|
10
|
+
import WebSocket from 'ws';
|
|
11
|
+
import { generateMessageId, HEARTBEAT_INTERVAL_MS, parseRelayMessage, serializeRelayMessage, } from './protocol.js';
|
|
12
12
|
const MAX_RECONNECT_ATTEMPTS = 10;
|
|
13
13
|
const INITIAL_RECONNECT_MS = 2_000;
|
|
14
14
|
const MAX_RECONNECT_MS = 60_000;
|
|
@@ -34,8 +34,10 @@ export async function startWebGateway(ctx) {
|
|
|
34
34
|
resolve();
|
|
35
35
|
return;
|
|
36
36
|
}
|
|
37
|
-
const baseUrl = account.relayUrl.replace(/\/+$/,
|
|
38
|
-
const wsUrl = baseUrl.endsWith(
|
|
37
|
+
const baseUrl = account.relayUrl.replace(/\/+$/, '');
|
|
38
|
+
const wsUrl = baseUrl.endsWith('/openclaw')
|
|
39
|
+
? baseUrl
|
|
40
|
+
: `${baseUrl}/openclaw`;
|
|
39
41
|
log?.info(`[web:${account.accountId}] connecting to relay: ${wsUrl}`);
|
|
40
42
|
const ws = new WebSocket(wsUrl);
|
|
41
43
|
let heartbeatTimer = null;
|
|
@@ -53,22 +55,22 @@ export async function startWebGateway(ctx) {
|
|
|
53
55
|
lastStopAt: Date.now(),
|
|
54
56
|
});
|
|
55
57
|
};
|
|
56
|
-
ws.on(
|
|
58
|
+
ws.on('open', () => {
|
|
57
59
|
log?.info(`[web:${account.accountId}] connected, authenticating...`);
|
|
58
60
|
// Send auth handshake
|
|
59
61
|
ws.send(serializeRelayMessage({
|
|
60
|
-
type:
|
|
61
|
-
role:
|
|
62
|
+
type: 'auth',
|
|
63
|
+
role: 'openclaw',
|
|
62
64
|
token: account.authToken,
|
|
63
65
|
}));
|
|
64
66
|
});
|
|
65
|
-
ws.on(
|
|
66
|
-
const raw = typeof data ===
|
|
67
|
+
ws.on('message', async (data) => {
|
|
68
|
+
const raw = typeof data === 'string' ? data : data.toString('utf-8');
|
|
67
69
|
const msg = parseRelayMessage(raw);
|
|
68
70
|
if (!msg)
|
|
69
71
|
return;
|
|
70
72
|
switch (msg.type) {
|
|
71
|
-
case
|
|
73
|
+
case 'auth_result': {
|
|
72
74
|
if (msg.ok) {
|
|
73
75
|
log?.info(`[web:${account.accountId}] authenticated successfully`);
|
|
74
76
|
authenticated = true;
|
|
@@ -85,28 +87,31 @@ export async function startWebGateway(ctx) {
|
|
|
85
87
|
// Start heartbeat
|
|
86
88
|
heartbeatTimer = setInterval(() => {
|
|
87
89
|
if (ws.readyState === WebSocket.OPEN) {
|
|
88
|
-
ws.send(serializeRelayMessage({
|
|
90
|
+
ws.send(serializeRelayMessage({
|
|
91
|
+
type: 'ping',
|
|
92
|
+
timestamp: Date.now(),
|
|
93
|
+
}));
|
|
89
94
|
}
|
|
90
95
|
}, HEARTBEAT_INTERVAL_MS);
|
|
91
96
|
}
|
|
92
97
|
else {
|
|
93
98
|
log?.error(`[web:${account.accountId}] auth failed: ${msg.error}`);
|
|
94
|
-
ws.close(4001,
|
|
99
|
+
ws.close(4001, 'Authentication failed');
|
|
95
100
|
}
|
|
96
101
|
break;
|
|
97
102
|
}
|
|
98
|
-
case
|
|
103
|
+
case 'message': {
|
|
99
104
|
if (!authenticated)
|
|
100
105
|
break;
|
|
101
106
|
// Incoming message from browser → dispatch to AI
|
|
102
107
|
await handleIncomingMessage(ctx, msg);
|
|
103
108
|
break;
|
|
104
109
|
}
|
|
105
|
-
case
|
|
110
|
+
case 'typing': {
|
|
106
111
|
// Browser typing indicator — can log or pass through
|
|
107
112
|
break;
|
|
108
113
|
}
|
|
109
|
-
case
|
|
114
|
+
case 'pong': {
|
|
110
115
|
// Heartbeat response — connection is alive
|
|
111
116
|
break;
|
|
112
117
|
}
|
|
@@ -114,8 +119,8 @@ export async function startWebGateway(ctx) {
|
|
|
114
119
|
break;
|
|
115
120
|
}
|
|
116
121
|
});
|
|
117
|
-
ws.on(
|
|
118
|
-
log?.warn(`[web:${account.accountId}] disconnected (code=${code}, reason=${reason.toString(
|
|
122
|
+
ws.on('close', (code, reason) => {
|
|
123
|
+
log?.warn(`[web:${account.accountId}] disconnected (code=${code}, reason=${reason.toString('utf-8')})`);
|
|
119
124
|
cleanup();
|
|
120
125
|
if (abortSignal.aborted) {
|
|
121
126
|
resolve();
|
|
@@ -148,7 +153,7 @@ export async function startWebGateway(ctx) {
|
|
|
148
153
|
reject(err);
|
|
149
154
|
}
|
|
150
155
|
});
|
|
151
|
-
ws.on(
|
|
156
|
+
ws.on('error', err => {
|
|
152
157
|
log?.error(`[web:${account.accountId}] WebSocket error: ${err.message}`);
|
|
153
158
|
// Error triggers close event, so reconnect logic runs there
|
|
154
159
|
});
|
|
@@ -156,12 +161,13 @@ export async function startWebGateway(ctx) {
|
|
|
156
161
|
const onAbort = () => {
|
|
157
162
|
log?.info(`[web:${account.accountId}] shutting down (abort signal)`);
|
|
158
163
|
cleanup();
|
|
159
|
-
if (ws.readyState === WebSocket.OPEN ||
|
|
160
|
-
ws.
|
|
164
|
+
if (ws.readyState === WebSocket.OPEN ||
|
|
165
|
+
ws.readyState === WebSocket.CONNECTING) {
|
|
166
|
+
ws.close(1000, 'Shutting down');
|
|
161
167
|
}
|
|
162
168
|
resolve();
|
|
163
169
|
};
|
|
164
|
-
abortSignal.addEventListener(
|
|
170
|
+
abortSignal.addEventListener('abort', onAbort, { once: true });
|
|
165
171
|
});
|
|
166
172
|
return connect();
|
|
167
173
|
}
|
|
@@ -173,32 +179,59 @@ async function handleIncomingMessage(ctx, msg) {
|
|
|
173
179
|
...ctx.getStatus(),
|
|
174
180
|
lastInboundAt: Date.now(),
|
|
175
181
|
});
|
|
176
|
-
|
|
177
|
-
// the inbound message shape. Cast required because the SDK type exposes the
|
|
178
|
-
// internal dispatch-from-config signature, not the plugin-facing wrapper.
|
|
179
|
-
const dispatch = channelRuntime?.reply
|
|
180
|
-
?.dispatchReplyFromConfig;
|
|
181
|
-
if (!dispatch) {
|
|
182
|
+
if (!channelRuntime) {
|
|
182
183
|
log?.warn(`[web:${ctx.account.accountId}] channelRuntime not available — cannot dispatch AI reply`);
|
|
183
|
-
|
|
184
|
-
sendTextToSession(msg.sessionId, "AI is not available at the moment. Please try again later.", ctx.accountId);
|
|
184
|
+
void sendTextToSession(msg.sessionId, 'AI is not available at the moment. Please try again later.', ctx.accountId);
|
|
185
185
|
return;
|
|
186
186
|
}
|
|
187
|
+
const core = channelRuntime;
|
|
187
188
|
try {
|
|
188
|
-
|
|
189
|
+
// 1. Resolve agent routing
|
|
190
|
+
const route = core.routing.resolveAgentRoute({
|
|
189
191
|
cfg: ctx.cfg,
|
|
190
|
-
channel:
|
|
191
|
-
chatType: "direct",
|
|
192
|
-
from: msg.sessionId,
|
|
193
|
-
to: msg.sessionId,
|
|
194
|
-
text: msg.text,
|
|
192
|
+
channel: 'clawshow',
|
|
195
193
|
accountId: ctx.accountId,
|
|
196
|
-
|
|
194
|
+
peer: { kind: 'direct', id: msg.sessionId },
|
|
197
195
|
});
|
|
196
|
+
log?.info(`[web:${ctx.account.accountId}] route: agent=${route.agentId} session=${route.sessionKey}`);
|
|
197
|
+
// 2. Build MsgContext with PascalCase fields (will be finalized by dispatchInboundMessageWithBufferedDispatcher)
|
|
198
|
+
const ctxPayload = {
|
|
199
|
+
Body: msg.text,
|
|
200
|
+
BodyForAgent: msg.text,
|
|
201
|
+
RawBody: msg.text,
|
|
202
|
+
CommandBody: msg.text,
|
|
203
|
+
From: `web:${msg.sessionId}`,
|
|
204
|
+
To: msg.sessionId,
|
|
205
|
+
SessionKey: route.sessionKey,
|
|
206
|
+
AccountId: ctx.accountId,
|
|
207
|
+
ChatType: 'direct',
|
|
208
|
+
Provider: 'clawshow',
|
|
209
|
+
Surface: 'clawshow',
|
|
210
|
+
MessageSid: msg.id,
|
|
211
|
+
Timestamp: msg.timestamp || Date.now(),
|
|
212
|
+
CommandAuthorized: false,
|
|
213
|
+
};
|
|
214
|
+
// 3. Use the high-level dispatch API that handles all lifecycle internally
|
|
215
|
+
const result = await core.reply.dispatchReplyWithBufferedBlockDispatcher({
|
|
216
|
+
ctx: ctxPayload,
|
|
217
|
+
cfg: ctx.cfg,
|
|
218
|
+
dispatcherOptions: {
|
|
219
|
+
deliver: async (payload, info) => {
|
|
220
|
+
if (payload.text) {
|
|
221
|
+
void sendTextToSession(msg.sessionId, payload.text, ctx.accountId);
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
onError: (err, info) => {
|
|
225
|
+
log?.error(`[web:${ctx.account.accountId}] reply delivery error (${info.kind}): ${err}`);
|
|
226
|
+
},
|
|
227
|
+
},
|
|
228
|
+
});
|
|
229
|
+
log?.info(`[web:${ctx.account.accountId}] dispatch complete (queuedFinal=${result.queuedFinal}, replies=${result.counts.final})`);
|
|
198
230
|
}
|
|
199
231
|
catch (err) {
|
|
200
|
-
|
|
201
|
-
|
|
232
|
+
const errMsg = err instanceof Error ? `${err.message}\n${err.stack}` : String(err);
|
|
233
|
+
log?.error(`[web:${ctx.account.accountId}] dispatch error: ${errMsg}`);
|
|
234
|
+
void sendTextToSession(msg.sessionId, `[Error] ${errMsg}`, ctx.accountId);
|
|
202
235
|
}
|
|
203
236
|
}
|
|
204
237
|
// ── Outbound Helpers ────────────────────────────────────────────────
|
|
@@ -207,10 +240,10 @@ export function sendTextToSession(sessionId, text, accountId) {
|
|
|
207
240
|
if (!ws || ws.readyState !== WebSocket.OPEN)
|
|
208
241
|
return false;
|
|
209
242
|
const msg = {
|
|
210
|
-
type:
|
|
243
|
+
type: 'message',
|
|
211
244
|
id: generateMessageId(),
|
|
212
245
|
sessionId,
|
|
213
|
-
from:
|
|
246
|
+
from: 'ai',
|
|
214
247
|
text,
|
|
215
248
|
timestamp: Date.now(),
|
|
216
249
|
};
|
|
@@ -222,9 +255,9 @@ export function sendTypingToSession(sessionId, isTyping, accountId) {
|
|
|
222
255
|
if (!ws || ws.readyState !== WebSocket.OPEN)
|
|
223
256
|
return false;
|
|
224
257
|
ws.send(serializeRelayMessage({
|
|
225
|
-
type:
|
|
258
|
+
type: 'typing',
|
|
226
259
|
sessionId,
|
|
227
|
-
from:
|
|
260
|
+
from: 'ai',
|
|
228
261
|
isTyping,
|
|
229
262
|
}));
|
|
230
263
|
return true;
|
package/dist/src/gateway.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,SAAS,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* OpenClaw ChannelPlugin for browser-based chat via WebSocket relay.
|
|
5
5
|
*/
|
|
6
|
-
export { webChannelPlugin } from
|
|
7
|
-
export type { ResolvedWebAccount, WebAccountConfig } from
|
|
8
|
-
export { sendTextToSession, sendTypingToSession, getActiveWebSocket } from
|
|
9
|
-
export { type RelayMessage, type ChatMessage, type AuthMessage, generateMessageId, parseRelayMessage, serializeRelayMessage, HEARTBEAT_INTERVAL_MS, } from
|
|
6
|
+
export { webChannelPlugin } from './plugin.js';
|
|
7
|
+
export type { ResolvedWebAccount, WebAccountConfig } from './types.js';
|
|
8
|
+
export { sendTextToSession, sendTypingToSession, getActiveWebSocket, } from './gateway.js';
|
|
9
|
+
export { type RelayMessage, type ChatMessage, type AuthMessage, generateMessageId, parseRelayMessage, serializeRelayMessage, HEARTBEAT_INTERVAL_MS, } from './protocol.js';
|
|
10
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACtE,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,eAAe,CAAA"}
|
package/dist/src/index.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* OpenClaw ChannelPlugin for browser-based chat via WebSocket relay.
|
|
5
5
|
*/
|
|
6
|
-
export { webChannelPlugin } from
|
|
7
|
-
export { sendTextToSession, sendTypingToSession, getActiveWebSocket } from
|
|
8
|
-
export { generateMessageId, parseRelayMessage, serializeRelayMessage, HEARTBEAT_INTERVAL_MS, } from
|
|
6
|
+
export { webChannelPlugin } from './plugin.js';
|
|
7
|
+
export { sendTextToSession, sendTypingToSession, getActiveWebSocket, } from './gateway.js';
|
|
8
|
+
export { generateMessageId, parseRelayMessage, serializeRelayMessage, HEARTBEAT_INTERVAL_MS, } from './protocol.js';
|
|
9
9
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9C,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,cAAc,CAAA;AACrB,OAAO,EAIL,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,eAAe,CAAA"}
|
package/dist/src/outbound.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Web channel outbound adapter — sends messages via the gateway WebSocket.
|
|
3
3
|
*/
|
|
4
|
-
import type { ChannelOutboundAdapter } from
|
|
4
|
+
import type { ChannelOutboundAdapter } from 'openclaw/plugin-sdk';
|
|
5
5
|
export declare const webOutboundAdapter: ChannelOutboundAdapter;
|
|
6
6
|
//# sourceMappingURL=outbound.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbound.d.ts","sourceRoot":"","sources":["../../src/outbound.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,sBAAsB,EAEvB,MAAM,qBAAqB,
|
|
1
|
+
{"version":3,"file":"outbound.d.ts","sourceRoot":"","sources":["../../src/outbound.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,sBAAsB,EAEvB,MAAM,qBAAqB,CAAA;AAI5B,eAAO,MAAM,kBAAkB,EAAE,sBAqBhC,CAAA"}
|
package/dist/src/outbound.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Web channel outbound adapter — sends messages via the gateway WebSocket.
|
|
3
3
|
*/
|
|
4
|
-
import { generateMessageId } from
|
|
5
|
-
import { sendTextToSession } from
|
|
4
|
+
import { generateMessageId } from './protocol.js';
|
|
5
|
+
import { sendTextToSession } from './gateway.js';
|
|
6
6
|
export const webOutboundAdapter = {
|
|
7
|
-
deliveryMode:
|
|
7
|
+
deliveryMode: 'gateway',
|
|
8
8
|
textChunkLimit: 4000,
|
|
9
9
|
sendText: async (ctx) => {
|
|
10
10
|
const ok = sendTextToSession(ctx.to, ctx.text, ctx.accountId ?? undefined);
|
|
11
11
|
return {
|
|
12
|
-
channel:
|
|
13
|
-
messageId: ok ? generateMessageId() :
|
|
12
|
+
channel: 'clawshow',
|
|
13
|
+
messageId: ok ? generateMessageId() : '',
|
|
14
14
|
};
|
|
15
15
|
},
|
|
16
16
|
sendMedia: async (ctx) => {
|
|
@@ -18,8 +18,8 @@ export const webOutboundAdapter = {
|
|
|
18
18
|
const text = ctx.mediaUrl ? `${ctx.text}\n\n${ctx.mediaUrl}` : ctx.text;
|
|
19
19
|
const ok = sendTextToSession(ctx.to, text, ctx.accountId ?? undefined);
|
|
20
20
|
return {
|
|
21
|
-
channel:
|
|
22
|
-
messageId: ok ? generateMessageId() :
|
|
21
|
+
channel: 'clawshow',
|
|
22
|
+
messageId: ok ? generateMessageId() : '',
|
|
23
23
|
};
|
|
24
24
|
},
|
|
25
25
|
};
|
package/dist/src/outbound.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbound.js","sourceRoot":"","sources":["../../src/outbound.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"outbound.js","sourceRoot":"","sources":["../../src/outbound.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAEhD,MAAM,CAAC,MAAM,kBAAkB,GAA2B;IACxD,YAAY,EAAE,SAAkB;IAChC,cAAc,EAAE,IAAI;IAEpB,QAAQ,EAAE,KAAK,EAAE,GAA2B,EAAE,EAAE;QAC9C,MAAM,EAAE,GAAG,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC,CAAA;QAC1E,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE;SACzC,CAAA;IACH,CAAC;IAED,SAAS,EAAE,KAAK,EAAE,GAA2B,EAAE,EAAE;QAC/C,+DAA+D;QAC/D,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAA;QACvE,MAAM,EAAE,GAAG,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC,CAAA;QACtE,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE;SACzC,CAAA;IACH,CAAC;CACF,CAAA"}
|
package/dist/src/plugin.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Pattern follows Telegram/WhatsApp channel plugins.
|
|
5
5
|
*/
|
|
6
|
-
import type { ChannelPlugin } from
|
|
7
|
-
import type { ResolvedWebAccount } from
|
|
6
|
+
import type { ChannelPlugin } from 'openclaw/plugin-sdk';
|
|
7
|
+
import type { ResolvedWebAccount } from './types.js';
|
|
8
8
|
export declare const webChannelPlugin: ChannelPlugin<ResolvedWebAccount>;
|
|
9
9
|
//# sourceMappingURL=plugin.d.ts.map
|
package/dist/src/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAMxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEpD,eAAO,MAAM,gBAAgB,EAAE,aAAa,CAAC,kBAAkB,CA6B9D,CAAA"}
|
package/dist/src/plugin.js
CHANGED
|
@@ -3,23 +3,23 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Pattern follows Telegram/WhatsApp channel plugins.
|
|
5
5
|
*/
|
|
6
|
-
import { webConfigAdapter } from
|
|
7
|
-
import { webGatewayAdapter } from
|
|
8
|
-
import { webOutboundAdapter } from
|
|
9
|
-
import { webSecurityAdapter } from
|
|
10
|
-
import { webSetupAdapter } from
|
|
6
|
+
import { webConfigAdapter } from './config.js';
|
|
7
|
+
import { webGatewayAdapter } from './gateway.js';
|
|
8
|
+
import { webOutboundAdapter } from './outbound.js';
|
|
9
|
+
import { webSecurityAdapter } from './security.js';
|
|
10
|
+
import { webSetupAdapter } from './setup.js';
|
|
11
11
|
export const webChannelPlugin = {
|
|
12
|
-
id:
|
|
12
|
+
id: 'clawshow',
|
|
13
13
|
meta: {
|
|
14
|
-
id:
|
|
15
|
-
label:
|
|
16
|
-
selectionLabel:
|
|
17
|
-
docsPath:
|
|
18
|
-
blurb:
|
|
14
|
+
id: 'clawshow',
|
|
15
|
+
label: 'Clawshow',
|
|
16
|
+
selectionLabel: 'Clawshow (browser chat)',
|
|
17
|
+
docsPath: '/channels/clawshow',
|
|
18
|
+
blurb: 'Browser chat via WebSocket relay',
|
|
19
19
|
order: 50,
|
|
20
20
|
},
|
|
21
21
|
capabilities: {
|
|
22
|
-
chatTypes: [
|
|
22
|
+
chatTypes: ['direct'],
|
|
23
23
|
media: false,
|
|
24
24
|
reactions: false,
|
|
25
25
|
},
|
|
@@ -28,14 +28,14 @@ export const webChannelPlugin = {
|
|
|
28
28
|
debounceMs: 500,
|
|
29
29
|
},
|
|
30
30
|
},
|
|
31
|
-
reload: { configPrefixes: [
|
|
31
|
+
reload: { configPrefixes: ['channels.clawshow'] },
|
|
32
32
|
config: webConfigAdapter,
|
|
33
33
|
gateway: webGatewayAdapter,
|
|
34
34
|
outbound: webOutboundAdapter,
|
|
35
35
|
security: webSecurityAdapter,
|
|
36
36
|
setup: webSetupAdapter,
|
|
37
37
|
pairing: {
|
|
38
|
-
idLabel:
|
|
38
|
+
idLabel: 'sessionId',
|
|
39
39
|
},
|
|
40
40
|
};
|
|
41
41
|
//# sourceMappingURL=plugin.js.map
|
package/dist/src/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAG5C,MAAM,CAAC,MAAM,gBAAgB,GAAsC;IACjE,EAAE,EAAE,UAAU;IACd,IAAI,EAAE;QACJ,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,UAAU;QACjB,cAAc,EAAE,yBAAyB;QACzC,QAAQ,EAAE,oBAAoB;QAC9B,KAAK,EAAE,kCAAkC;QACzC,KAAK,EAAE,EAAE;KACV;IACD,YAAY,EAAE;QACZ,SAAS,EAAE,CAAC,QAAQ,CAAC;QACrB,KAAK,EAAE,KAAK;QACZ,SAAS,EAAE,KAAK;KACjB;IACD,QAAQ,EAAE;QACR,KAAK,EAAE;YACL,UAAU,EAAE,GAAG;SAChB;KACF;IACD,MAAM,EAAE,EAAE,cAAc,EAAE,CAAC,mBAAmB,CAAC,EAAE;IACjD,MAAM,EAAE,gBAAgB;IACxB,OAAO,EAAE,iBAAiB;IAC1B,QAAQ,EAAE,kBAAkB;IAC5B,QAAQ,EAAE,kBAAkB;IAC5B,KAAK,EAAE,eAAe;IACtB,OAAO,EAAE;QACP,OAAO,EAAE,WAAW;KACrB;CACF,CAAA"}
|
package/dist/src/protocol.d.ts
CHANGED
|
@@ -2,60 +2,62 @@
|
|
|
2
2
|
* Shared WebSocket message protocol for Web Channel.
|
|
3
3
|
* Used by: web-relay (Cloudflare Worker), openclaw-channel-web (plugin), web-chat (frontend).
|
|
4
4
|
*/
|
|
5
|
-
export type WebSocketRole =
|
|
5
|
+
export type WebSocketRole = 'browser' | 'openclaw';
|
|
6
6
|
export type AuthMessage = {
|
|
7
|
-
type:
|
|
7
|
+
type: 'auth';
|
|
8
8
|
role: WebSocketRole;
|
|
9
9
|
token: string;
|
|
10
10
|
sessionId?: string;
|
|
11
11
|
};
|
|
12
12
|
export type AuthResultMessage = {
|
|
13
|
-
type:
|
|
13
|
+
type: 'auth_result';
|
|
14
14
|
ok: boolean;
|
|
15
15
|
error?: string;
|
|
16
16
|
sessionId?: string;
|
|
17
|
+
userId?: string;
|
|
18
|
+
userName?: string;
|
|
17
19
|
};
|
|
18
20
|
export type ChatMessage = {
|
|
19
|
-
type:
|
|
21
|
+
type: 'message';
|
|
20
22
|
id: string;
|
|
21
23
|
sessionId: string;
|
|
22
|
-
from:
|
|
24
|
+
from: 'user' | 'ai';
|
|
23
25
|
text: string;
|
|
24
26
|
timestamp: number;
|
|
25
27
|
};
|
|
26
28
|
export type AckMessage = {
|
|
27
|
-
type:
|
|
29
|
+
type: 'ack';
|
|
28
30
|
messageId: string;
|
|
29
31
|
sessionId: string;
|
|
30
32
|
};
|
|
31
33
|
export type TypingMessage = {
|
|
32
|
-
type:
|
|
34
|
+
type: 'typing';
|
|
33
35
|
sessionId: string;
|
|
34
|
-
from:
|
|
36
|
+
from: 'user' | 'ai';
|
|
35
37
|
isTyping: boolean;
|
|
36
38
|
};
|
|
37
39
|
export type HistoryRequestMessage = {
|
|
38
|
-
type:
|
|
40
|
+
type: 'history_request';
|
|
39
41
|
sessionId: string;
|
|
40
42
|
before?: number;
|
|
41
43
|
limit?: number;
|
|
42
44
|
};
|
|
43
45
|
export type HistoryResponseMessage = {
|
|
44
|
-
type:
|
|
46
|
+
type: 'history_response';
|
|
45
47
|
sessionId: string;
|
|
46
48
|
messages: ChatMessage[];
|
|
47
49
|
hasMore: boolean;
|
|
48
50
|
};
|
|
49
51
|
export type PingMessage = {
|
|
50
|
-
type:
|
|
52
|
+
type: 'ping';
|
|
51
53
|
timestamp: number;
|
|
52
54
|
};
|
|
53
55
|
export type PongMessage = {
|
|
54
|
-
type:
|
|
56
|
+
type: 'pong';
|
|
55
57
|
timestamp: number;
|
|
56
58
|
};
|
|
57
59
|
export type ErrorMessage = {
|
|
58
|
-
type:
|
|
60
|
+
type: 'error';
|
|
59
61
|
code: string;
|
|
60
62
|
message: string;
|
|
61
63
|
sessionId?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/protocol.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/protocol.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,UAAU,CAAA;AAIlD,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,aAAa,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,aAAa,CAAA;IACnB,EAAE,EAAE,OAAO,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,SAAS,CAAA;IACf,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,KAAK,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,QAAQ,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,iBAAiB,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,kBAAkB,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,OAAO,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAID,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,iBAAiB,GACjB,WAAW,GACX,UAAU,GACV,aAAa,GACb,qBAAqB,GACrB,sBAAsB,GACtB,WAAW,GACX,WAAW,GACX,YAAY,CAAA;AAIhB,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAoClE;AAwGD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAE/D;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAID,eAAO,MAAM,qBAAqB,QAAS,CAAA;AAC3C,eAAO,MAAM,uBAAuB,MAAM,CAAA;AAC1C,eAAO,MAAM,qBAAqB,KAAK,CAAA"}
|
package/dist/src/protocol.js
CHANGED
|
@@ -6,15 +6,111 @@
|
|
|
6
6
|
export function parseRelayMessage(raw) {
|
|
7
7
|
try {
|
|
8
8
|
const parsed = JSON.parse(raw);
|
|
9
|
-
if (typeof parsed
|
|
10
|
-
return
|
|
9
|
+
if (typeof parsed !== 'object' || parsed === null || !('type' in parsed)) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
const msg = parsed;
|
|
13
|
+
switch (msg.type) {
|
|
14
|
+
case 'auth':
|
|
15
|
+
return isValidAuthMessage(parsed) ? parsed : null;
|
|
16
|
+
case 'auth_result':
|
|
17
|
+
return isValidAuthResultMessage(parsed) ? parsed : null;
|
|
18
|
+
case 'message':
|
|
19
|
+
return isValidChatMessage(parsed) ? parsed : null;
|
|
20
|
+
case 'ack':
|
|
21
|
+
return isValidAckMessage(parsed) ? parsed : null;
|
|
22
|
+
case 'typing':
|
|
23
|
+
return isValidTypingMessage(parsed) ? parsed : null;
|
|
24
|
+
case 'history_request':
|
|
25
|
+
return isValidHistoryRequestMessage(parsed) ? parsed : null;
|
|
26
|
+
case 'history_response':
|
|
27
|
+
return isValidHistoryResponseMessage(parsed) ? parsed : null;
|
|
28
|
+
case 'ping':
|
|
29
|
+
return isValidPingMessage(parsed) ? parsed : null;
|
|
30
|
+
case 'pong':
|
|
31
|
+
return isValidPongMessage(parsed) ? parsed : null;
|
|
32
|
+
case 'error':
|
|
33
|
+
return isValidErrorMessage(parsed) ? parsed : null;
|
|
34
|
+
default:
|
|
35
|
+
return null;
|
|
11
36
|
}
|
|
12
|
-
return null;
|
|
13
37
|
}
|
|
14
38
|
catch {
|
|
15
39
|
return null;
|
|
16
40
|
}
|
|
17
41
|
}
|
|
42
|
+
// Type guards for each message type
|
|
43
|
+
function isValidAuthMessage(msg) {
|
|
44
|
+
return (typeof msg === 'object' && msg !== null &&
|
|
45
|
+
msg.type === 'auth' &&
|
|
46
|
+
typeof msg.role === 'string' &&
|
|
47
|
+
['browser', 'openclaw'].includes(msg.role) &&
|
|
48
|
+
typeof msg.token === 'string' &&
|
|
49
|
+
(msg.sessionId === undefined || typeof msg.sessionId === 'string'));
|
|
50
|
+
}
|
|
51
|
+
function isValidAuthResultMessage(msg) {
|
|
52
|
+
return (typeof msg === 'object' && msg !== null &&
|
|
53
|
+
msg.type === 'auth_result' &&
|
|
54
|
+
typeof msg.ok === 'boolean' &&
|
|
55
|
+
(msg.error === undefined || typeof msg.error === 'string') &&
|
|
56
|
+
(msg.sessionId === undefined || typeof msg.sessionId === 'string'));
|
|
57
|
+
}
|
|
58
|
+
function isValidChatMessage(msg) {
|
|
59
|
+
return (typeof msg === 'object' && msg !== null &&
|
|
60
|
+
msg.type === 'message' &&
|
|
61
|
+
typeof msg.id === 'string' &&
|
|
62
|
+
typeof msg.sessionId === 'string' &&
|
|
63
|
+
['user', 'ai'].includes(msg.from) &&
|
|
64
|
+
typeof msg.text === 'string' &&
|
|
65
|
+
typeof msg.timestamp === 'number');
|
|
66
|
+
}
|
|
67
|
+
function isValidAckMessage(msg) {
|
|
68
|
+
return (typeof msg === 'object' && msg !== null &&
|
|
69
|
+
msg.type === 'ack' &&
|
|
70
|
+
typeof msg.messageId === 'string' &&
|
|
71
|
+
typeof msg.sessionId === 'string');
|
|
72
|
+
}
|
|
73
|
+
function isValidTypingMessage(msg) {
|
|
74
|
+
return (typeof msg === 'object' && msg !== null &&
|
|
75
|
+
msg.type === 'typing' &&
|
|
76
|
+
typeof msg.sessionId === 'string' &&
|
|
77
|
+
['user', 'ai'].includes(msg.from) &&
|
|
78
|
+
typeof msg.isTyping === 'boolean');
|
|
79
|
+
}
|
|
80
|
+
function isValidHistoryRequestMessage(msg) {
|
|
81
|
+
const m = msg;
|
|
82
|
+
return (typeof msg === 'object' && msg !== null &&
|
|
83
|
+
m.type === 'history_request' &&
|
|
84
|
+
typeof m.sessionId === 'string' &&
|
|
85
|
+
(m.before === undefined || typeof m.before === 'number') &&
|
|
86
|
+
(m.limit === undefined || typeof m.limit === 'number'));
|
|
87
|
+
}
|
|
88
|
+
function isValidHistoryResponseMessage(msg) {
|
|
89
|
+
const m = msg;
|
|
90
|
+
return (typeof msg === 'object' && msg !== null &&
|
|
91
|
+
m.type === 'history_response' &&
|
|
92
|
+
typeof m.sessionId === 'string' &&
|
|
93
|
+
Array.isArray(m.messages) &&
|
|
94
|
+
typeof m.hasMore === 'boolean');
|
|
95
|
+
}
|
|
96
|
+
function isValidPingMessage(msg) {
|
|
97
|
+
return (typeof msg === 'object' && msg !== null &&
|
|
98
|
+
msg.type === 'ping' &&
|
|
99
|
+
typeof msg.timestamp === 'number');
|
|
100
|
+
}
|
|
101
|
+
function isValidPongMessage(msg) {
|
|
102
|
+
return (typeof msg === 'object' && msg !== null &&
|
|
103
|
+
msg.type === 'pong' &&
|
|
104
|
+
typeof msg.timestamp === 'number');
|
|
105
|
+
}
|
|
106
|
+
function isValidErrorMessage(msg) {
|
|
107
|
+
const m = msg;
|
|
108
|
+
return (typeof msg === 'object' && msg !== null &&
|
|
109
|
+
m.type === 'error' &&
|
|
110
|
+
typeof m.code === 'string' &&
|
|
111
|
+
typeof m.message === 'string' &&
|
|
112
|
+
(m.sessionId === undefined || typeof m.sessionId === 'string'));
|
|
113
|
+
}
|
|
18
114
|
export function serializeRelayMessage(msg) {
|
|
19
115
|
return JSON.stringify(msg);
|
|
20
116
|
}
|
package/dist/src/protocol.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/protocol.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/src/runtime.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Uses the same PluginRuntime type as other channel extensions (WhatsApp, etc.)
|
|
4
4
|
* for full access to openclaw infrastructure (config, logging, subagent, channel).
|
|
5
5
|
*/
|
|
6
|
-
import type { PluginRuntime } from
|
|
6
|
+
import type { PluginRuntime } from 'openclaw/plugin-sdk';
|
|
7
7
|
declare const setWebRuntime: (next: PluginRuntime) => void, getWebRuntime: () => PluginRuntime;
|
|
8
8
|
export { getWebRuntime, setWebRuntime };
|
|
9
9
|
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAExD,QAAA,MAAoB,aAAa,iCAAc,aAAa,qBACoB,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,CAAA"}
|
package/dist/src/runtime.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Uses the same PluginRuntime type as other channel extensions (WhatsApp, etc.)
|
|
4
4
|
* for full access to openclaw infrastructure (config, logging, subagent, channel).
|
|
5
5
|
*/
|
|
6
|
-
import { createPluginRuntimeStore } from
|
|
7
|
-
const { setRuntime: setWebRuntime, getRuntime: getWebRuntime } = createPluginRuntimeStore(
|
|
6
|
+
import { createPluginRuntimeStore } from 'openclaw/plugin-sdk';
|
|
7
|
+
const { setRuntime: setWebRuntime, getRuntime: getWebRuntime } = createPluginRuntimeStore('Web channel runtime not initialized');
|
|
8
8
|
export { getWebRuntime, setWebRuntime };
|
|
9
9
|
//# sourceMappingURL=runtime.js.map
|
package/dist/src/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAG9D,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,GAC5D,wBAAwB,CAAgB,qCAAqC,CAAC,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,CAAA"}
|
package/dist/src/security.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Web channel DM security adapter.
|
|
3
3
|
*/
|
|
4
|
-
import type { ChannelSecurityAdapter } from
|
|
5
|
-
import type { ResolvedWebAccount } from
|
|
4
|
+
import type { ChannelSecurityAdapter } from 'openclaw/plugin-sdk';
|
|
5
|
+
import type { ResolvedWebAccount } from './types.js';
|
|
6
6
|
export declare const webSecurityAdapter: ChannelSecurityAdapter<ResolvedWebAccount>;
|
|
7
7
|
//# sourceMappingURL=security.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/security.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,sBAAsB,EAGvB,MAAM,qBAAqB,
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/security.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,sBAAsB,EAGvB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEpD,eAAO,MAAM,kBAAkB,EAAE,sBAAsB,CAAC,kBAAkB,CAazE,CAAA"}
|
package/dist/src/security.js
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const webSecurityAdapter = {
|
|
5
5
|
resolveDmPolicy: (ctx) => {
|
|
6
|
-
const policy = ctx.account.config.dmPolicy ??
|
|
6
|
+
const policy = ctx.account.config.dmPolicy ?? 'open';
|
|
7
7
|
return {
|
|
8
8
|
policy,
|
|
9
9
|
allowFrom: ctx.account.config.allowFrom ?? null,
|
|
10
|
-
policyPath:
|
|
11
|
-
allowFromPath:
|
|
12
|
-
approveHint:
|
|
10
|
+
policyPath: 'channels.clawshow.dmPolicy',
|
|
11
|
+
allowFromPath: 'channels.clawshow.allowFrom',
|
|
12
|
+
approveHint: 'Add the session ID to channels.clawshow.allowFrom',
|
|
13
13
|
};
|
|
14
14
|
},
|
|
15
15
|
};
|
package/dist/src/security.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/security.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,MAAM,CAAC,MAAM,kBAAkB,GAA+C;IAC5E,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/security.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,MAAM,CAAC,MAAM,kBAAkB,GAA+C;IAC5E,eAAe,EAAE,CACf,GAA+C,EACtB,EAAE;QAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAA;QACpD,OAAO;YACL,MAAM;YACN,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI;YAC/C,UAAU,EAAE,4BAA4B;YACxC,aAAa,EAAE,6BAA6B;YAC5C,WAAW,EAAE,mDAAmD;SACjE,CAAA;IACH,CAAC;CACF,CAAA"}
|
package/dist/src/setup.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Web channel setup adapter — applies account configuration.
|
|
3
3
|
*/
|
|
4
|
-
import type { ChannelSetupAdapter } from
|
|
4
|
+
import type { ChannelSetupAdapter } from 'openclaw/plugin-sdk';
|
|
5
5
|
export declare const webSetupAdapter: ChannelSetupAdapter;
|
|
6
6
|
//# sourceMappingURL=setup.d.ts.map
|
package/dist/src/setup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAGpB,MAAM,qBAAqB,
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAGpB,MAAM,qBAAqB,CAAA;AAE5B,eAAO,MAAM,eAAe,EAAE,mBAkE7B,CAAA"}
|
package/dist/src/setup.js
CHANGED
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
export const webSetupAdapter = {
|
|
5
5
|
applyAccountConfig: (params) => {
|
|
6
6
|
const { cfg, accountId, input } = params;
|
|
7
|
-
if (accountId ===
|
|
7
|
+
if (accountId === 'default') {
|
|
8
8
|
return {
|
|
9
9
|
...cfg,
|
|
10
10
|
channels: {
|
|
11
11
|
...cfg.channels,
|
|
12
|
-
|
|
13
|
-
...cfg.channels?.
|
|
12
|
+
clawshow: {
|
|
13
|
+
...cfg.channels?.clawshow,
|
|
14
14
|
enabled: true,
|
|
15
15
|
...(input.url ? { relayUrl: input.url } : {}),
|
|
16
16
|
...(input.token ? { authToken: input.token } : {}),
|
|
@@ -19,13 +19,13 @@ export const webSetupAdapter = {
|
|
|
19
19
|
},
|
|
20
20
|
};
|
|
21
21
|
}
|
|
22
|
-
const webConfig = cfg.channels?.
|
|
22
|
+
const webConfig = cfg.channels?.clawshow ?? {};
|
|
23
23
|
const accounts = webConfig.accounts ?? {};
|
|
24
24
|
return {
|
|
25
25
|
...cfg,
|
|
26
26
|
channels: {
|
|
27
27
|
...cfg.channels,
|
|
28
|
-
|
|
28
|
+
clawshow: {
|
|
29
29
|
...webConfig,
|
|
30
30
|
enabled: true,
|
|
31
31
|
accounts: {
|
|
@@ -44,10 +44,12 @@ export const webSetupAdapter = {
|
|
|
44
44
|
},
|
|
45
45
|
validateInput: (params) => {
|
|
46
46
|
if (!params.input.url && !params.input.useEnv) {
|
|
47
|
-
return
|
|
47
|
+
return 'Web channel requires relayUrl (--url) or --use-env.';
|
|
48
48
|
}
|
|
49
|
-
if (!params.input.token &&
|
|
50
|
-
|
|
49
|
+
if (!params.input.token &&
|
|
50
|
+
!params.input.useEnv &&
|
|
51
|
+
!process.env.WEB_RELAY_AUTH_TOKEN) {
|
|
52
|
+
return 'Web channel requires authToken (--token), --use-env, or WEB_RELAY_AUTH_TOKEN env var.';
|
|
51
53
|
}
|
|
52
54
|
return null;
|
|
53
55
|
},
|
package/dist/src/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,CAAC,MAAM,eAAe,GAAwB;IAClD,kBAAkB,EAAE,CAAC,MAIpB,EAAkB,EAAE;QACnB,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,CAAC,MAAM,eAAe,GAAwB;IAClD,kBAAkB,EAAE,CAAC,MAIpB,EAAkB,EAAE;QACnB,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,MAAM,CAAA;QAExC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO;gBACL,GAAG,GAAG;gBACN,QAAQ,EAAE;oBACR,GAAG,GAAG,CAAC,QAAQ;oBACf,QAAQ,EAAE;wBACR,GAAI,GAAG,CAAC,QAAQ,EAAE,QAAgD;wBAClE,OAAO,EAAE,IAAI;wBACb,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC7C,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAClD,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC5C;iBACF;aACF,CAAA;QACH,CAAC;QAED,MAAM,SAAS,GAAI,GAAG,CAAC,QAAQ,EAAE,QAAoC,IAAI,EAAE,CAAA;QAC3E,MAAM,QAAQ,GAAI,SAAS,CAAC,QAAoC,IAAI,EAAE,CAAA;QAEtE,OAAO;YACL,GAAG,GAAG;YACN,QAAQ,EAAE;gBACR,GAAG,GAAG,CAAC,QAAQ;gBACf,QAAQ,EAAE;oBACR,GAAG,SAAS;oBACZ,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE;wBACR,GAAG,QAAQ;wBACX,CAAC,SAAS,CAAC,EAAE;4BACX,GAAI,QAAQ,CAAC,SAAS,CAAyC;4BAC/D,OAAO,EAAE,IAAI;4BACb,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;4BAC7C,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;4BAClD,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;yBAC5C;qBACF;iBACF;aACF;SACF,CAAA;IACH,CAAC;IAED,aAAa,EAAE,CAAC,MAIf,EAAiB,EAAE;QAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC9C,OAAO,qDAAqD,CAAA;QAC9D,CAAC;QACD,IACE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK;YACnB,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM;YACpB,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EACjC,CAAC;YACD,OAAO,uFAAuF,CAAA;QAChG,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;CACF,CAAA"}
|
package/dist/src/types.d.ts
CHANGED
package/dist/src/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;IAC/B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,gBAAgB,CAAA;CACzB"}
|
package/openclaw.plugin.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bowong/clawshow-gateway",
|
|
3
|
-
"version": "2026.3.
|
|
3
|
+
"version": "2026.3.16",
|
|
4
4
|
"description": "OpenClaw Web channel plugin — browser-based chat via WebSocket relay",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -19,21 +19,20 @@
|
|
|
19
19
|
"dist",
|
|
20
20
|
"openclaw.plugin.json",
|
|
21
21
|
"package.json",
|
|
22
|
-
"README.md"
|
|
23
|
-
"index.ts"
|
|
22
|
+
"README.md"
|
|
24
23
|
],
|
|
25
24
|
"openclaw": {
|
|
26
25
|
"extensions": [
|
|
27
|
-
"./index.
|
|
26
|
+
"./dist/index.js"
|
|
28
27
|
]
|
|
29
28
|
},
|
|
30
|
-
"
|
|
31
|
-
"ws": "^8.
|
|
32
|
-
},
|
|
33
|
-
"devDependencies": {
|
|
29
|
+
"peerDependencies": {
|
|
30
|
+
"ws": "^8.19.0",
|
|
34
31
|
"@types/ws": "^8.5.13",
|
|
35
32
|
"openclaw": "^2026.3.12"
|
|
36
33
|
},
|
|
34
|
+
"dependencies": {},
|
|
35
|
+
"devDependencies": {},
|
|
37
36
|
"scripts": {
|
|
38
37
|
"build": "node -e \"require('fs').rmSync('dist',{ recursive: true, force: true })\" && bun x tsc -p tsconfig.build.json",
|
|
39
38
|
"typecheck": "bun x tsc --noEmit",
|
package/index.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { OpenClawPluginApi } from "openclaw/plugin-sdk/core";
|
|
2
|
-
import { emptyPluginConfigSchema } from "openclaw/plugin-sdk/core";
|
|
3
|
-
import { webChannelPlugin } from "./src/plugin.js";
|
|
4
|
-
import { setWebRuntime } from "./src/runtime.js";
|
|
5
|
-
|
|
6
|
-
const plugin = {
|
|
7
|
-
id: "web",
|
|
8
|
-
name: "Web",
|
|
9
|
-
description: "Web channel plugin — browser chat via WebSocket relay",
|
|
10
|
-
configSchema: emptyPluginConfigSchema(),
|
|
11
|
-
register(api: OpenClawPluginApi) {
|
|
12
|
-
setWebRuntime(api.runtime);
|
|
13
|
-
api.registerChannel({ plugin: webChannelPlugin });
|
|
14
|
-
},
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export default plugin;
|