@clawsignal/clawsignal 0.2.0 → 0.3.1
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/clawdbot.plugin.json +15 -40
- package/dist/index.d.ts +15 -75
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +297 -245
- package/dist/index.js.map +1 -1
- package/openclaw.plugin.json +15 -40
- package/package.json +1 -1
package/clawdbot.plugin.json
CHANGED
|
@@ -1,50 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "clawsignal",
|
|
3
3
|
"name": "ClawSignal",
|
|
4
|
-
"version": "0.
|
|
5
|
-
"description": "
|
|
4
|
+
"version": "0.3.0",
|
|
5
|
+
"description": "Real-time messaging between AI agents via ClawSignal",
|
|
6
6
|
"author": "ClawSignal",
|
|
7
7
|
"configSchema": {
|
|
8
8
|
"type": "object",
|
|
9
9
|
"additionalProperties": false,
|
|
10
|
-
"
|
|
11
|
-
"properties": {
|
|
12
|
-
"apiKey": {
|
|
13
|
-
"type": "string",
|
|
14
|
-
"description": "Your ClawSignal API key (starts with clawsig_)"
|
|
15
|
-
},
|
|
16
|
-
"serverUrl": {
|
|
17
|
-
"type": "string",
|
|
18
|
-
"description": "ClawSignal server URL (default: wss://clawsignal.com)",
|
|
19
|
-
"default": "wss://clawsignal.com"
|
|
20
|
-
},
|
|
21
|
-
"autoReply": {
|
|
22
|
-
"type": "boolean",
|
|
23
|
-
"description": "Automatically send agent responses back via ClawSignal",
|
|
24
|
-
"default": true
|
|
25
|
-
},
|
|
26
|
-
"sessionPrefix": {
|
|
27
|
-
"type": "string",
|
|
28
|
-
"description": "Prefix for session keys",
|
|
29
|
-
"default": "clawsignal"
|
|
30
|
-
}
|
|
31
|
-
}
|
|
10
|
+
"properties": {}
|
|
32
11
|
},
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
"
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
"
|
|
44
|
-
|
|
45
|
-
},
|
|
46
|
-
"sessionPrefix": {
|
|
47
|
-
"label": "Session Prefix"
|
|
48
|
-
}
|
|
12
|
+
"channel": {
|
|
13
|
+
"id": "clawsignal",
|
|
14
|
+
"label": "ClawSignal",
|
|
15
|
+
"selectionLabel": "ClawSignal (Agent Messaging)",
|
|
16
|
+
"docsPath": "/channels/clawsignal",
|
|
17
|
+
"docsLabel": "clawsignal",
|
|
18
|
+
"blurb": "Real-time messaging between AI agents",
|
|
19
|
+
"order": 110
|
|
20
|
+
},
|
|
21
|
+
"install": {
|
|
22
|
+
"npmSpec": "@clawsignal/clawsignal",
|
|
23
|
+
"defaultChoice": "npm"
|
|
49
24
|
}
|
|
50
25
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,80 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ClawSignal Plugin for
|
|
2
|
+
* ClawSignal Plugin for OpenClaw
|
|
3
3
|
*
|
|
4
|
-
* Connects to ClawSignal's event stream and
|
|
5
|
-
*
|
|
4
|
+
* Connects to ClawSignal's event stream and handles messages through
|
|
5
|
+
* OpenClaw's standard channel infrastructure.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
resolveAgentRoute: (params: {
|
|
17
|
-
cfg: unknown;
|
|
18
|
-
channel: string;
|
|
19
|
-
accountId?: string;
|
|
20
|
-
peer?: {
|
|
21
|
-
kind: string;
|
|
22
|
-
id: string;
|
|
23
|
-
};
|
|
24
|
-
}) => {
|
|
25
|
-
sessionKey: string;
|
|
26
|
-
accountId: string;
|
|
27
|
-
};
|
|
28
|
-
};
|
|
29
|
-
reply: {
|
|
30
|
-
finalizeInboundContext: (ctx: Record<string, unknown>) => Record<string, unknown>;
|
|
31
|
-
dispatchReplyFromConfig: (params: {
|
|
32
|
-
ctx: Record<string, unknown>;
|
|
33
|
-
cfg: unknown;
|
|
34
|
-
dispatcher: {
|
|
35
|
-
deliver: (payload: {
|
|
36
|
-
text?: string;
|
|
37
|
-
}) => void | Promise<void>;
|
|
38
|
-
complete: () => void;
|
|
39
|
-
};
|
|
40
|
-
replyOptions?: Record<string, unknown>;
|
|
41
|
-
}) => Promise<{
|
|
42
|
-
queuedFinal: boolean;
|
|
43
|
-
}>;
|
|
44
|
-
};
|
|
45
|
-
session: {
|
|
46
|
-
recordInboundSession: (params: {
|
|
47
|
-
storePath: string;
|
|
48
|
-
sessionKey: string;
|
|
49
|
-
ctx: Record<string, unknown>;
|
|
50
|
-
}) => Promise<void>;
|
|
51
|
-
resolveStorePath: (cfg: unknown) => string;
|
|
52
|
-
};
|
|
7
|
+
declare const plugin: {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
version: string;
|
|
11
|
+
description: string;
|
|
12
|
+
configSchema: {
|
|
13
|
+
type: string;
|
|
14
|
+
additionalProperties: boolean;
|
|
15
|
+
properties: {};
|
|
53
16
|
};
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
interface PluginApi {
|
|
59
|
-
config: unknown;
|
|
60
|
-
logger: PluginLogger;
|
|
61
|
-
runtime: PluginRuntime;
|
|
62
|
-
registerService: (service: {
|
|
63
|
-
id: string;
|
|
64
|
-
start: () => void | Promise<void>;
|
|
65
|
-
stop: () => void | Promise<void>;
|
|
66
|
-
}) => void;
|
|
67
|
-
registerGatewayMethod: (method: string, handler: (ctx: {
|
|
68
|
-
params: unknown;
|
|
69
|
-
respond: (ok: boolean, payload: unknown) => void;
|
|
70
|
-
}) => void) => void;
|
|
71
|
-
registerTool: (tool: {
|
|
72
|
-
name: string;
|
|
73
|
-
description: string;
|
|
74
|
-
parameters: object;
|
|
75
|
-
handler: (params: unknown) => Promise<unknown>;
|
|
76
|
-
}) => void;
|
|
77
|
-
}
|
|
78
|
-
export default function register(api: PluginApi): void;
|
|
79
|
-
export {};
|
|
17
|
+
register(api: any): void;
|
|
18
|
+
};
|
|
19
|
+
export default plugin;
|
|
80
20
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA2TH,QAAA,MAAM,MAAM;;;;;;;;;;kBAWI,GAAG;CAyDlB,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,266 +1,318 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ClawSignal Plugin for
|
|
2
|
+
* ClawSignal Plugin for OpenClaw
|
|
3
3
|
*
|
|
4
|
-
* Connects to ClawSignal's event stream and
|
|
5
|
-
*
|
|
4
|
+
* Connects to ClawSignal's event stream and handles messages through
|
|
5
|
+
* OpenClaw's standard channel infrastructure.
|
|
6
6
|
*/
|
|
7
|
-
import WebSocket from
|
|
8
|
-
const DEFAULT_SERVER_URL =
|
|
7
|
+
import WebSocket from "ws";
|
|
8
|
+
const DEFAULT_SERVER_URL = "wss://clawsignal.com";
|
|
9
9
|
const RECONNECT_DELAY_MS = 5000;
|
|
10
10
|
const PING_INTERVAL_MS = 30000;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
11
|
+
// Runtime reference
|
|
12
|
+
let pluginRuntime = null;
|
|
13
|
+
function setRuntime(runtime) {
|
|
14
|
+
pluginRuntime = runtime;
|
|
15
|
+
}
|
|
16
|
+
function getRuntime() {
|
|
17
|
+
if (!pluginRuntime)
|
|
18
|
+
throw new Error("ClawSignal runtime not initialized");
|
|
19
|
+
return pluginRuntime;
|
|
20
|
+
}
|
|
21
|
+
// Config helpers
|
|
22
|
+
function resolveClawSignalAccount(cfg, accountId) {
|
|
23
|
+
const config = cfg.channels?.clawsignal;
|
|
24
|
+
return {
|
|
25
|
+
accountId: accountId ?? "default",
|
|
26
|
+
enabled: config?.enabled !== false,
|
|
27
|
+
configured: !!config?.apiKey,
|
|
28
|
+
apiKey: config?.apiKey ?? null,
|
|
29
|
+
serverUrl: config?.serverUrl ?? DEFAULT_SERVER_URL,
|
|
19
30
|
};
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
31
|
+
}
|
|
32
|
+
// Active connections
|
|
33
|
+
const activeConnections = new Map();
|
|
34
|
+
// Send message to ClawSignal
|
|
35
|
+
async function sendToClawSignal(to, message, account) {
|
|
36
|
+
if (!account.apiKey)
|
|
37
|
+
return false;
|
|
38
|
+
const httpUrl = account.serverUrl
|
|
39
|
+
.replace("wss://", "https://")
|
|
40
|
+
.replace("ws://", "http://");
|
|
41
|
+
try {
|
|
42
|
+
const response = await fetch(`${httpUrl}/api/v1/send`, {
|
|
43
|
+
method: "POST",
|
|
44
|
+
headers: {
|
|
45
|
+
Authorization: `Bearer ${account.apiKey}`,
|
|
46
|
+
"Content-Type": "application/json",
|
|
47
|
+
},
|
|
48
|
+
body: JSON.stringify({ to, message }),
|
|
49
|
+
});
|
|
50
|
+
return response.ok;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Channel plugin definition
|
|
57
|
+
const clawsignalChannel = {
|
|
58
|
+
id: "clawsignal",
|
|
59
|
+
meta: {
|
|
60
|
+
id: "clawsignal",
|
|
61
|
+
label: "ClawSignal",
|
|
62
|
+
selectionLabel: "ClawSignal (Agent Messaging)",
|
|
63
|
+
docsPath: "/channels/clawsignal",
|
|
64
|
+
docsLabel: "clawsignal",
|
|
65
|
+
blurb: "Real-time messaging between AI agents via ClawSignal",
|
|
66
|
+
order: 110,
|
|
67
|
+
},
|
|
68
|
+
capabilities: {
|
|
69
|
+
chatTypes: ["direct"],
|
|
70
|
+
media: false,
|
|
71
|
+
},
|
|
72
|
+
reload: { configPrefixes: ["channels.clawsignal"] },
|
|
73
|
+
configSchema: {
|
|
74
|
+
type: "object",
|
|
75
|
+
properties: {
|
|
76
|
+
clawsignal: {
|
|
77
|
+
type: "object",
|
|
78
|
+
properties: {
|
|
79
|
+
apiKey: { type: "string" },
|
|
80
|
+
serverUrl: { type: "string" },
|
|
81
|
+
enabled: { type: "boolean" },
|
|
37
82
|
},
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
config: {
|
|
87
|
+
listAccountIds: () => ["default"],
|
|
88
|
+
resolveAccount: (cfg, accountId) => resolveClawSignalAccount(cfg, accountId),
|
|
89
|
+
defaultAccountId: () => "default",
|
|
90
|
+
isConfigured: (account) => account.configured,
|
|
91
|
+
describeAccount: (account) => ({
|
|
92
|
+
accountId: account.accountId,
|
|
93
|
+
enabled: account.enabled,
|
|
94
|
+
configured: account.configured,
|
|
95
|
+
}),
|
|
96
|
+
},
|
|
97
|
+
outbound: {
|
|
98
|
+
deliveryMode: "direct",
|
|
99
|
+
textChunkLimit: 4000,
|
|
100
|
+
sendText: async ({ to, text, accountId }) => {
|
|
101
|
+
const runtime = getRuntime();
|
|
102
|
+
const cfg = runtime.config.loadConfig();
|
|
103
|
+
const account = resolveClawSignalAccount(cfg, accountId);
|
|
104
|
+
if (!account.configured) {
|
|
105
|
+
throw new Error("ClawSignal not configured (missing API key)");
|
|
46
106
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
catch (err) {
|
|
51
|
-
api.logger.error('Error sending ClawSignal message', {
|
|
52
|
-
error: err instanceof Error ? err.message : String(err),
|
|
53
|
-
to
|
|
54
|
-
});
|
|
55
|
-
return false;
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
const handleMessage = async (data) => {
|
|
59
|
-
const pluginConfig = getConfig();
|
|
60
|
-
if (!pluginConfig)
|
|
61
|
-
return;
|
|
62
|
-
if (data.type === 'ping') {
|
|
63
|
-
ws?.send(JSON.stringify({ type: 'pong' }));
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
if (data.type === 'connected') {
|
|
67
|
-
api.logger.info('ClawSignal connection established');
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
if (data.type === 'message' && data.from && data.message) {
|
|
71
|
-
const sessionPrefix = pluginConfig.sessionPrefix || 'clawsignal';
|
|
72
|
-
const sessionKey = `${sessionPrefix}:${data.from}`;
|
|
73
|
-
api.logger.info('Received ClawSignal message', {
|
|
74
|
-
from: data.from,
|
|
75
|
-
sessionKey
|
|
76
|
-
});
|
|
77
|
-
try {
|
|
78
|
-
const cfg = api.config;
|
|
79
|
-
// Build inbound context similar to how channels do it
|
|
80
|
-
const ctx = api.runtime.channel.reply.finalizeInboundContext({
|
|
81
|
-
Body: `[ClawSignal from ${data.from}]: ${data.message}`,
|
|
82
|
-
RawBody: data.message,
|
|
83
|
-
CommandBody: data.message,
|
|
84
|
-
From: `clawsignal:${data.from}`,
|
|
85
|
-
To: 'clawsignal:self',
|
|
86
|
-
SessionKey: sessionKey,
|
|
87
|
-
AccountId: 'default',
|
|
88
|
-
ChatType: 'direct',
|
|
89
|
-
ConversationLabel: data.from,
|
|
90
|
-
SenderName: data.from,
|
|
91
|
-
SenderId: data.from,
|
|
92
|
-
Provider: 'clawsignal',
|
|
93
|
-
Surface: 'clawsignal',
|
|
94
|
-
MessageSid: data.id || `cs-${Date.now()}`,
|
|
95
|
-
Timestamp: data.timestamp || Date.now(),
|
|
96
|
-
OriginatingChannel: 'clawsignal',
|
|
97
|
-
OriginatingTo: `clawsignal:${data.from}`,
|
|
98
|
-
});
|
|
99
|
-
// Collect response
|
|
100
|
-
let responseText = '';
|
|
101
|
-
// Dispatch to agent
|
|
102
|
-
await api.runtime.channel.reply.dispatchReplyFromConfig({
|
|
103
|
-
ctx,
|
|
104
|
-
cfg,
|
|
105
|
-
dispatcher: {
|
|
106
|
-
deliver: (payload) => {
|
|
107
|
-
if (payload.text) {
|
|
108
|
-
responseText += payload.text;
|
|
109
|
-
}
|
|
110
|
-
},
|
|
111
|
-
complete: () => { },
|
|
112
|
-
},
|
|
113
|
-
});
|
|
114
|
-
// Send response back via ClawSignal if enabled
|
|
115
|
-
if (pluginConfig.autoReply !== false && responseText) {
|
|
116
|
-
await sendToClawSignal(data.from, responseText);
|
|
117
|
-
}
|
|
107
|
+
const success = await sendToClawSignal(to, text, account);
|
|
108
|
+
if (!success) {
|
|
109
|
+
throw new Error("Failed to send ClawSignal message");
|
|
118
110
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
111
|
+
return { channel: "clawsignal", to };
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
status: {
|
|
115
|
+
defaultRuntime: {
|
|
116
|
+
accountId: "default",
|
|
117
|
+
running: false,
|
|
118
|
+
lastStartAt: null,
|
|
119
|
+
lastStopAt: null,
|
|
120
|
+
lastError: null,
|
|
121
|
+
},
|
|
122
|
+
buildChannelSummary: ({ snapshot }) => ({
|
|
123
|
+
configured: snapshot.configured ?? false,
|
|
124
|
+
running: snapshot.running ?? false,
|
|
125
|
+
lastStartAt: snapshot.lastStartAt ?? null,
|
|
126
|
+
lastStopAt: snapshot.lastStopAt ?? null,
|
|
127
|
+
lastError: snapshot.lastError ?? null,
|
|
128
|
+
}),
|
|
129
|
+
buildAccountSnapshot: ({ account, runtime }) => ({
|
|
130
|
+
accountId: account.accountId,
|
|
131
|
+
enabled: account.enabled,
|
|
132
|
+
configured: account.configured,
|
|
133
|
+
running: runtime?.running ?? false,
|
|
134
|
+
lastStartAt: runtime?.lastStartAt ?? null,
|
|
135
|
+
lastStopAt: runtime?.lastStopAt ?? null,
|
|
136
|
+
lastError: runtime?.lastError ?? null,
|
|
137
|
+
}),
|
|
138
|
+
},
|
|
139
|
+
gateway: {
|
|
140
|
+
startAccount: async (ctx) => {
|
|
141
|
+
const account = ctx.account;
|
|
142
|
+
const runtime = getRuntime();
|
|
143
|
+
ctx.log?.info(`[${account.accountId}] Starting ClawSignal channel`);
|
|
144
|
+
if (!account.configured || !account.apiKey) {
|
|
145
|
+
throw new Error("ClawSignal API key not configured");
|
|
124
146
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}
|
|
132
|
-
const serverUrl = config.serverUrl || DEFAULT_SERVER_URL;
|
|
133
|
-
const wsUrl = `${serverUrl}/api/v1/events`;
|
|
134
|
-
api.logger.info('Connecting to ClawSignal', { url: wsUrl });
|
|
135
|
-
try {
|
|
136
|
-
ws = new WebSocket(wsUrl, {
|
|
137
|
-
headers: {
|
|
138
|
-
'Authorization': `Bearer ${config.apiKey}`,
|
|
139
|
-
},
|
|
140
|
-
});
|
|
141
|
-
ws.on('open', () => {
|
|
142
|
-
api.logger.info('ClawSignal WebSocket connected');
|
|
143
|
-
if (pingInterval)
|
|
147
|
+
let ws = null;
|
|
148
|
+
let pingInterval = null;
|
|
149
|
+
let reconnectTimeout = null;
|
|
150
|
+
let isShuttingDown = false;
|
|
151
|
+
const cleanup = () => {
|
|
152
|
+
if (pingInterval) {
|
|
144
153
|
clearInterval(pingInterval);
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
154
|
+
pingInterval = null;
|
|
155
|
+
}
|
|
156
|
+
if (ws) {
|
|
157
|
+
ws.removeAllListeners();
|
|
158
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
159
|
+
ws.close();
|
|
148
160
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
161
|
+
ws = null;
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
const connect = () => {
|
|
165
|
+
if (isShuttingDown)
|
|
166
|
+
return;
|
|
167
|
+
const wsUrl = `${account.serverUrl}/api/v1/events`;
|
|
168
|
+
ctx.log?.info(`Connecting to ClawSignal: ${wsUrl}`);
|
|
152
169
|
try {
|
|
153
|
-
|
|
154
|
-
|
|
170
|
+
ws = new WebSocket(wsUrl, {
|
|
171
|
+
headers: { Authorization: `Bearer ${account.apiKey}` },
|
|
172
|
+
});
|
|
173
|
+
ws.on("open", () => {
|
|
174
|
+
ctx.log?.info("ClawSignal WebSocket connected");
|
|
175
|
+
ctx.setStatus({ running: true, lastStartAt: Date.now() });
|
|
176
|
+
if (pingInterval)
|
|
177
|
+
clearInterval(pingInterval);
|
|
178
|
+
pingInterval = setInterval(() => {
|
|
179
|
+
if (ws?.readyState === WebSocket.OPEN) {
|
|
180
|
+
ws.send(JSON.stringify({ type: "ping" }));
|
|
181
|
+
}
|
|
182
|
+
}, PING_INTERVAL_MS);
|
|
183
|
+
});
|
|
184
|
+
ws.on("message", async (rawData) => {
|
|
185
|
+
try {
|
|
186
|
+
const data = JSON.parse(rawData.toString());
|
|
187
|
+
if (data.type === "ping") {
|
|
188
|
+
ws?.send(JSON.stringify({ type: "pong" }));
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
if (data.type === "connected") {
|
|
192
|
+
ctx.log?.info("ClawSignal connection established");
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (data.type === "message" && data.from && data.message) {
|
|
196
|
+
ctx.log?.info(`Received message from ${data.from}`);
|
|
197
|
+
// Use OpenClaw's standard message handling
|
|
198
|
+
await runtime.channel.reply.handleInboundMessage({
|
|
199
|
+
channel: "clawsignal",
|
|
200
|
+
accountId: account.accountId,
|
|
201
|
+
senderId: data.from,
|
|
202
|
+
chatType: "direct",
|
|
203
|
+
chatId: data.from,
|
|
204
|
+
text: data.message,
|
|
205
|
+
reply: async (responseText) => {
|
|
206
|
+
await sendToClawSignal(data.from, responseText, account);
|
|
207
|
+
},
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
ctx.log?.error(`Failed to process ClawSignal message: ${err}`);
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
ws.on("close", (code, reason) => {
|
|
216
|
+
ctx.log?.warn(`ClawSignal WebSocket closed: ${code} ${reason}`);
|
|
217
|
+
cleanup();
|
|
218
|
+
if (!isShuttingDown) {
|
|
219
|
+
ctx.log?.info(`Reconnecting in ${RECONNECT_DELAY_MS / 1000}s`);
|
|
220
|
+
reconnectTimeout = setTimeout(connect, RECONNECT_DELAY_MS);
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
ws.on("error", (err) => {
|
|
224
|
+
ctx.log?.error(`ClawSignal WebSocket error: ${err.message}`);
|
|
225
|
+
ctx.setStatus({ lastError: err.message });
|
|
226
|
+
});
|
|
155
227
|
}
|
|
156
228
|
catch (err) {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
229
|
+
ctx.log?.error(`Failed to create ClawSignal WebSocket: ${err}`);
|
|
230
|
+
if (!isShuttingDown) {
|
|
231
|
+
reconnectTimeout = setTimeout(connect, RECONNECT_DELAY_MS);
|
|
232
|
+
}
|
|
160
233
|
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
api.logger.warn('ClawSignal WebSocket closed', {
|
|
164
|
-
code,
|
|
165
|
-
reason: reason.toString()
|
|
166
|
-
});
|
|
167
|
-
cleanup();
|
|
168
|
-
scheduleReconnect();
|
|
169
|
-
});
|
|
170
|
-
ws.on('error', (err) => {
|
|
171
|
-
api.logger.error('ClawSignal WebSocket error', {
|
|
172
|
-
error: err.message,
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
catch (err) {
|
|
177
|
-
api.logger.error('Failed to create ClawSignal WebSocket', {
|
|
178
|
-
error: err instanceof Error ? err.message : String(err),
|
|
179
|
-
});
|
|
180
|
-
scheduleReconnect();
|
|
181
|
-
}
|
|
182
|
-
};
|
|
183
|
-
const cleanup = () => {
|
|
184
|
-
if (pingInterval) {
|
|
185
|
-
clearInterval(pingInterval);
|
|
186
|
-
pingInterval = null;
|
|
187
|
-
}
|
|
188
|
-
if (ws) {
|
|
189
|
-
ws.removeAllListeners();
|
|
190
|
-
if (ws.readyState === WebSocket.OPEN) {
|
|
191
|
-
ws.close();
|
|
192
|
-
}
|
|
193
|
-
ws = null;
|
|
194
|
-
}
|
|
195
|
-
};
|
|
196
|
-
const scheduleReconnect = () => {
|
|
197
|
-
if (isShuttingDown)
|
|
198
|
-
return;
|
|
199
|
-
if (reconnectTimeout) {
|
|
200
|
-
clearTimeout(reconnectTimeout);
|
|
201
|
-
}
|
|
202
|
-
api.logger.info(`Reconnecting to ClawSignal in ${RECONNECT_DELAY_MS / 1000}s`);
|
|
203
|
-
reconnectTimeout = setTimeout(() => {
|
|
204
|
-
reconnectTimeout = null;
|
|
234
|
+
};
|
|
235
|
+
// Start connection
|
|
205
236
|
connect();
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
}
|
|
220
|
-
},
|
|
221
|
-
stop: () => {
|
|
222
|
-
isShuttingDown = true;
|
|
223
|
-
if (reconnectTimeout) {
|
|
224
|
-
clearTimeout(reconnectTimeout);
|
|
225
|
-
reconnectTimeout = null;
|
|
226
|
-
}
|
|
227
|
-
cleanup();
|
|
228
|
-
api.logger.info('ClawSignal listener stopped');
|
|
229
|
-
},
|
|
230
|
-
});
|
|
231
|
-
// Register RPC method for status
|
|
232
|
-
api.registerGatewayMethod('clawsignal.status', ({ respond }) => {
|
|
233
|
-
const config = getConfig();
|
|
234
|
-
respond(true, {
|
|
235
|
-
configured: !!config,
|
|
236
|
-
connected: ws?.readyState === WebSocket.OPEN,
|
|
237
|
-
serverUrl: config?.serverUrl || DEFAULT_SERVER_URL,
|
|
238
|
-
});
|
|
239
|
-
});
|
|
240
|
-
// Register tool for sending messages
|
|
241
|
-
api.registerTool({
|
|
242
|
-
name: 'clawsignal_send',
|
|
243
|
-
description: 'Send a message to another agent via ClawSignal',
|
|
244
|
-
parameters: {
|
|
245
|
-
type: 'object',
|
|
246
|
-
required: ['to', 'message'],
|
|
247
|
-
properties: {
|
|
248
|
-
to: {
|
|
249
|
-
type: 'string',
|
|
250
|
-
description: 'The recipient agent name on ClawSignal',
|
|
237
|
+
// Store connection state
|
|
238
|
+
activeConnections.set(account.accountId, { ws, pingInterval, reconnectTimeout });
|
|
239
|
+
// Return cleanup function
|
|
240
|
+
return {
|
|
241
|
+
stop: () => {
|
|
242
|
+
isShuttingDown = true;
|
|
243
|
+
if (reconnectTimeout) {
|
|
244
|
+
clearTimeout(reconnectTimeout);
|
|
245
|
+
reconnectTimeout = null;
|
|
246
|
+
}
|
|
247
|
+
cleanup();
|
|
248
|
+
activeConnections.delete(account.accountId);
|
|
249
|
+
ctx.log?.info(`[${account.accountId}] ClawSignal channel stopped`);
|
|
251
250
|
},
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
251
|
+
};
|
|
252
|
+
},
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
// Plugin definition
|
|
256
|
+
const plugin = {
|
|
257
|
+
id: "clawsignal",
|
|
258
|
+
name: "ClawSignal",
|
|
259
|
+
version: "0.3.0",
|
|
260
|
+
description: "Real-time messaging between AI agents via ClawSignal",
|
|
261
|
+
configSchema: {
|
|
262
|
+
type: "object",
|
|
263
|
+
additionalProperties: false,
|
|
264
|
+
properties: {},
|
|
265
|
+
},
|
|
266
|
+
register(api) {
|
|
267
|
+
setRuntime(api.runtime);
|
|
268
|
+
// Register as a channel
|
|
269
|
+
api.registerChannel({ plugin: clawsignalChannel });
|
|
270
|
+
// Register send tool
|
|
271
|
+
api.registerTool({
|
|
272
|
+
name: "clawsignal_send",
|
|
273
|
+
description: "Send a message to another agent via ClawSignal",
|
|
274
|
+
parameters: {
|
|
275
|
+
type: "object",
|
|
276
|
+
required: ["to", "message"],
|
|
277
|
+
properties: {
|
|
278
|
+
to: { type: "string", description: "The recipient agent name" },
|
|
279
|
+
message: { type: "string", description: "The message to send" },
|
|
255
280
|
},
|
|
256
281
|
},
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
}
|
|
282
|
+
async execute(_id, params) {
|
|
283
|
+
const runtime = getRuntime();
|
|
284
|
+
const cfg = runtime.config.loadConfig();
|
|
285
|
+
const account = resolveClawSignalAccount(cfg);
|
|
286
|
+
if (!account.configured) {
|
|
287
|
+
return {
|
|
288
|
+
content: [{ type: "text", text: "ClawSignal not configured" }],
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
const success = await sendToClawSignal(params.to, params.message, account);
|
|
292
|
+
return {
|
|
293
|
+
content: [{
|
|
294
|
+
type: "text",
|
|
295
|
+
text: success
|
|
296
|
+
? `Message sent to ${params.to}`
|
|
297
|
+
: `Failed to send message to ${params.to}`,
|
|
298
|
+
}],
|
|
299
|
+
};
|
|
300
|
+
},
|
|
301
|
+
});
|
|
302
|
+
// Register status RPC
|
|
303
|
+
api.registerGatewayMethod("clawsignal.status", ({ respond }) => {
|
|
304
|
+
const runtime = getRuntime();
|
|
305
|
+
const cfg = runtime.config.loadConfig();
|
|
306
|
+
const account = resolveClawSignalAccount(cfg);
|
|
307
|
+
const conn = activeConnections.get(account.accountId);
|
|
308
|
+
respond(true, {
|
|
309
|
+
configured: account.configured,
|
|
310
|
+
connected: conn?.ws?.readyState === WebSocket.OPEN,
|
|
311
|
+
serverUrl: account.serverUrl,
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
api.logger.info("ClawSignal plugin registered");
|
|
315
|
+
},
|
|
316
|
+
};
|
|
317
|
+
export default plugin;
|
|
266
318
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,SAAS,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/openclaw.plugin.json
CHANGED
|
@@ -1,50 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "clawsignal",
|
|
3
3
|
"name": "ClawSignal",
|
|
4
|
-
"version": "0.
|
|
5
|
-
"description": "
|
|
4
|
+
"version": "0.3.0",
|
|
5
|
+
"description": "Real-time messaging between AI agents via ClawSignal",
|
|
6
6
|
"author": "ClawSignal",
|
|
7
7
|
"configSchema": {
|
|
8
8
|
"type": "object",
|
|
9
9
|
"additionalProperties": false,
|
|
10
|
-
"
|
|
11
|
-
"properties": {
|
|
12
|
-
"apiKey": {
|
|
13
|
-
"type": "string",
|
|
14
|
-
"description": "Your ClawSignal API key (starts with clawsig_)"
|
|
15
|
-
},
|
|
16
|
-
"serverUrl": {
|
|
17
|
-
"type": "string",
|
|
18
|
-
"description": "ClawSignal server URL (default: wss://clawsignal.com)",
|
|
19
|
-
"default": "wss://clawsignal.com"
|
|
20
|
-
},
|
|
21
|
-
"autoReply": {
|
|
22
|
-
"type": "boolean",
|
|
23
|
-
"description": "Automatically send agent responses back via ClawSignal",
|
|
24
|
-
"default": true
|
|
25
|
-
},
|
|
26
|
-
"sessionPrefix": {
|
|
27
|
-
"type": "string",
|
|
28
|
-
"description": "Prefix for session keys",
|
|
29
|
-
"default": "clawsignal"
|
|
30
|
-
}
|
|
31
|
-
}
|
|
10
|
+
"properties": {}
|
|
32
11
|
},
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
"
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
"
|
|
44
|
-
|
|
45
|
-
},
|
|
46
|
-
"sessionPrefix": {
|
|
47
|
-
"label": "Session Prefix"
|
|
48
|
-
}
|
|
12
|
+
"channel": {
|
|
13
|
+
"id": "clawsignal",
|
|
14
|
+
"label": "ClawSignal",
|
|
15
|
+
"selectionLabel": "ClawSignal (Agent Messaging)",
|
|
16
|
+
"docsPath": "/channels/clawsignal",
|
|
17
|
+
"docsLabel": "clawsignal",
|
|
18
|
+
"blurb": "Real-time messaging between AI agents",
|
|
19
|
+
"order": 110
|
|
20
|
+
},
|
|
21
|
+
"install": {
|
|
22
|
+
"npmSpec": "@clawsignal/clawsignal",
|
|
23
|
+
"defaultChoice": "npm"
|
|
49
24
|
}
|
|
50
25
|
}
|