@tloncorp/openclaw 0.4.2 → 0.6.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 +130 -141
- package/dist/index.js +157 -132
- 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 +51 -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 +43 -4
- package/dist/src/config-schema.js.map +1 -1
- 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 +130 -21
- package/dist/src/monitor/history.js.map +1 -1
- package/dist/src/monitor/index.js +2766 -2310
- 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/settings-sync.js +1 -8
- package/dist/src/monitor/settings-sync.js.map +1 -1
- package/dist/src/monitor/utils.js +123 -67
- 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 +84 -0
- package/dist/src/owner-listen-command.js.map +1 -0
- 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/settings.js +239 -96
- 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 +34 -10
- package/dist/src/targets.js.map +1 -1
- package/dist/src/telemetry.js +17 -14
- 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 +40 -11
- 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/openclaw.plugin.json +312 -2
- package/package.json +37 -7
- package/dist/src/heartbeat-telemetry.js +0 -155
- package/dist/src/heartbeat-telemetry.js.map +0 -1
- package/dist/src/nudge-candidate.js +0 -109
- package/dist/src/nudge-candidate.js.map +0 -1
- package/dist/src/onboarding.js +0 -178
- package/dist/src/onboarding.js.map +0 -1
|
@@ -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"}
|
|
@@ -1,5 +1,17 @@
|
|
|
1
|
-
import { createComputingStatus, getComputingStatusText, serializeComputingStatus, setConversationPresence, } from
|
|
1
|
+
import { clearConversationPresence, createComputingStatus, getComputingStatusText, serializeComputingStatus, setConversationPresence, } from '@tloncorp/api';
|
|
2
|
+
import { dr, render } from '@urbit/aura';
|
|
3
|
+
import { describeError } from '../urbit/errors.js';
|
|
2
4
|
const DEFAULT_MIN_UPDATE_INTERVAL_MS = 1_000;
|
|
5
|
+
const ACTIVE_PRESENCE_TIMEOUT_SECS = 90;
|
|
6
|
+
const ACTIVE_PRESENCE_TIMEOUT = render('dr', dr.fromSeconds(BigInt(ACTIVE_PRESENCE_TIMEOUT_SECS)));
|
|
7
|
+
// Active %computing entries carry an explicit 90s ship-side timeout. Re-publish
|
|
8
|
+
// unchanged active state well inside that window so long healthy runs stay
|
|
9
|
+
// visible, while disrupted gateways still age out without a final clear poke.
|
|
10
|
+
const DEFAULT_MAX_PUBLISH_AGE_MS = 30_000;
|
|
11
|
+
// Stopped runIds remembered per conversation so a late keepalive refresh
|
|
12
|
+
// cannot resurrect a run that was just stopped. Capped because tombstones
|
|
13
|
+
// only matter for the few seconds until the keepalive loop fully stops.
|
|
14
|
+
const STOPPED_RUN_MEMORY = 8;
|
|
3
15
|
function normalizeToolName(toolName) {
|
|
4
16
|
const trimmed = toolName?.trim();
|
|
5
17
|
return trimmed ? trimmed : null;
|
|
@@ -7,12 +19,20 @@ function normalizeToolName(toolName) {
|
|
|
7
19
|
export function createComputingPresenceReporter() {
|
|
8
20
|
return {
|
|
9
21
|
publish: async ({ conversationId, thinking, toolNames }) => {
|
|
22
|
+
if (!thinking) {
|
|
23
|
+
await clearConversationPresence({
|
|
24
|
+
conversationId,
|
|
25
|
+
topic: 'computing',
|
|
26
|
+
});
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
10
29
|
const toolCalls = toolNames.map((toolName) => ({ toolName }));
|
|
11
30
|
const status = createComputingStatus({ thinking, toolCalls });
|
|
12
31
|
await setConversationPresence({
|
|
13
32
|
conversationId,
|
|
14
|
-
topic:
|
|
33
|
+
topic: 'computing',
|
|
15
34
|
disclose: [],
|
|
35
|
+
timeout: ACTIVE_PRESENCE_TIMEOUT,
|
|
16
36
|
display: {
|
|
17
37
|
text: getComputingStatusText(status),
|
|
18
38
|
blob: serializeComputingStatus({ thinking, toolCalls }),
|
|
@@ -25,11 +45,40 @@ export function createComputingPresenceTracker(params) {
|
|
|
25
45
|
const reporter = params?.reporter ?? createComputingPresenceReporter();
|
|
26
46
|
const runtime = params?.runtime;
|
|
27
47
|
const minUpdateIntervalMs = Math.max(0, params?.minUpdateIntervalMs ?? DEFAULT_MIN_UPDATE_INTERVAL_MS);
|
|
48
|
+
const maxPublishAgeMs = Math.max(minUpdateIntervalMs, params?.maxPublishAgeMs ?? DEFAULT_MAX_PUBLISH_AGE_MS);
|
|
28
49
|
const conversations = new Map();
|
|
29
50
|
const lastPublishedState = new Map();
|
|
30
51
|
const lastPublishedAt = new Map();
|
|
31
52
|
const pendingState = new Map();
|
|
32
53
|
const pendingTimers = new Map();
|
|
54
|
+
const stoppedRuns = new Map();
|
|
55
|
+
const markRunStopped = (conversationId, runId) => {
|
|
56
|
+
let stopped = stoppedRuns.get(conversationId);
|
|
57
|
+
if (!stopped) {
|
|
58
|
+
stopped = new Set();
|
|
59
|
+
stoppedRuns.set(conversationId, stopped);
|
|
60
|
+
}
|
|
61
|
+
stopped.delete(runId);
|
|
62
|
+
stopped.add(runId);
|
|
63
|
+
while (stopped.size > STOPPED_RUN_MEMORY) {
|
|
64
|
+
const oldest = stopped.values().next().value;
|
|
65
|
+
if (oldest === undefined) {
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
stopped.delete(oldest);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
const isRunStopped = (conversationId, runId) => stoppedRuns.get(conversationId)?.has(runId) ?? false;
|
|
72
|
+
const clearRunStopped = (conversationId, runId) => {
|
|
73
|
+
const stopped = stoppedRuns.get(conversationId);
|
|
74
|
+
if (!stopped) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
stopped.delete(runId);
|
|
78
|
+
if (stopped.size === 0) {
|
|
79
|
+
stoppedRuns.delete(conversationId);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
33
82
|
const clonePublishedState = (state) => ({
|
|
34
83
|
thinking: state.thinking,
|
|
35
84
|
toolNames: [...state.toolNames],
|
|
@@ -65,6 +114,13 @@ export function createComputingPresenceTracker(params) {
|
|
|
65
114
|
conversationId,
|
|
66
115
|
...state,
|
|
67
116
|
});
|
|
117
|
+
if (!state.thinking) {
|
|
118
|
+
// idle is the terminal state; drop the records so the maps do not grow
|
|
119
|
+
// unboundedly across the gateway's lifetime
|
|
120
|
+
lastPublishedState.delete(conversationId);
|
|
121
|
+
lastPublishedAt.delete(conversationId);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
68
124
|
lastPublishedState.set(conversationId, clonePublishedState(state));
|
|
69
125
|
lastPublishedAt.set(conversationId, Date.now());
|
|
70
126
|
};
|
|
@@ -81,8 +137,12 @@ export function createComputingPresenceTracker(params) {
|
|
|
81
137
|
};
|
|
82
138
|
const publishThrottled = async (conversationId, state) => {
|
|
83
139
|
if (statesEqual(lastPublishedState.get(conversationId), state)) {
|
|
84
|
-
|
|
85
|
-
|
|
140
|
+
const publishedAt = lastPublishedAt.get(conversationId) ?? 0;
|
|
141
|
+
if (Date.now() - publishedAt < maxPublishAgeMs) {
|
|
142
|
+
clearPending(conversationId);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
// fall through: re-publish before the ship-side presence expires
|
|
86
146
|
}
|
|
87
147
|
if (minUpdateIntervalMs === 0) {
|
|
88
148
|
await publishNow(conversationId, state);
|
|
@@ -100,7 +160,7 @@ export function createComputingPresenceTracker(params) {
|
|
|
100
160
|
}
|
|
101
161
|
const timer = setTimeout(() => {
|
|
102
162
|
pendingTimers.delete(conversationId);
|
|
103
|
-
void safelySync(conversationId,
|
|
163
|
+
void safelySync(conversationId, 'flush', async () => {
|
|
104
164
|
await flushPending(conversationId);
|
|
105
165
|
});
|
|
106
166
|
}, nextAllowedAt - now);
|
|
@@ -162,14 +222,15 @@ export function createComputingPresenceTracker(params) {
|
|
|
162
222
|
await fn();
|
|
163
223
|
}
|
|
164
224
|
catch (error) {
|
|
165
|
-
runtime?.error?.(`[tlon] Failed to ${action} computing presence for ${conversationId}: ${error
|
|
166
|
-
? (error.stack ?? error.message)
|
|
167
|
-
: String(error)}`);
|
|
225
|
+
runtime?.error?.(`[tlon] Failed to ${action} computing presence for ${conversationId}: ${describeError(error)}`);
|
|
168
226
|
}
|
|
169
227
|
};
|
|
170
228
|
return {
|
|
171
229
|
refreshRun: async (params) => {
|
|
172
|
-
|
|
230
|
+
if (isRunStopped(params.conversationId, params.runId)) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
await safelySync(params.conversationId, 'refresh', async () => {
|
|
173
234
|
ensureRun(params.conversationId, params.runId);
|
|
174
235
|
await syncConversation(params.conversationId);
|
|
175
236
|
});
|
|
@@ -179,7 +240,9 @@ export function createComputingPresenceTracker(params) {
|
|
|
179
240
|
if (!toolName) {
|
|
180
241
|
return;
|
|
181
242
|
}
|
|
182
|
-
await safelySync(params.conversationId,
|
|
243
|
+
await safelySync(params.conversationId, 'update', async () => {
|
|
244
|
+
// real activity resumes a previously stopped run
|
|
245
|
+
clearRunStopped(params.conversationId, params.runId);
|
|
183
246
|
const run = ensureRun(params.conversationId, params.runId);
|
|
184
247
|
if (!run.toolNames.includes(toolName)) {
|
|
185
248
|
run.toolNames.push(toolName);
|
|
@@ -188,7 +251,7 @@ export function createComputingPresenceTracker(params) {
|
|
|
188
251
|
});
|
|
189
252
|
},
|
|
190
253
|
clearToolCalls: async (params) => {
|
|
191
|
-
await safelySync(params.conversationId,
|
|
254
|
+
await safelySync(params.conversationId, 'clear tools for', async () => {
|
|
192
255
|
const run = getRun(params.conversationId, params.runId);
|
|
193
256
|
if (!run || run.toolNames.length === 0) {
|
|
194
257
|
return;
|
|
@@ -198,7 +261,8 @@ export function createComputingPresenceTracker(params) {
|
|
|
198
261
|
});
|
|
199
262
|
},
|
|
200
263
|
stopRun: async (params) => {
|
|
201
|
-
|
|
264
|
+
markRunStopped(params.conversationId, params.runId);
|
|
265
|
+
await safelySync(params.conversationId, 'clear', async () => {
|
|
202
266
|
const runs = conversations.get(params.conversationId);
|
|
203
267
|
if (!runs) {
|
|
204
268
|
if (lastPublishedState.get(params.conversationId)?.thinking) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computing-presence.js","sourceRoot":"","sources":["../../../src/monitor/computing-presence.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"computing-presence.js","sourceRoot":"","sources":["../../../src/monitor/computing-presence.ts"],"names":[],"mappings":"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"}
|