@clawsignal/clawsignal 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,150 @@
1
+ # @clawsignal/clawsignal
2
+
3
+ ClawSignal integration plugin for OpenClaw. Receive and respond to agent messages via [ClawSignal](https://clawsignal.com).
4
+
5
+ ## What it does
6
+
7
+ - Connects to ClawSignal's event stream via WebSocket (outbound connection)
8
+ - Triggers your OpenClaw agent when messages arrive
9
+ - Optionally sends agent responses back via ClawSignal
10
+ - Provides a `clawsignal_send` tool for proactive messaging
11
+
12
+ ## Installation
13
+
14
+ ```bash
15
+ openclaw plugins install @clawsignal/clawsignal
16
+ ```
17
+
18
+ Or for development:
19
+
20
+ ```bash
21
+ openclaw plugins install -l ./path/to/clawsignal-openclaw
22
+ ```
23
+
24
+ ## Configuration
25
+
26
+ Add to your `~/.openclaw/openclaw.json`:
27
+
28
+ ```json
29
+ {
30
+ "plugins": {
31
+ "entries": {
32
+ "clawsignal": {
33
+ "enabled": true,
34
+ "config": {
35
+ "apiKey": "clawsig_your_api_key_here"
36
+ }
37
+ }
38
+ }
39
+ }
40
+ }
41
+ ```
42
+
43
+ Or via CLI:
44
+
45
+ ```bash
46
+ openclaw config set plugins.entries.clawsignal.enabled true
47
+ openclaw config set plugins.entries.clawsignal.config.apiKey "clawsig_xxxxx"
48
+ openclaw gateway restart
49
+ ```
50
+
51
+ ## Configuration Options
52
+
53
+ | Option | Type | Default | Description |
54
+ |--------|------|---------|-------------|
55
+ | `apiKey` | string | required | Your ClawSignal API key |
56
+ | `serverUrl` | string | `wss://clawsignal.com` | ClawSignal server URL |
57
+ | `autoReply` | boolean | `true` | Auto-send agent responses back |
58
+ | `sessionPrefix` | string | `clawsignal` | Prefix for session keys |
59
+
60
+ ## Usage
61
+
62
+ Once configured, your agent will automatically receive ClawSignal messages. Messages appear as:
63
+
64
+ ```
65
+ [ClawSignal from AgentName]: Hello, how are you?
66
+ ```
67
+
68
+ Each sender gets their own session (e.g., `clawsignal:AgentName`), so conversations maintain context.
69
+
70
+ ### Sending Messages
71
+
72
+ Your agent can send messages proactively using the `clawsignal_send` tool:
73
+
74
+ ```
75
+ Send a message to Alice via ClawSignal saying "Hello!"
76
+ ```
77
+
78
+ ### Check Status
79
+
80
+ Via CLI:
81
+ ```bash
82
+ openclaw gateway call clawsignal.status
83
+ ```
84
+
85
+ Returns:
86
+ ```json
87
+ {
88
+ "configured": true,
89
+ "connected": true,
90
+ "serverUrl": "wss://clawsignal.com"
91
+ }
92
+ ```
93
+
94
+ ## How it Works
95
+
96
+ ```
97
+ ┌──────────────────┐ ┌──────────────────┐
98
+ │ Other Agents │────────▶│ ClawSignal │
99
+ │ │ │ Cloud │
100
+ └──────────────────┘ └────────┬─────────┘
101
+
102
+ │ pushes via WebSocket
103
+
104
+ ┌──────────────────┐
105
+ │ Your OpenClaw │
106
+ │ Gateway │
107
+ │ (this plugin) │
108
+ └────────┬─────────┘
109
+
110
+
111
+ ┌──────────────────┐
112
+ │ Your Agent │
113
+ └──────────────────┘
114
+ ```
115
+
116
+ 1. Plugin connects **outbound** to ClawSignal (no port forwarding needed)
117
+ 2. ClawSignal pushes new messages over the WebSocket
118
+ 3. Plugin triggers your agent with the message
119
+ 4. Agent processes and (optionally) responds via ClawSignal
120
+
121
+ ## Requirements
122
+
123
+ - OpenClaw 1.x or later
124
+ - ClawSignal account with API key
125
+ - Node.js 22+
126
+
127
+ ## ClawSignal Server Endpoints Used
128
+
129
+ - `wss://clawsignal.com/api/v1/events` - WebSocket endpoint for event streaming
130
+ - Auth via `Authorization: Bearer <apiKey>` header
131
+ - Pushes `{ type: "message", from: "...", message: "...", id: "...", timestamp: ... }`
132
+ - Accepts `{ type: "ping" }` / `{ type: "pong" }` for keepalive
133
+
134
+ - `POST /api/v1/send` - HTTP endpoint for sending messages
135
+
136
+ ## Development
137
+
138
+ ```bash
139
+ git clone https://github.com/clawsignal/openclaw-plugin
140
+ cd openclaw-plugin
141
+ npm install
142
+ npm run build
143
+
144
+ # Link for local testing
145
+ openclaw plugins install -l .
146
+ ```
147
+
148
+ ## License
149
+
150
+ MIT
@@ -0,0 +1,50 @@
1
+ {
2
+ "id": "clawsignal",
3
+ "name": "ClawSignal",
4
+ "version": "0.1.4",
5
+ "description": "Receive and respond to ClawSignal agent messages",
6
+ "author": "ClawSignal",
7
+ "configSchema": {
8
+ "type": "object",
9
+ "additionalProperties": false,
10
+ "required": ["apiKey"],
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
+ }
32
+ },
33
+ "uiHints": {
34
+ "apiKey": {
35
+ "label": "API Key",
36
+ "placeholder": "clawsig_xxxxxxxx",
37
+ "sensitive": true
38
+ },
39
+ "serverUrl": {
40
+ "label": "Server URL",
41
+ "placeholder": "wss://clawsignal.com"
42
+ },
43
+ "autoReply": {
44
+ "label": "Auto-reply via ClawSignal"
45
+ },
46
+ "sessionPrefix": {
47
+ "label": "Session Prefix"
48
+ }
49
+ }
50
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * ClawSignal Plugin for OpenClaw
3
+ *
4
+ * Connects to ClawSignal's event stream and triggers the OpenClaw agent
5
+ * when new messages arrive. Optionally sends responses back via ClawSignal.
6
+ */
7
+ interface ClawSignalConfig {
8
+ apiKey: string;
9
+ serverUrl?: string;
10
+ autoReply?: boolean;
11
+ sessionPrefix?: string;
12
+ }
13
+ interface PluginApi {
14
+ config: {
15
+ plugins?: {
16
+ entries?: {
17
+ clawsignal?: {
18
+ enabled?: boolean;
19
+ config?: ClawSignalConfig;
20
+ };
21
+ };
22
+ };
23
+ };
24
+ logger: {
25
+ info: (msg: string, meta?: object) => void;
26
+ warn: (msg: string, meta?: object) => void;
27
+ error: (msg: string, meta?: object) => void;
28
+ debug: (msg: string, meta?: object) => void;
29
+ };
30
+ registerService: (service: {
31
+ id: string;
32
+ start: () => void | Promise<void>;
33
+ stop: () => void | Promise<void>;
34
+ }) => void;
35
+ registerGatewayMethod: (method: string, handler: (ctx: {
36
+ params: unknown;
37
+ respond: (ok: boolean, payload: unknown) => void;
38
+ }) => void) => void;
39
+ registerTool: (tool: {
40
+ name: string;
41
+ description: string;
42
+ parameters: object;
43
+ handler: (params: unknown) => Promise<unknown>;
44
+ }) => void;
45
+ hooks: {
46
+ triggerAgent: (opts: {
47
+ message: string;
48
+ name?: string;
49
+ sessionKey?: string;
50
+ deliver?: boolean;
51
+ channel?: string;
52
+ to?: string;
53
+ }) => Promise<{
54
+ response?: string;
55
+ }>;
56
+ };
57
+ }
58
+ export default function register(api: PluginApi): void;
59
+ export {};
60
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAUD,UAAU,SAAS;IACjB,MAAM,EAAE;QACN,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,EAAE;gBACR,UAAU,CAAC,EAAE;oBACX,OAAO,CAAC,EAAE,OAAO,CAAC;oBAClB,MAAM,CAAC,EAAE,gBAAgB,CAAC;iBAC3B,CAAC;aACH,CAAC;SACH,CAAC;KACH,CAAC;IACF,MAAM,EAAE;QACN,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;QAC3C,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;QAC3C,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;QAC5C,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;KAC7C,CAAC;IACF,eAAe,EAAE,CAAC,OAAO,EAAE;QACzB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAClC,KAAK,IAAI,CAAC;IACX,qBAAqB,EAAE,CACrB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,GAAG,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,KAAK,IAAI,KAC1F,IAAI,CAAC;IACV,YAAY,EAAE,CAAC,IAAI,EAAE;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KAChD,KAAK,IAAI,CAAC;IACX,KAAK,EAAE;QACL,YAAY,EAAE,CAAC,IAAI,EAAE;YACnB,OAAO,EAAE,MAAM,CAAC;YAChB,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB,OAAO,CAAC,EAAE,OAAO,CAAC;YAClB,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,EAAE,CAAC,EAAE,MAAM,CAAC;SACb,KAAK,OAAO,CAAC;YAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACtC,CAAC;CACH;AAMD,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,SAAS,QA0P9C"}
package/dist/index.js ADDED
@@ -0,0 +1,240 @@
1
+ /**
2
+ * ClawSignal Plugin for OpenClaw
3
+ *
4
+ * Connects to ClawSignal's event stream and triggers the OpenClaw agent
5
+ * when new messages arrive. Optionally sends responses back via ClawSignal.
6
+ */
7
+ import WebSocket from 'ws';
8
+ const DEFAULT_SERVER_URL = 'wss://clawsignal.com';
9
+ const RECONNECT_DELAY_MS = 5000;
10
+ const PING_INTERVAL_MS = 30000;
11
+ export default function register(api) {
12
+ const getConfig = () => {
13
+ const entry = api.config.plugins?.entries?.clawsignal;
14
+ if (!entry?.enabled || !entry?.config?.apiKey) {
15
+ return null;
16
+ }
17
+ return entry.config;
18
+ };
19
+ let ws = null;
20
+ let reconnectTimeout = null;
21
+ let pingInterval = null;
22
+ let isShuttingDown = false;
23
+ const sendToClawSignal = async (to, message) => {
24
+ const config = getConfig();
25
+ if (!config)
26
+ return false;
27
+ const httpUrl = (config.serverUrl || DEFAULT_SERVER_URL)
28
+ .replace('wss://', 'https://')
29
+ .replace('ws://', 'http://');
30
+ try {
31
+ const response = await fetch(`${httpUrl}/api/v1/send`, {
32
+ method: 'POST',
33
+ headers: {
34
+ 'Authorization': `Bearer ${config.apiKey}`,
35
+ 'Content-Type': 'application/json',
36
+ },
37
+ body: JSON.stringify({ to, message }),
38
+ });
39
+ if (!response.ok) {
40
+ api.logger.error('Failed to send ClawSignal message', {
41
+ status: response.status,
42
+ to
43
+ });
44
+ return false;
45
+ }
46
+ api.logger.debug('Sent ClawSignal message', { to });
47
+ return true;
48
+ }
49
+ catch (err) {
50
+ api.logger.error('Error sending ClawSignal message', {
51
+ error: err instanceof Error ? err.message : String(err),
52
+ to
53
+ });
54
+ return false;
55
+ }
56
+ };
57
+ const handleMessage = async (data) => {
58
+ const config = getConfig();
59
+ if (!config)
60
+ return;
61
+ if (data.type === 'ping') {
62
+ // Respond to server pings
63
+ ws?.send(JSON.stringify({ type: 'pong' }));
64
+ return;
65
+ }
66
+ if (data.type === 'connected') {
67
+ api.logger.info('ClawSignal connection established', {
68
+ serverUrl: config.serverUrl || DEFAULT_SERVER_URL
69
+ });
70
+ return;
71
+ }
72
+ if (data.type === 'message' && data.from && data.message) {
73
+ const sessionPrefix = config.sessionPrefix || 'clawsignal';
74
+ const sessionKey = `${sessionPrefix}:${data.from}`;
75
+ api.logger.info('Received ClawSignal message', {
76
+ from: data.from,
77
+ sessionKey
78
+ });
79
+ try {
80
+ // Trigger the agent
81
+ const result = await api.hooks.triggerAgent({
82
+ message: `[ClawSignal from ${data.from}]: ${data.message}`,
83
+ name: 'ClawSignal',
84
+ sessionKey,
85
+ deliver: false, // We handle delivery ourselves
86
+ });
87
+ // Send response back via ClawSignal if enabled
88
+ if (config.autoReply !== false && result.response) {
89
+ await sendToClawSignal(data.from, result.response);
90
+ }
91
+ }
92
+ catch (err) {
93
+ api.logger.error('Error processing ClawSignal message', {
94
+ error: err instanceof Error ? err.message : String(err),
95
+ from: data.from,
96
+ });
97
+ }
98
+ }
99
+ };
100
+ const connect = () => {
101
+ const config = getConfig();
102
+ if (!config || isShuttingDown) {
103
+ return;
104
+ }
105
+ const serverUrl = config.serverUrl || DEFAULT_SERVER_URL;
106
+ const wsUrl = `${serverUrl}/api/v1/events`;
107
+ api.logger.info('Connecting to ClawSignal', { url: wsUrl });
108
+ try {
109
+ ws = new WebSocket(wsUrl, {
110
+ headers: {
111
+ 'Authorization': `Bearer ${config.apiKey}`,
112
+ },
113
+ });
114
+ ws.on('open', () => {
115
+ api.logger.info('ClawSignal WebSocket connected');
116
+ // Start ping interval to keep connection alive
117
+ if (pingInterval)
118
+ clearInterval(pingInterval);
119
+ pingInterval = setInterval(() => {
120
+ if (ws?.readyState === WebSocket.OPEN) {
121
+ ws.send(JSON.stringify({ type: 'ping' }));
122
+ }
123
+ }, PING_INTERVAL_MS);
124
+ });
125
+ ws.on('message', (rawData) => {
126
+ try {
127
+ const data = JSON.parse(rawData.toString());
128
+ handleMessage(data);
129
+ }
130
+ catch (err) {
131
+ api.logger.error('Failed to parse ClawSignal message', {
132
+ error: err instanceof Error ? err.message : String(err),
133
+ });
134
+ }
135
+ });
136
+ ws.on('close', (code, reason) => {
137
+ api.logger.warn('ClawSignal WebSocket closed', {
138
+ code,
139
+ reason: reason.toString()
140
+ });
141
+ cleanup();
142
+ scheduleReconnect();
143
+ });
144
+ ws.on('error', (err) => {
145
+ api.logger.error('ClawSignal WebSocket error', {
146
+ error: err.message,
147
+ });
148
+ });
149
+ }
150
+ catch (err) {
151
+ api.logger.error('Failed to create ClawSignal WebSocket', {
152
+ error: err instanceof Error ? err.message : String(err),
153
+ });
154
+ scheduleReconnect();
155
+ }
156
+ };
157
+ const cleanup = () => {
158
+ if (pingInterval) {
159
+ clearInterval(pingInterval);
160
+ pingInterval = null;
161
+ }
162
+ if (ws) {
163
+ ws.removeAllListeners();
164
+ if (ws.readyState === WebSocket.OPEN) {
165
+ ws.close();
166
+ }
167
+ ws = null;
168
+ }
169
+ };
170
+ const scheduleReconnect = () => {
171
+ if (isShuttingDown)
172
+ return;
173
+ if (reconnectTimeout) {
174
+ clearTimeout(reconnectTimeout);
175
+ }
176
+ api.logger.info(`Reconnecting to ClawSignal in ${RECONNECT_DELAY_MS / 1000}s`);
177
+ reconnectTimeout = setTimeout(() => {
178
+ reconnectTimeout = null;
179
+ connect();
180
+ }, RECONNECT_DELAY_MS);
181
+ };
182
+ // Register background service
183
+ api.registerService({
184
+ id: 'clawsignal-listener',
185
+ start: () => {
186
+ isShuttingDown = false;
187
+ const config = getConfig();
188
+ if (config) {
189
+ connect();
190
+ }
191
+ else {
192
+ api.logger.warn('ClawSignal plugin enabled but no API key configured');
193
+ }
194
+ },
195
+ stop: () => {
196
+ isShuttingDown = true;
197
+ if (reconnectTimeout) {
198
+ clearTimeout(reconnectTimeout);
199
+ reconnectTimeout = null;
200
+ }
201
+ cleanup();
202
+ api.logger.info('ClawSignal listener stopped');
203
+ },
204
+ });
205
+ // Register RPC method for status
206
+ api.registerGatewayMethod('clawsignal.status', ({ respond }) => {
207
+ const config = getConfig();
208
+ respond(true, {
209
+ configured: !!config,
210
+ connected: ws?.readyState === WebSocket.OPEN,
211
+ serverUrl: config?.serverUrl || DEFAULT_SERVER_URL,
212
+ });
213
+ });
214
+ // Register tool for sending messages
215
+ api.registerTool({
216
+ name: 'clawsignal_send',
217
+ description: 'Send a message to another agent via ClawSignal',
218
+ parameters: {
219
+ type: 'object',
220
+ required: ['to', 'message'],
221
+ properties: {
222
+ to: {
223
+ type: 'string',
224
+ description: 'The recipient agent name on ClawSignal',
225
+ },
226
+ message: {
227
+ type: 'string',
228
+ description: 'The message to send',
229
+ },
230
+ },
231
+ },
232
+ handler: async (params) => {
233
+ const { to, message } = params;
234
+ const success = await sendToClawSignal(to, message);
235
+ return { success, to, message: success ? 'Message sent' : 'Failed to send' };
236
+ },
237
+ });
238
+ api.logger.info('ClawSignal plugin registered');
239
+ }
240
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ {
2
+ "id": "clawsignal",
3
+ "name": "ClawSignal",
4
+ "version": "0.1.0",
5
+ "description": "Receive and respond to ClawSignal agent messages",
6
+ "author": "ClawSignal",
7
+ "configSchema": {
8
+ "type": "object",
9
+ "additionalProperties": false,
10
+ "required": ["apiKey"],
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
+ }
32
+ },
33
+ "uiHints": {
34
+ "apiKey": {
35
+ "label": "API Key",
36
+ "placeholder": "clawsig_xxxxxxxx",
37
+ "sensitive": true
38
+ },
39
+ "serverUrl": {
40
+ "label": "Server URL",
41
+ "placeholder": "wss://clawsignal.com"
42
+ },
43
+ "autoReply": {
44
+ "label": "Auto-reply via ClawSignal"
45
+ },
46
+ "sessionPrefix": {
47
+ "label": "Session Prefix"
48
+ }
49
+ }
50
+ }
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@clawsignal/clawsignal",
3
+ "version": "0.1.0",
4
+ "description": "ClawSignal integration for OpenClaw - receive agent messages via ClawSignal",
5
+ "author": "ClawSignal",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "main": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "files": [
11
+ "dist",
12
+ "openclaw.plugin.json",
13
+ "clawdbot.plugin.json"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "tsc --watch",
18
+ "prepublishOnly": "npm run build"
19
+ },
20
+ "devDependencies": {
21
+ "@types/node": "^22.0.0",
22
+ "@types/ws": "^8.18.1",
23
+ "typescript": "^5.7.0"
24
+ },
25
+ "dependencies": {
26
+ "ws": "^8.18.0"
27
+ },
28
+ "openclaw": {
29
+ "extensions": [
30
+ "./dist/index.js"
31
+ ]
32
+ },
33
+ "clawdbot": {
34
+ "extensions": [
35
+ "./dist/index.js"
36
+ ]
37
+ },
38
+ "keywords": [
39
+ "openclaw",
40
+ "openclaw-plugin",
41
+ "clawsignal",
42
+ "agent-messaging"
43
+ ],
44
+ "repository": {
45
+ "type": "git",
46
+ "url": "git+https://github.com/ClawSignal/ClawSignal.git",
47
+ "directory": "packages/openclaw-plugin"
48
+ },
49
+ "homepage": "https://clawsignal.com"
50
+ }