atxp 1.23.2 → 1.24.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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/commands/notifications.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/commands/notifications.ts"],"names":[],"mappings":"AAsLA,wBAAsB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAe5E"}
|
|
@@ -3,71 +3,70 @@ import fs from 'fs/promises';
|
|
|
3
3
|
import os from 'os';
|
|
4
4
|
import { execSync } from 'child_process';
|
|
5
5
|
const NOTIFICATIONS_BASE_URL = 'https://clowdbot-notifications.corp.circuitandchisel.com';
|
|
6
|
+
const OPENCLAW_CONFIG_PATH = '/data/.openclaw/openclaw.json';
|
|
7
|
+
const SESSIONS_PATH = '/data/.openclaw/agents/main/sessions/sessions.json';
|
|
8
|
+
// eslint-disable-next-line no-control-regex
|
|
9
|
+
const sanitizeSessionValue = (s) => s.replace(/[\x00-\x1f"`[\]]/g, '');
|
|
6
10
|
/**
|
|
7
|
-
*
|
|
11
|
+
* Discover connected messaging channels by reading the local session store.
|
|
12
|
+
* Parses session keys like "agent:main:telegram:direct:8204320066" to extract
|
|
13
|
+
* the channel type and peer ID for each active DM session.
|
|
14
|
+
*/
|
|
15
|
+
async function discoverConnectedChannels() {
|
|
16
|
+
try {
|
|
17
|
+
const raw = await fs.readFile(SESSIONS_PATH, 'utf-8');
|
|
18
|
+
const sessions = JSON.parse(raw);
|
|
19
|
+
const channels = [];
|
|
20
|
+
const seen = new Set();
|
|
21
|
+
for (const key of Object.keys(sessions)) {
|
|
22
|
+
// Match DM session keys: agent:main:<channel>:direct:<peerId>
|
|
23
|
+
const match = key.match(/^agent:main:([^:]+):direct:(.+)$/);
|
|
24
|
+
if (!match)
|
|
25
|
+
continue;
|
|
26
|
+
const channel = sanitizeSessionValue(match[1]).slice(0, 64);
|
|
27
|
+
const to = sanitizeSessionValue(match[2]).slice(0, 128);
|
|
28
|
+
if (!channel || !to)
|
|
29
|
+
continue;
|
|
30
|
+
// Skip ephemeral channels (webchat has no persistent address)
|
|
31
|
+
if (channel === 'webchat')
|
|
32
|
+
continue;
|
|
33
|
+
const dedupKey = `${channel}:${to}`;
|
|
34
|
+
if (seen.has(dedupKey))
|
|
35
|
+
continue;
|
|
36
|
+
seen.add(dedupKey);
|
|
37
|
+
channels.push({ channel, to });
|
|
38
|
+
}
|
|
39
|
+
return channels;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return []; // sessions file may not exist yet
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Configure hooks token on the instance.
|
|
8
47
|
* Only runs when inside a Fly instance (FLY_MACHINE_ID is set).
|
|
9
|
-
*
|
|
48
|
+
* Sets hooks.enabled and hooks.token in openclaw.json, restarts gateway if changed.
|
|
10
49
|
*/
|
|
11
50
|
async function configureHooksOnInstance(hooksToken) {
|
|
12
51
|
if (!process.env.FLY_MACHINE_ID)
|
|
13
52
|
return;
|
|
14
|
-
const configPath = '/data/.openclaw/openclaw.json';
|
|
15
53
|
try {
|
|
16
|
-
const raw = await fs.readFile(
|
|
54
|
+
const raw = await fs.readFile(OPENCLAW_CONFIG_PATH, 'utf-8');
|
|
17
55
|
const config = JSON.parse(raw);
|
|
18
56
|
if (!config.hooks)
|
|
19
57
|
config.hooks = {};
|
|
20
|
-
// Already configured with this token — skip
|
|
21
58
|
if (config.hooks.token === hooksToken && config.hooks.enabled === true)
|
|
22
59
|
return;
|
|
23
60
|
config.hooks.enabled = true;
|
|
24
61
|
config.hooks.token = hooksToken;
|
|
25
|
-
await fs.writeFile(
|
|
26
|
-
console.log(chalk.gray('Hooks configured in openclaw.json'));
|
|
27
|
-
// Restart gateway to pick up new config (watchdog auto-restarts it)
|
|
62
|
+
await fs.writeFile(OPENCLAW_CONFIG_PATH, JSON.stringify(config, null, 2));
|
|
28
63
|
try {
|
|
29
64
|
execSync('pkill -f openclaw-gateway', { stdio: 'ignore' });
|
|
30
|
-
console.log(chalk.gray('Gateway restarting to apply hooks config...'));
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
// Gateway may not be running yet — config will be picked up on next start
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
catch {
|
|
37
|
-
// Non-fatal — hooks will be configured on next reboot via entrypoint config sync
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Send a one-time instruction to the agent via /hooks/wake so it saves
|
|
42
|
-
* notification handling instructions to its HEARTBEAT.md file.
|
|
43
|
-
*
|
|
44
|
-
* Trust boundary: This intentionally injects a system-level prompt into the
|
|
45
|
-
* agent's memory. The webhook endpoint MUST validate the Authorization header
|
|
46
|
-
* before acting on the message content. The hardcoded text is controlled by us
|
|
47
|
-
* (not user input) and tells the agent how to broadcast notifications.
|
|
48
|
-
*/
|
|
49
|
-
async function sendHeartbeatInstruction(webhookUrl, hooksToken) {
|
|
50
|
-
try {
|
|
51
|
-
const res = await fetch(webhookUrl, {
|
|
52
|
-
method: 'POST',
|
|
53
|
-
headers: {
|
|
54
|
-
'Content-Type': 'application/json',
|
|
55
|
-
'Authorization': `Bearer ${hooksToken}`,
|
|
56
|
-
},
|
|
57
|
-
body: JSON.stringify({
|
|
58
|
-
text: 'SYSTEM: Push notifications are now enabled. When you receive a system event about a new email, proactively use the message tool to broadcast the notification to every connected channel. Check your available tools, find all messaging channels, and send the notification to each one individually. The goal is that the owner sees the notification regardless of which channel they are watching.',
|
|
59
|
-
mode: 'now',
|
|
60
|
-
}),
|
|
61
|
-
});
|
|
62
|
-
if (!res.ok) {
|
|
63
|
-
console.log(chalk.gray(`Note: Setup instruction returned HTTP ${res.status} — agent may not have received it.`));
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
console.log(chalk.gray('Notification instructions sent to your agent.'));
|
|
67
65
|
}
|
|
66
|
+
catch { /* gateway may not be running */ }
|
|
68
67
|
}
|
|
69
|
-
catch {
|
|
70
|
-
console.
|
|
68
|
+
catch (err) {
|
|
69
|
+
console.error(chalk.red(`Error configuring instance: ${err instanceof Error ? err.message : err}`));
|
|
71
70
|
}
|
|
72
71
|
}
|
|
73
72
|
function getMachineId() {
|
|
@@ -83,9 +82,14 @@ function getMachineId() {
|
|
|
83
82
|
return undefined;
|
|
84
83
|
}
|
|
85
84
|
async function getAccountId() {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
85
|
+
try {
|
|
86
|
+
const { getAccountInfo } = await import('./whoami.js');
|
|
87
|
+
const account = await getAccountInfo();
|
|
88
|
+
return account?.accountId;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
89
93
|
}
|
|
90
94
|
async function enableNotifications() {
|
|
91
95
|
const machineId = getMachineId();
|
|
@@ -95,16 +99,28 @@ async function enableNotifications() {
|
|
|
95
99
|
process.exit(1);
|
|
96
100
|
}
|
|
97
101
|
console.log(chalk.gray('Enabling push notifications...'));
|
|
102
|
+
// Discover connected channels for delivery targeting
|
|
103
|
+
const channels = await discoverConnectedChannels();
|
|
98
104
|
// Resolve account ID for event matching
|
|
99
105
|
const accountId = await getAccountId();
|
|
100
106
|
const body = { machine_id: machineId };
|
|
101
107
|
if (accountId)
|
|
102
108
|
body.account_id = accountId;
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
109
|
+
if (channels.length > 0)
|
|
110
|
+
body.channels = channels;
|
|
111
|
+
let res;
|
|
112
|
+
try {
|
|
113
|
+
res = await fetch(`${NOTIFICATIONS_BASE_URL}/notifications/enable`, {
|
|
114
|
+
method: 'POST',
|
|
115
|
+
headers: { 'Content-Type': 'application/json' },
|
|
116
|
+
body: JSON.stringify(body),
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
console.error(chalk.red(`Error: Could not reach notifications service.`));
|
|
121
|
+
console.error(chalk.gray(`${err instanceof Error ? err.message : err}`));
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
108
124
|
const data = await res.json().catch(() => ({}));
|
|
109
125
|
if (!res.ok) {
|
|
110
126
|
console.error(chalk.red(`Error: ${data.error || res.statusText}`));
|
|
@@ -122,14 +138,15 @@ async function enableNotifications() {
|
|
|
122
138
|
console.log(' ' + chalk.bold('ID:') + ' ' + (webhook.id || ''));
|
|
123
139
|
console.log(' ' + chalk.bold('URL:') + ' ' + (webhook.url || ''));
|
|
124
140
|
console.log(' ' + chalk.bold('Events:') + ' ' + (webhook.eventTypes?.join(', ') || ''));
|
|
141
|
+
if (channels.length > 0) {
|
|
142
|
+
console.log(' ' + chalk.bold('Channels:') + ' ' + channels.map(c => `${c.channel}:${c.to}`).join(', '));
|
|
143
|
+
}
|
|
125
144
|
if (webhook.secret) {
|
|
126
145
|
console.log(' ' + chalk.bold('Secret:') + ' ' + chalk.yellow(webhook.secret));
|
|
127
146
|
console.log();
|
|
128
147
|
console.log(chalk.gray('Save the secret — it will not be shown again.'));
|
|
129
148
|
console.log(chalk.gray('Use it to verify webhook signatures (HMAC-SHA256).'));
|
|
130
149
|
}
|
|
131
|
-
// Send one-time HEARTBEAT.md instruction to the agent
|
|
132
|
-
await sendHeartbeatInstruction(instance.webhookUrl, instance.hooksToken);
|
|
133
150
|
}
|
|
134
151
|
function showNotificationsHelp() {
|
|
135
152
|
console.log(chalk.bold('Notifications Commands:'));
|
|
@@ -138,6 +155,7 @@ function showNotificationsHelp() {
|
|
|
138
155
|
console.log();
|
|
139
156
|
console.log(chalk.bold('Available Events:'));
|
|
140
157
|
console.log(' ' + chalk.green('email.received') + ' ' + 'Triggered when an inbound email arrives');
|
|
158
|
+
console.log(' ' + chalk.green('sms.received') + ' ' + 'Triggered when an inbound SMS arrives');
|
|
141
159
|
console.log();
|
|
142
160
|
console.log(chalk.bold('Examples:'));
|
|
143
161
|
console.log(' npx atxp notifications enable');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/commands/notifications.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,sBAAsB,GAAG,0DAA0D,CAAC;
|
|
1
|
+
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/commands/notifications.ts"],"names":[],"mappings":"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"}
|