@tloncorp/openclaw 0.4.3 → 0.6.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/README.md +130 -141
- package/dist/index.js +703 -152
- package/dist/index.js.map +1 -1
- package/dist/setup-api.js +2 -2
- package/dist/setup-entry.js +2 -2
- package/dist/setup-entry.js.map +1 -1
- package/dist/src/account-fields.js +7 -3
- package/dist/src/account-fields.js.map +1 -1
- package/dist/src/actions.js +73 -52
- package/dist/src/actions.js.map +1 -1
- package/dist/src/channel.js +63 -39
- package/dist/src/channel.js.map +1 -1
- package/dist/src/channel.runtime.js +61 -32
- package/dist/src/channel.runtime.js.map +1 -1
- package/dist/src/config-schema.js +24 -4
- package/dist/src/config-schema.js.map +1 -1
- package/dist/src/diagnostic-subscriptions.js +49 -0
- package/dist/src/diagnostic-subscriptions.js.map +1 -0
- package/dist/src/effective-owner.js.map +1 -1
- package/dist/src/gateway-status.js +55 -7
- package/dist/src/gateway-status.js.map +1 -1
- package/dist/src/monitor/approval.js +71 -62
- package/dist/src/monitor/approval.js.map +1 -1
- package/dist/src/monitor/command-auth.js +7 -7
- package/dist/src/monitor/command-auth.js.map +1 -1
- package/dist/src/monitor/command-bridge.js +3 -2
- package/dist/src/monitor/command-bridge.js.map +1 -1
- package/dist/src/monitor/computing-presence.js +76 -12
- package/dist/src/monitor/computing-presence.js.map +1 -1
- package/dist/src/monitor/discovery.js +16 -9
- package/dist/src/monitor/discovery.js.map +1 -1
- package/dist/src/monitor/history.js +58 -26
- package/dist/src/monitor/history.js.map +1 -1
- package/dist/src/monitor/index.js +3018 -2496
- package/dist/src/monitor/index.js.map +1 -1
- package/dist/src/monitor/media.js +106 -78
- package/dist/src/monitor/media.js.map +1 -1
- package/dist/src/monitor/nudge-runner.js +36 -27
- package/dist/src/monitor/nudge-runner.js.map +1 -1
- package/dist/src/monitor/nudge-state.js +7 -11
- package/dist/src/monitor/nudge-state.js.map +1 -1
- package/dist/src/monitor/owner-reply-persistence.js +27 -26
- package/dist/src/monitor/owner-reply-persistence.js.map +1 -1
- package/dist/src/monitor/processed-messages.js.map +1 -1
- package/dist/src/monitor/session-routing.js +261 -0
- package/dist/src/monitor/session-routing.js.map +1 -0
- package/dist/src/monitor/settings-sync.js +1 -8
- package/dist/src/monitor/settings-sync.js.map +1 -1
- package/dist/src/monitor/utils.js +77 -71
- package/dist/src/monitor/utils.js.map +1 -1
- package/dist/src/nudge-decision.js +40 -43
- package/dist/src/nudge-decision.js.map +1 -1
- package/dist/src/nudge-messages.js +9 -9
- package/dist/src/nudge-scheduler.js.map +1 -1
- package/dist/src/owner-listen-command.js +38 -28
- package/dist/src/owner-listen-command.js.map +1 -1
- package/dist/src/pending-nudge.js.map +1 -1
- package/dist/src/runtime.js +10 -6
- package/dist/src/runtime.js.map +1 -1
- package/dist/src/session-roles.js +2 -1
- package/dist/src/session-roles.js.map +1 -1
- package/dist/src/session-route.js +44 -0
- package/dist/src/session-route.js.map +1 -0
- package/dist/src/settings.js +233 -102
- package/dist/src/settings.js.map +1 -1
- package/dist/src/setup-core.js +32 -32
- package/dist/src/setup-core.js.map +1 -1
- package/dist/src/setup-surface.js +19 -19
- package/dist/src/setup-surface.js.map +1 -1
- package/dist/src/shared-state.js +46 -0
- package/dist/src/shared-state.js.map +1 -0
- package/dist/src/targets.js +17 -10
- package/dist/src/targets.js.map +1 -1
- package/dist/src/telemetry.js +764 -34
- package/dist/src/telemetry.js.map +1 -1
- package/dist/src/tlon-binary.js +20 -12
- package/dist/src/tlon-binary.js.map +1 -1
- package/dist/src/tlon-tool-guard.js +5 -5
- package/dist/src/tool-trace.js +17 -13
- package/dist/src/tool-trace.js.map +1 -1
- package/dist/src/types.js +30 -12
- package/dist/src/types.js.map +1 -1
- package/dist/src/urbit/api-client.js +16 -12
- package/dist/src/urbit/api-client.js.map +1 -1
- package/dist/src/urbit/auth.js +9 -9
- package/dist/src/urbit/auth.js.map +1 -1
- package/dist/src/urbit/base-url.js +11 -11
- package/dist/src/urbit/base-url.js.map +1 -1
- package/dist/src/urbit/channel-ops.js +25 -19
- package/dist/src/urbit/channel-ops.js.map +1 -1
- package/dist/src/urbit/context.js +8 -8
- package/dist/src/urbit/context.js.map +1 -1
- package/dist/src/urbit/errors.js +33 -7
- package/dist/src/urbit/errors.js.map +1 -1
- package/dist/src/urbit/fetch.js +3 -3
- package/dist/src/urbit/fetch.js.map +1 -1
- package/dist/src/urbit/http-poke.js +10 -10
- package/dist/src/urbit/http-poke.js.map +1 -1
- package/dist/src/urbit/send.js +27 -23
- package/dist/src/urbit/send.js.map +1 -1
- package/dist/src/urbit/sse-client.js +45 -41
- package/dist/src/urbit/sse-client.js.map +1 -1
- package/dist/src/urbit/story.js +31 -30
- package/dist/src/urbit/story.js.map +1 -1
- package/dist/src/urbit/upload.js +8 -8
- package/dist/src/urbit/upload.js.map +1 -1
- package/dist/src/version.generated.js +2 -1
- package/dist/src/version.generated.js.map +1 -1
- package/dist/src/version.js +134 -0
- package/dist/src/version.js.map +1 -0
- package/openclaw.plugin.json +37 -0
- package/package.json +9 -15
|
@@ -1,5 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { gatewayHeartbeat, gatewayStop } from '@tloncorp/api';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { sharedSlot } from './shared-state.js';
|
|
4
|
+
import { configureTlonApiWithPoke } from './urbit/api-client.js';
|
|
5
|
+
// Shared-state slot for the @tloncorp/api client params. The monitor
|
|
6
|
+
// publishes its SSE-bound poke + ship coords here; every other module
|
|
7
|
+
// context (notably this one) reads them and configures its OWN local
|
|
8
|
+
// @tloncorp/api singleton before any poke call. Storing a callback would
|
|
9
|
+
// configure the publisher's @tloncorp/api instance, not the reader's, so
|
|
10
|
+
// we deliberately move *data* through the slot, not behavior.
|
|
11
|
+
export const API_CLIENT_PARAMS_SLOT = '@tloncorp/openclaw.api-client-params';
|
|
12
|
+
const apiClientParamsSlot = sharedSlot(API_CLIENT_PARAMS_SLOT);
|
|
3
13
|
// ── Constants (matching design doc recommendations) ─────────
|
|
4
14
|
const HEARTBEAT_INTERVAL_MS = 30_000; // 30s
|
|
5
15
|
const LEASE_DURATION_MS = 90_000; // 90s
|
|
@@ -12,6 +22,7 @@ export function computeLeaseUntil() {
|
|
|
12
22
|
export function createGatewayStatusManager(opts) {
|
|
13
23
|
const bootId = randomUUID();
|
|
14
24
|
let heartbeatInterval = null;
|
|
25
|
+
let starting = false;
|
|
15
26
|
let activated = false;
|
|
16
27
|
let stopped = false;
|
|
17
28
|
let resolveStarted;
|
|
@@ -26,6 +37,12 @@ export function createGatewayStatusManager(opts) {
|
|
|
26
37
|
waitForGatewayStart() {
|
|
27
38
|
return startedPromise;
|
|
28
39
|
},
|
|
40
|
+
get starting() {
|
|
41
|
+
return starting;
|
|
42
|
+
},
|
|
43
|
+
markStarting() {
|
|
44
|
+
starting = true;
|
|
45
|
+
},
|
|
29
46
|
get activated() {
|
|
30
47
|
return activated;
|
|
31
48
|
},
|
|
@@ -44,6 +61,19 @@ export function createGatewayStatusManager(opts) {
|
|
|
44
61
|
}
|
|
45
62
|
heartbeatInterval = setInterval(async () => {
|
|
46
63
|
try {
|
|
64
|
+
// Configure THIS module's @tloncorp/api instance against the
|
|
65
|
+
// monitor-published params every tick. Under OpenClaw plugin
|
|
66
|
+
// module isolation this code path can hold a separate
|
|
67
|
+
// @tloncorp/api instance from the monitor; outbound DMs via
|
|
68
|
+
// `withAuthenticatedTlonApi` can also rotate the global
|
|
69
|
+
// client between heartbeats. Reapplying here keeps the
|
|
70
|
+
// heartbeat poke pointed at the SSE-bound client.
|
|
71
|
+
const params = apiClientParamsSlot.get();
|
|
72
|
+
if (!params) {
|
|
73
|
+
opts.logger?.error?.('[gateway-status] heartbeat skipped: api-client params not published');
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
configureTlonApiWithPoke(params.poke, params.shipName, params.shipUrl);
|
|
47
77
|
await gatewayHeartbeat({ bootId, leaseUntil: computeLeaseUntil() });
|
|
48
78
|
}
|
|
49
79
|
catch (err) {
|
|
@@ -56,17 +86,35 @@ export function createGatewayStatusManager(opts) {
|
|
|
56
86
|
if (heartbeatInterval) {
|
|
57
87
|
clearInterval(heartbeatInterval);
|
|
58
88
|
heartbeatInterval = null;
|
|
59
|
-
opts.logger?.log?.(
|
|
89
|
+
opts.logger?.log?.('[gateway-status] heartbeat stopped');
|
|
60
90
|
}
|
|
61
91
|
},
|
|
62
92
|
};
|
|
63
93
|
}
|
|
64
|
-
//
|
|
65
|
-
|
|
94
|
+
// Routed through shared-state so the slot survives plugin module isolation —
|
|
95
|
+
// the extension sets, the monitor reads, and they live in separate contexts.
|
|
96
|
+
const managerSlot = sharedSlot('gateway-status.manager');
|
|
66
97
|
export function setGatewayStatusManager(m) {
|
|
67
|
-
|
|
98
|
+
managerSlot.set(m);
|
|
68
99
|
}
|
|
69
100
|
export function getGatewayStatusManager() {
|
|
70
|
-
return
|
|
101
|
+
return managerSlot.get();
|
|
102
|
+
}
|
|
103
|
+
// Configure THIS module's @tloncorp/api singleton against the
|
|
104
|
+
// monitor-published params, then send the gateway-stop poke. Callers
|
|
105
|
+
// (notably the gateway_stop hook in index.ts) must go through this helper
|
|
106
|
+
// instead of importing `gatewayStop` directly, because under OpenClaw
|
|
107
|
+
// >=2026.4.27 plugin module isolation the entry module's @tloncorp/api
|
|
108
|
+
// instance is never configured — only the monitor's is. Routing through
|
|
109
|
+
// gateway-status.ts reuses the same configured instance the heartbeat uses.
|
|
110
|
+
// Returns true if the poke was sent, false if the params slot was empty.
|
|
111
|
+
export async function sendGatewayStop(params) {
|
|
112
|
+
const apiParams = apiClientParamsSlot.get();
|
|
113
|
+
if (!apiParams) {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
configureTlonApiWithPoke(apiParams.poke, apiParams.shipName, apiParams.shipUrl);
|
|
117
|
+
await gatewayStop({ bootId: params.bootId, reason: params.reason });
|
|
118
|
+
return true;
|
|
71
119
|
}
|
|
72
120
|
//# sourceMappingURL=gateway-status.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-status.js","sourceRoot":"","sources":["../../src/gateway-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"gateway-status.js","sourceRoot":"","sources":["../../src/gateway-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,13 @@
|
|
|
1
|
-
import { randomUUID } from
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Approval system for managing DM, channel mention, and group invite approvals.
|
|
4
|
+
*
|
|
5
|
+
* When an unknown ship tries to interact with the bot, the owner receives
|
|
6
|
+
* a notification and can approve or deny the request via slash commands
|
|
7
|
+
* (/allow, /reject, /ban).
|
|
8
|
+
*/
|
|
9
|
+
import { APPROVAL_TTL_MS } from '../settings.js';
|
|
10
|
+
export { APPROVAL_TTL_MS };
|
|
2
11
|
function displayChannel(nest, ctx) {
|
|
3
12
|
const name = ctx?.channelNames?.get(nest);
|
|
4
13
|
return name ? `${name} (${nest})` : nest;
|
|
@@ -13,12 +22,12 @@ function displayGroup(flag, ctx, titleOverride) {
|
|
|
13
22
|
/** Map a reaction emoji to an approval action. Returns undefined for unrecognized emoji. */
|
|
14
23
|
export function emojiToApprovalAction(emoji) {
|
|
15
24
|
switch (emoji) {
|
|
16
|
-
case
|
|
17
|
-
return
|
|
18
|
-
case
|
|
19
|
-
return
|
|
20
|
-
case
|
|
21
|
-
return
|
|
25
|
+
case '👍':
|
|
26
|
+
return 'approve';
|
|
27
|
+
case '👎':
|
|
28
|
+
return 'deny';
|
|
29
|
+
case '🛑':
|
|
30
|
+
return 'block';
|
|
22
31
|
default:
|
|
23
32
|
return undefined;
|
|
24
33
|
}
|
|
@@ -33,18 +42,16 @@ export function emojiToApprovalAction(emoji) {
|
|
|
33
42
|
*/
|
|
34
43
|
export function normalizeNotificationId(id) {
|
|
35
44
|
// Strip ship prefix: "~zod/170.141..." → "170.141..."
|
|
36
|
-
if (id.includes(
|
|
37
|
-
id = id.slice(id.indexOf(
|
|
45
|
+
if (id.includes('/') && id.startsWith('~')) {
|
|
46
|
+
id = id.slice(id.indexOf('/') + 1);
|
|
38
47
|
}
|
|
39
48
|
// Strip dots: "170.141.184..." → "170141184..."
|
|
40
|
-
return id.replace(/\./g,
|
|
49
|
+
return id.replace(/\./g, '');
|
|
41
50
|
}
|
|
42
51
|
// ============================================================================
|
|
43
52
|
// Approval Expiration
|
|
44
53
|
// ============================================================================
|
|
45
|
-
/**
|
|
46
|
-
export const APPROVAL_TTL_MS = 48 * 60 * 60 * 1000;
|
|
47
|
-
/** Check if a pending approval has expired. */
|
|
54
|
+
/** Check if a pending approval has expired (TTL defined in settings.ts). */
|
|
48
55
|
export function isExpired(approval) {
|
|
49
56
|
return Date.now() - approval.timestamp > APPROVAL_TTL_MS;
|
|
50
57
|
}
|
|
@@ -94,41 +101,41 @@ function truncate(text, maxLength) {
|
|
|
94
101
|
if (text.length <= maxLength) {
|
|
95
102
|
return text;
|
|
96
103
|
}
|
|
97
|
-
return text.substring(0, maxLength - 3) +
|
|
104
|
+
return text.substring(0, maxLength - 3) + '...';
|
|
98
105
|
}
|
|
99
106
|
// ============================================================================
|
|
100
107
|
// Approval Request Formatting
|
|
101
108
|
// ============================================================================
|
|
102
|
-
const REACTION_HINT =
|
|
109
|
+
const REACTION_HINT = 'React to this message: 👍 approve · 👎 deny · 🛑 block';
|
|
103
110
|
function actionHintsDm(id) {
|
|
104
111
|
return [
|
|
105
112
|
REACTION_HINT,
|
|
106
|
-
|
|
107
|
-
|
|
113
|
+
'',
|
|
114
|
+
'Or use a slash command:',
|
|
108
115
|
` /allow ${id} — allow this ship to DM`,
|
|
109
116
|
` /reject ${id} — decline (they can try again)`,
|
|
110
117
|
` /ban ${id} — block this ship`,
|
|
111
|
-
].join(
|
|
118
|
+
].join('\n');
|
|
112
119
|
}
|
|
113
120
|
function actionHintsChannel(id) {
|
|
114
121
|
return [
|
|
115
122
|
REACTION_HINT,
|
|
116
|
-
|
|
117
|
-
|
|
123
|
+
'',
|
|
124
|
+
'Or use a slash command:',
|
|
118
125
|
` /allow ${id} — allow this ship in this channel`,
|
|
119
126
|
` /reject ${id} — decline (they can try again)`,
|
|
120
127
|
` /ban ${id} — block this ship`,
|
|
121
|
-
].join(
|
|
128
|
+
].join('\n');
|
|
122
129
|
}
|
|
123
130
|
function actionHintsGroup(id) {
|
|
124
131
|
return [
|
|
125
132
|
REACTION_HINT,
|
|
126
|
-
|
|
127
|
-
|
|
133
|
+
'',
|
|
134
|
+
'Or use a slash command:',
|
|
128
135
|
` /allow ${id} — join this group`,
|
|
129
136
|
` /reject ${id} — decline the invite`,
|
|
130
137
|
` /ban ${id} — block this ship`,
|
|
131
|
-
].join(
|
|
138
|
+
].join('\n');
|
|
132
139
|
}
|
|
133
140
|
/**
|
|
134
141
|
* Format a notification message for the owner about a pending approval.
|
|
@@ -136,28 +143,28 @@ function actionHintsGroup(id) {
|
|
|
136
143
|
export function formatApprovalRequest(approval, ctx) {
|
|
137
144
|
const preview = approval.messagePreview
|
|
138
145
|
? `\n"${truncate(approval.messagePreview, 100)}"`
|
|
139
|
-
:
|
|
146
|
+
: '';
|
|
140
147
|
switch (approval.type) {
|
|
141
|
-
case
|
|
148
|
+
case 'dm':
|
|
142
149
|
return [
|
|
143
150
|
`DM request from ${approval.requestingShip}`,
|
|
144
151
|
preview,
|
|
145
|
-
|
|
152
|
+
'',
|
|
146
153
|
actionHintsDm(approval.id),
|
|
147
|
-
].join(
|
|
148
|
-
case
|
|
154
|
+
].join('\n');
|
|
155
|
+
case 'channel':
|
|
149
156
|
return [
|
|
150
|
-
`${approval.requestingShip} mentioned the bot in ${displayChannel(approval.channelNest ??
|
|
157
|
+
`${approval.requestingShip} mentioned the bot in ${displayChannel(approval.channelNest ?? '', ctx)}`,
|
|
151
158
|
preview,
|
|
152
|
-
|
|
159
|
+
'',
|
|
153
160
|
actionHintsChannel(approval.id),
|
|
154
|
-
].join(
|
|
155
|
-
case
|
|
161
|
+
].join('\n');
|
|
162
|
+
case 'group':
|
|
156
163
|
return [
|
|
157
|
-
`Group invite from ${approval.requestingShip} to join ${displayGroup(approval.groupFlag ??
|
|
158
|
-
|
|
164
|
+
`Group invite from ${approval.requestingShip} to join ${displayGroup(approval.groupFlag ?? '', ctx, approval.groupTitle)}`,
|
|
165
|
+
'',
|
|
159
166
|
actionHintsGroup(approval.id),
|
|
160
|
-
].join(
|
|
167
|
+
].join('\n');
|
|
161
168
|
}
|
|
162
169
|
}
|
|
163
170
|
// ============================================================================
|
|
@@ -195,10 +202,10 @@ export function hasDuplicatePending(pendingApprovals, type, requestingShip, chan
|
|
|
195
202
|
if (approval.type !== type || approval.requestingShip !== requestingShip) {
|
|
196
203
|
return false;
|
|
197
204
|
}
|
|
198
|
-
if (type ===
|
|
205
|
+
if (type === 'channel' && approval.channelNest !== channelNest) {
|
|
199
206
|
return false;
|
|
200
207
|
}
|
|
201
|
-
if (type ===
|
|
208
|
+
if (type === 'group' && approval.groupFlag !== groupFlag) {
|
|
202
209
|
return false;
|
|
203
210
|
}
|
|
204
211
|
return true;
|
|
@@ -218,25 +225,25 @@ export function removePendingApproval(pendingApprovals, id) {
|
|
|
218
225
|
*/
|
|
219
226
|
export function formatApprovalConfirmation(approval, action, ctx) {
|
|
220
227
|
const ship = approval.requestingShip;
|
|
221
|
-
if (action ===
|
|
228
|
+
if (action === 'block') {
|
|
222
229
|
return `Blocked ${ship}. They will no longer be able to contact the bot.`;
|
|
223
230
|
}
|
|
224
231
|
switch (approval.type) {
|
|
225
|
-
case
|
|
226
|
-
if (action ===
|
|
232
|
+
case 'dm':
|
|
233
|
+
if (action === 'approve') {
|
|
227
234
|
return `Approved DM access for ${ship}. They can now message the bot.`;
|
|
228
235
|
}
|
|
229
236
|
return `Denied DM request from ${ship}.`;
|
|
230
|
-
case
|
|
231
|
-
const channel = displayChannel(approval.channelNest ??
|
|
232
|
-
if (action ===
|
|
237
|
+
case 'channel': {
|
|
238
|
+
const channel = displayChannel(approval.channelNest ?? '', ctx);
|
|
239
|
+
if (action === 'approve') {
|
|
233
240
|
return `Approved ${ship} for ${channel}. They can now interact in this channel.`;
|
|
234
241
|
}
|
|
235
242
|
return `Denied ${ship} for ${channel}.`;
|
|
236
243
|
}
|
|
237
|
-
case
|
|
238
|
-
const group = displayGroup(approval.groupFlag ??
|
|
239
|
-
if (action ===
|
|
244
|
+
case 'group': {
|
|
245
|
+
const group = displayGroup(approval.groupFlag ?? '', ctx, approval.groupTitle);
|
|
246
|
+
if (action === 'approve') {
|
|
240
247
|
return `Approved group invite from ${ship} to ${group}. Joining group...`;
|
|
241
248
|
}
|
|
242
249
|
return `Denied group invite from ${ship} to ${group}.`;
|
|
@@ -251,15 +258,15 @@ export function formatApprovalConfirmation(approval, action, ctx) {
|
|
|
251
258
|
*/
|
|
252
259
|
export function formatBlockedList(ships) {
|
|
253
260
|
if (ships.length === 0) {
|
|
254
|
-
return
|
|
261
|
+
return 'No ships are currently blocked.';
|
|
255
262
|
}
|
|
256
263
|
const lines = ships.map((s) => ` ${s}`);
|
|
257
264
|
return [
|
|
258
265
|
`Blocked ships (${ships.length}):`,
|
|
259
266
|
...lines,
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
].join(
|
|
267
|
+
'',
|
|
268
|
+
'To unban: `/unban ~ship-name`',
|
|
269
|
+
].join('\n');
|
|
263
270
|
}
|
|
264
271
|
/**
|
|
265
272
|
* Format the list of pending approvals for display to owner.
|
|
@@ -267,26 +274,28 @@ export function formatBlockedList(ships) {
|
|
|
267
274
|
export function formatPendingList(approvals, ctx) {
|
|
268
275
|
const active = pruneExpired(approvals);
|
|
269
276
|
if (active.length === 0) {
|
|
270
|
-
return
|
|
277
|
+
return 'No pending approval requests.';
|
|
271
278
|
}
|
|
272
279
|
const entries = active.map((a) => {
|
|
273
280
|
const ship = a.requestingShip;
|
|
274
|
-
const preview = a.messagePreview
|
|
281
|
+
const preview = a.messagePreview
|
|
282
|
+
? `\n "${truncate(a.messagePreview, 80)}"`
|
|
283
|
+
: '';
|
|
275
284
|
switch (a.type) {
|
|
276
|
-
case
|
|
285
|
+
case 'dm':
|
|
277
286
|
return ` #${a.id} - DM from ${ship}${preview}`;
|
|
278
|
-
case
|
|
279
|
-
return ` #${a.id} - Mention in ${displayChannel(a.channelNest ??
|
|
280
|
-
case
|
|
281
|
-
return ` #${a.id} - Group invite from ${ship} to ${displayGroup(a.groupFlag ??
|
|
287
|
+
case 'channel':
|
|
288
|
+
return ` #${a.id} - Mention in ${displayChannel(a.channelNest ?? '', ctx)} by ${ship}${preview}`;
|
|
289
|
+
case 'group':
|
|
290
|
+
return ` #${a.id} - Group invite from ${ship} to ${displayGroup(a.groupFlag ?? '', ctx, a.groupTitle)}`;
|
|
282
291
|
}
|
|
283
292
|
});
|
|
284
293
|
return [
|
|
285
294
|
`Pending requests (${active.length}):`,
|
|
286
|
-
|
|
295
|
+
'',
|
|
287
296
|
...entries,
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
].join(
|
|
297
|
+
'',
|
|
298
|
+
'Use /allow, /reject, or /ban with the ID.',
|
|
299
|
+
].join('\n');
|
|
291
300
|
}
|
|
292
301
|
//# sourceMappingURL=approval.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval.js","sourceRoot":"","sources":["../../../src/monitor/approval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"approval.js","sourceRoot":"","sources":["../../../src/monitor/approval.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* Pure module with no OpenClaw SDK dependency. Accepts a minimal
|
|
5
5
|
* CommandContextLike instead of the full PluginCommandContext.
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
7
|
+
import { normalizeShip } from '../targets.js';
|
|
8
|
+
import { getAllBridges, getBridge, } from './command-bridge.js';
|
|
9
9
|
/**
|
|
10
10
|
* Resolve the correct bridge for a command invocation and verify ownership.
|
|
11
11
|
*
|
|
@@ -25,7 +25,7 @@ export function resolveBridgeForCommand(ctx) {
|
|
|
25
25
|
// 2. Fallback: enumerate all bridges
|
|
26
26
|
const all = getAllBridges();
|
|
27
27
|
if (all.size === 0)
|
|
28
|
-
return { error:
|
|
28
|
+
return { error: 'Bot is not connected yet.' };
|
|
29
29
|
if (all.size === 1) {
|
|
30
30
|
const [, only] = [...all.entries()][0];
|
|
31
31
|
return checkOwner(ctx, only);
|
|
@@ -40,7 +40,7 @@ export function resolveBridgeForCommand(ctx) {
|
|
|
40
40
|
return checkOwner(ctx, matches[0]);
|
|
41
41
|
}
|
|
42
42
|
return {
|
|
43
|
-
error:
|
|
43
|
+
error: 'Multiple accounts connected. Run this command from the owner DM for the target account.',
|
|
44
44
|
};
|
|
45
45
|
}
|
|
46
46
|
/**
|
|
@@ -49,13 +49,13 @@ export function resolveBridgeForCommand(ctx) {
|
|
|
49
49
|
*/
|
|
50
50
|
export function checkOwner(ctx, bridge) {
|
|
51
51
|
if (!bridge.ownerShip) {
|
|
52
|
-
return { error:
|
|
52
|
+
return { error: 'Owner ship not configured.' };
|
|
53
53
|
}
|
|
54
54
|
if (!ctx.senderId) {
|
|
55
|
-
return { error:
|
|
55
|
+
return { error: 'Cannot identify sender.' };
|
|
56
56
|
}
|
|
57
57
|
if (normalizeShip(ctx.senderId) !== bridge.ownerShip) {
|
|
58
|
-
return { error:
|
|
58
|
+
return { error: 'Only the bot owner can use this command.' };
|
|
59
59
|
}
|
|
60
60
|
return { bridge };
|
|
61
61
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-auth.js","sourceRoot":"","sources":["../../../src/monitor/command-auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"command-auth.js","sourceRoot":"","sources":["../../../src/monitor/command-auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAEL,aAAa,EACb,SAAS,GACV,MAAM,qBAAqB,CAAC;AAQ7B;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CACrC,GAAuB;IAEvB,gCAAgC;IAChC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,MAAM;YAAE,OAAO,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,qCAAqC;IACrC,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC;IAClE,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,OAAO,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,iDAAiD;IACjD,qEAAqE;IACrE,wDAAwD;IACxD,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjB,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC;QAC5E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO;QACL,KAAK,EACH,yFAAyF;KAC5F,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CACxB,GAAuB,EACvB,MAA6B;IAE7B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC;IACjD,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAClB,OAAO,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;IAC9C,CAAC;IACD,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;QACrD,OAAO,EAAE,KAAK,EAAE,0CAA0C,EAAE,CAAC;IAC/D,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC"}
|
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
* approval state (available after SSE starts). Each monitor registers a bridge
|
|
6
6
|
* keyed by accountId; command handlers resolve the correct bridge at runtime.
|
|
7
7
|
*/
|
|
8
|
-
|
|
9
|
-
const
|
|
8
|
+
import { sharedMap } from '../shared-state.js';
|
|
9
|
+
const bridges = sharedMap('monitor.command-bridge.bridges');
|
|
10
|
+
const DEFAULT_KEY = 'default';
|
|
10
11
|
export function setBridge(accountId, b) {
|
|
11
12
|
bridges.set(accountId ?? DEFAULT_KEY, b);
|
|
12
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-bridge.js","sourceRoot":"","sources":["../../../src/monitor/command-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"command-bridge.js","sourceRoot":"","sources":["../../../src/monitor/command-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAoC/C,MAAM,OAAO,GAAG,SAAS,CACvB,gCAAgC,CACjC,CAAC;AAEF,MAAM,WAAW,GAAG,SAAS,CAAC;AAE9B,MAAM,UAAU,SAAS,CACvB,SAA6B,EAC7B,CAAwB;IAExB,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,YAAY,CAC1B,SAA6B,EAC7B,CAAwB;IAExB,MAAM,GAAG,GAAG,SAAS,IAAI,WAAW,CAAC;IACrC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,SAA6B;IAE7B,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,WAAW,CAAC,IAAI,IAAI,CAAC;AACvD,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC"}
|