@tloncorp/openclaw 0.2.0 → 0.4.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.
Files changed (78) hide show
  1. package/README.md +232 -23
  2. package/dist/index.js +204 -69
  3. package/dist/index.js.map +1 -1
  4. package/dist/setup-api.js +3 -0
  5. package/dist/setup-api.js.map +1 -0
  6. package/dist/setup-entry.js +4 -0
  7. package/dist/setup-entry.js.map +1 -0
  8. package/dist/src/actions.js +30 -8
  9. package/dist/src/actions.js.map +1 -1
  10. package/dist/src/channel.js +155 -420
  11. package/dist/src/channel.js.map +1 -1
  12. package/dist/src/channel.runtime.js +142 -0
  13. package/dist/src/channel.runtime.js.map +1 -0
  14. package/dist/src/config-schema.js +37 -1
  15. package/dist/src/config-schema.js.map +1 -1
  16. package/dist/src/effective-owner.js +22 -0
  17. package/dist/src/effective-owner.js.map +1 -0
  18. package/dist/src/gateway-status.js +72 -0
  19. package/dist/src/gateway-status.js.map +1 -0
  20. package/dist/src/heartbeat-telemetry.js +155 -0
  21. package/dist/src/heartbeat-telemetry.js.map +1 -0
  22. package/dist/src/monitor/approval.js.map +1 -1
  23. package/dist/src/monitor/computing-presence.js +221 -0
  24. package/dist/src/monitor/computing-presence.js.map +1 -0
  25. package/dist/src/monitor/discovery.js +2 -2
  26. package/dist/src/monitor/index.js +665 -171
  27. package/dist/src/monitor/index.js.map +1 -1
  28. package/dist/src/monitor/media.js +165 -6
  29. package/dist/src/monitor/media.js.map +1 -1
  30. package/dist/src/monitor/nudge-runner.js +232 -0
  31. package/dist/src/monitor/nudge-runner.js.map +1 -0
  32. package/dist/src/monitor/nudge-state.js +58 -0
  33. package/dist/src/monitor/nudge-state.js.map +1 -0
  34. package/dist/src/monitor/owner-reply-persistence.js +92 -0
  35. package/dist/src/monitor/owner-reply-persistence.js.map +1 -0
  36. package/dist/src/monitor/pending-nudge-persistence.js +15 -0
  37. package/dist/src/monitor/pending-nudge-persistence.js.map +1 -0
  38. package/dist/src/monitor/settings-sync.js +28 -0
  39. package/dist/src/monitor/settings-sync.js.map +1 -0
  40. package/dist/src/monitor/utils.js +0 -4
  41. package/dist/src/monitor/utils.js.map +1 -1
  42. package/dist/src/nudge-candidate.js +109 -0
  43. package/dist/src/nudge-candidate.js.map +1 -0
  44. package/dist/src/nudge-decision.js +309 -0
  45. package/dist/src/nudge-decision.js.map +1 -0
  46. package/dist/src/nudge-messages.js +25 -0
  47. package/dist/src/nudge-messages.js.map +1 -0
  48. package/dist/src/nudge-scheduler.js +91 -0
  49. package/dist/src/nudge-scheduler.js.map +1 -0
  50. package/dist/src/pending-nudge.js +57 -0
  51. package/dist/src/pending-nudge.js.map +1 -0
  52. package/dist/src/settings.js +77 -5
  53. package/dist/src/settings.js.map +1 -1
  54. package/dist/src/setup-core.js +164 -0
  55. package/dist/src/setup-core.js.map +1 -0
  56. package/dist/src/setup-surface.js +85 -0
  57. package/dist/src/setup-surface.js.map +1 -0
  58. package/dist/src/telemetry.js +252 -0
  59. package/dist/src/telemetry.js.map +1 -0
  60. package/dist/src/tlon-binary.js +46 -0
  61. package/dist/src/tlon-binary.js.map +1 -0
  62. package/dist/src/tlon-tool-guard.js +44 -0
  63. package/dist/src/tlon-tool-guard.js.map +1 -0
  64. package/dist/src/tool-trace.js +100 -0
  65. package/dist/src/tool-trace.js.map +1 -0
  66. package/dist/src/types.js +31 -1
  67. package/dist/src/types.js.map +1 -1
  68. package/dist/src/urbit/api-client.js +4 -3
  69. package/dist/src/urbit/api-client.js.map +1 -1
  70. package/dist/src/urbit/base-url.js +2 -2
  71. package/dist/src/urbit/base-url.js.map +1 -1
  72. package/dist/src/urbit/fetch.js +1 -1
  73. package/dist/src/urbit/fetch.js.map +1 -1
  74. package/dist/src/urbit/upload.js +1 -1
  75. package/dist/src/urbit/upload.js.map +1 -1
  76. package/dist/src/version.generated.js +1 -1
  77. package/dist/src/version.generated.js.map +1 -1
  78. package/package.json +34 -24
@@ -0,0 +1,232 @@
1
+ /**
2
+ * Plumbing layer that wires the pure nudge-scheduler to live Urbit API,
3
+ * settings snapshot, shadows, telemetry, and the pending-nudge record.
4
+ *
5
+ * The runner owns the tick body. The scheduler owns the timer lifecycle.
6
+ */
7
+ import { computeTargetStage, daysBetween, inActiveHours, resolveActiveHours, resolveLastOwnerInstant, } from "../nudge-decision.js";
8
+ import { NUDGE_MESSAGES } from "../nudge-messages.js";
9
+ import { createNudgeScheduler, DEFAULT_NUDGE_TICK_INTERVAL_MS, } from "../nudge-scheduler.js";
10
+ import { parseSettingsResponse } from "../settings.js";
11
+ import { listRunnableTlonAccountIds } from "../types.js";
12
+ /**
13
+ * Decide whether the monitor should construct and start the nudge runner.
14
+ *
15
+ * Two gates:
16
+ * 1. `channels.tlon.reengagement.enabled` must be explicitly `true`. The
17
+ * feature is default-off so self-hosted installs that configure
18
+ * `ownerShip` for approval DMs do not automatically get owner nudges.
19
+ * 2. Exactly one Tlon account must be configured. The runner sends DMs
20
+ * through the global `@tloncorp/api` client configured by
21
+ * `configureTlonApiWithPoke`, and the last-started monitor wins that
22
+ * singleton — so multi-account mode is not safe until a per-account
23
+ * send path lands.
24
+ *
25
+ * Pure helper; does not read process state.
26
+ */
27
+ export function shouldStartNudgeRunner(cfg) {
28
+ const reengagementEnabled = cfg.channels?.tlon?.reengagement
29
+ ?.enabled === true;
30
+ if (!reengagementEnabled) {
31
+ return {
32
+ start: false,
33
+ reason: "flag-disabled",
34
+ detail: "channels.tlon.reengagement.enabled is not true",
35
+ };
36
+ }
37
+ // Count *runnable* accounts (enabled + fully configured). Disabled or
38
+ // half-configured stub entries should not trip the multi-account guard,
39
+ // since they would never start a monitor and so cannot race the global
40
+ // `@tloncorp/api` singleton with the active account.
41
+ const accountIds = listRunnableTlonAccountIds(cfg);
42
+ if (accountIds.length !== 1) {
43
+ return {
44
+ start: false,
45
+ reason: "multi-account",
46
+ detail: `${accountIds.length} runnable Tlon accounts; runner requires exactly 1`,
47
+ };
48
+ }
49
+ return { start: true, reason: null };
50
+ }
51
+ export function createNudgeRunner(deps) {
52
+ const now = deps.now ?? (() => Date.now());
53
+ const intervalMs = deps.intervalMs ?? DEFAULT_NUDGE_TICK_INTERVAL_MS;
54
+ /**
55
+ * Resolve the authoritative `lastNudgeStage` for the duplicate-prevention
56
+ * guard.
57
+ *
58
+ * The shadow is updated synchronously by every trusted path (post-poke
59
+ * advance, owner-reply clear, subscription reconcile, fresh-refresh
60
+ * reconcile) and is never downgraded from a stale scry. It is therefore
61
+ * authoritative for the guard: returning it honors a trusted lower or
62
+ * clear immediately — even if `/settings/all.json` still lags with the
63
+ * old higher value — and still short-circuits duplicates when a local
64
+ * advance has not yet propagated to storage.
65
+ *
66
+ * A best-effort scry is kept for observability so operators can see
67
+ * subscription-lag drift in the logs, but its value does not feed the
68
+ * guard. Admin raises delivered while subscription is dead catch up
69
+ * through the periodic fresh-refresh path (`applySettingsSnapshot`
70
+ * with `fresh: true`), which updates the shadow before the next tick.
71
+ */
72
+ async function resolveAuthoritativeStage() {
73
+ const shadow = deps.getLastNudgeStageShadow(deps.accountId) ?? 0;
74
+ try {
75
+ const raw = await deps.api.scry("/settings/all.json");
76
+ const bucket = raw?.all?.moltbot;
77
+ const parsed = parseSettingsResponse(bucket ?? {});
78
+ const fresh = parsed.lastNudgeStage ?? 0;
79
+ if (fresh !== shadow) {
80
+ deps.runtime?.log?.(`[tlon] nudge: stage shadow=${shadow} scry=${fresh} — shadow wins (trusted path)`);
81
+ }
82
+ }
83
+ catch (err) {
84
+ deps.runtime?.error?.(`[tlon] nudge: fresh lastNudgeStage scry failed: ${String(err)}`);
85
+ }
86
+ return shadow;
87
+ }
88
+ async function pokeLastNudgeStage(stage) {
89
+ await deps.api.poke({
90
+ app: "settings",
91
+ mark: "settings-event",
92
+ json: {
93
+ "put-entry": {
94
+ desk: "moltbot",
95
+ "bucket-key": "tlon",
96
+ "entry-key": "lastNudgeStage",
97
+ value: stage,
98
+ },
99
+ },
100
+ });
101
+ }
102
+ /**
103
+ * Re-read owner activity through the same shadow/mirror resolver the
104
+ * tick used at its top. Returns true when activity has advanced since
105
+ * the threshold captured at the start of the tick. Used to suppress
106
+ * a stale send and to skip recording a fresh `pendingNudge` after the
107
+ * owner has resumed activity mid-tick.
108
+ */
109
+ function ownerActivityAdvancedSince(thresholdMs) {
110
+ const recheck = resolveLastOwnerInstant(deps.getLastOwnerActivity(deps.accountId), deps.getSettings());
111
+ return recheck != null && recheck > thresholdMs;
112
+ }
113
+ async function tick() {
114
+ if (deps.abortSignal?.aborted) {
115
+ return;
116
+ }
117
+ const settings = deps.getSettings();
118
+ const ownerShip = deps.getEffectiveOwnerShip(deps.accountId);
119
+ if (!ownerShip) {
120
+ return;
121
+ }
122
+ const activeHours = resolveActiveHours(settings, deps.cfg);
123
+ if (!inActiveHours(new Date(now()), activeHours)) {
124
+ return;
125
+ }
126
+ const lastOwnerAt = resolveLastOwnerInstant(deps.getLastOwnerActivity(deps.accountId), settings);
127
+ if (lastOwnerAt == null) {
128
+ return;
129
+ }
130
+ const idle = daysBetween(lastOwnerAt, now());
131
+ const targetStage = computeTargetStage(idle);
132
+ if (targetStage == null) {
133
+ return;
134
+ }
135
+ const freshStage = await resolveAuthoritativeStage();
136
+ if (targetStage <= freshStage) {
137
+ return;
138
+ }
139
+ try {
140
+ await pokeLastNudgeStage(targetStage);
141
+ }
142
+ catch (err) {
143
+ deps.runtime?.error?.(`[tlon] nudge: failed to advance lastNudgeStage to ${targetStage}: ${String(err)}`);
144
+ return;
145
+ }
146
+ // Pre-send recheck runs BEFORE committing the local shadow advance.
147
+ // If the owner reply handler ran during the poke await, it observed
148
+ // `shadowStage === 0` (we hadn't advanced yet) and `pending === null`,
149
+ // so `willClearStage` was false and it skipped the del-entry. We
150
+ // need to restore the stage-reset invariant ourselves: leave the
151
+ // shadow at whatever the handler set (0) and enqueue a stage clear
152
+ // through the ordered persistence queue so activity put-entries
153
+ // settle before the del-entry lands, matching the crash-consistency
154
+ // rules the handler normally observes.
155
+ if (ownerActivityAdvancedSince(lastOwnerAt)) {
156
+ deps.runtime?.log?.(`[tlon] nudge: owner replied between scry and send; clearing stage ${targetStage} for next cycle`);
157
+ deps.setLastNudgeStageShadow(deps.accountId, 0);
158
+ deps.ownerReplyPersistence?.enqueueStageClear();
159
+ return;
160
+ }
161
+ // Commit the advance now that we know we'll actually send. Placing
162
+ // this write after the recheck avoids leaving the shadow stuck at
163
+ // `targetStage` on the race above.
164
+ deps.setLastNudgeStageShadow(deps.accountId, targetStage);
165
+ const content = NUDGE_MESSAGES[targetStage];
166
+ const sentAt = now();
167
+ let sent = false;
168
+ try {
169
+ await deps.sendDm({
170
+ fromShip: deps.botShip,
171
+ toShip: ownerShip,
172
+ text: content,
173
+ botProfile: deps.getBotProfile?.(),
174
+ });
175
+ sent = true;
176
+ }
177
+ catch (sendErr) {
178
+ deps.runtime?.error?.(`[tlon] nudge: send failed after stage advance (stage ${targetStage}): ${String(sendErr)}`);
179
+ }
180
+ try {
181
+ deps.telemetry?.captureHeartbeatNudge({
182
+ ownerShip,
183
+ botShip: deps.botShip,
184
+ nudgeStage: targetStage,
185
+ nudgeTarget: ownerShip,
186
+ channel: "tlon",
187
+ success: sent,
188
+ accountId: deps.accountId,
189
+ });
190
+ }
191
+ catch (err) {
192
+ deps.runtime?.error?.(`[tlon] nudge: telemetry capture failed: ${String(err)}`);
193
+ }
194
+ if (sent) {
195
+ // Post-send recheck: the DM is already on the wire, but if the
196
+ // owner replied during the `await sendDm` we must not record a
197
+ // fresh `pendingNudge`. That record powers reply-context injection
198
+ // for the next 72h, and writing it after a real reply would
199
+ // misattribute their message to a nudge we sent moments later.
200
+ if (ownerActivityAdvancedSince(lastOwnerAt)) {
201
+ deps.runtime?.log?.(`[tlon] nudge: owner replied during stage ${targetStage} send; not recording pendingNudge`);
202
+ return;
203
+ }
204
+ try {
205
+ deps.setLocalPendingNudge(deps.accountId, {
206
+ sentAt,
207
+ stage: targetStage,
208
+ ownerShip,
209
+ accountId: deps.accountId,
210
+ content,
211
+ });
212
+ }
213
+ catch (err) {
214
+ deps.runtime?.error?.(`[tlon] nudge: setLocalPendingNudge failed: ${String(err)}`);
215
+ }
216
+ deps.runtime?.log?.(`[tlon] nudge: sent stage ${targetStage} to ${ownerShip}`);
217
+ }
218
+ }
219
+ const scheduler = createNudgeScheduler({
220
+ tick,
221
+ intervalMs,
222
+ abortSignal: deps.abortSignal,
223
+ log: (msg) => deps.runtime?.log?.(msg),
224
+ error: (msg) => deps.runtime?.error?.(msg),
225
+ });
226
+ return {
227
+ start: () => scheduler.start(),
228
+ stop: () => scheduler.stop(),
229
+ tickNow: () => scheduler.tickNow(),
230
+ };
231
+ }
232
+ //# sourceMappingURL=nudge-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nudge-runner.js","sourceRoot":"","sources":["../../../src/monitor/nudge-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Per-account in-memory shadows used by the nudge scheduler.
3
+ *
4
+ * The scheduler never consults the subscription-derived settings mirror for
5
+ * its stage guard or owner-activity check; both live here, updated
6
+ * synchronously by the monitor on observable events. See the plan for
7
+ * `TLON-5628` for the invariants these shadows enforce.
8
+ */
9
+ const ownerActivity = new Map();
10
+ const stageShadow = new Map();
11
+ export function setLastOwnerActivity(accountId, activity) {
12
+ if (activity == null) {
13
+ ownerActivity.delete(accountId);
14
+ return;
15
+ }
16
+ ownerActivity.set(accountId, activity);
17
+ }
18
+ export function getLastOwnerActivity(accountId) {
19
+ return ownerActivity.get(accountId) ?? null;
20
+ }
21
+ export function setLastNudgeStageShadow(accountId, stage) {
22
+ stageShadow.set(accountId, stage);
23
+ }
24
+ export function getLastNudgeStageShadow(accountId) {
25
+ return stageShadow.get(accountId) ?? null;
26
+ }
27
+ export function clearShadowsForAccount(accountId) {
28
+ ownerActivity.delete(accountId);
29
+ stageShadow.delete(accountId);
30
+ }
31
+ /**
32
+ * Derive a seed value for the owner-activity shadow from a loaded
33
+ * settings snapshot. Missing fields seed the shadow as absent.
34
+ */
35
+ export function ownerActivityFromSettings(settings) {
36
+ const at = typeof settings.lastOwnerMessageAt === "number" ? settings.lastOwnerMessageAt : null;
37
+ const date = typeof settings.lastOwnerMessageDate === "string" ? settings.lastOwnerMessageDate : null;
38
+ if (at != null && date != null) {
39
+ return { at, date };
40
+ }
41
+ if (at != null) {
42
+ return { at, date: new Date(at).toISOString().split("T")[0] ?? "" };
43
+ }
44
+ if (date != null) {
45
+ const parsed = Date.parse(date);
46
+ if (Number.isFinite(parsed)) {
47
+ return { at: parsed, date };
48
+ }
49
+ }
50
+ return null;
51
+ }
52
+ export const _testing = {
53
+ clearAll: () => {
54
+ ownerActivity.clear();
55
+ stageShadow.clear();
56
+ },
57
+ };
58
+ //# sourceMappingURL=nudge-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nudge-state.js","sourceRoot":"","sources":["../../../src/monitor/nudge-state.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,MAAM,aAAa,GAAG,IAAI,GAAG,EAA6B,CAAC;AAC3D,MAAM,WAAW,GAAG,IAAI,GAAG,EAAgC,CAAC;AAE5D,MAAM,UAAU,oBAAoB,CAAC,SAAiB,EAAE,QAAkC;IACxF,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACrB,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IACD,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,OAAO,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,SAAiB,EAAE,KAA2B;IACpF,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,SAAiB;IACvD,OAAO,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAChC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,QAA2B;IACnE,MAAM,EAAE,GAAG,OAAO,QAAQ,CAAC,kBAAkB,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;IAChG,MAAM,IAAI,GACR,OAAO,QAAQ,CAAC,oBAAoB,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC;IAE3F,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QAC/B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IACD,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACtE,CAAC;IACD,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,QAAQ,EAAE,GAAG,EAAE;QACb,aAAa,CAAC,KAAK,EAAE,CAAC;QACtB,WAAW,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACF,CAAC"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Ordered background queue for owner-reply %settings writes.
3
+ *
4
+ * The monitor's owner-message handler calls `enqueue` synchronously without
5
+ * awaiting. Inside each batch task, the two `put-entry` pokes
6
+ * (`lastOwnerMessageAt` + `lastOwnerMessageDate`) must settle before the
7
+ * optional `del-entry` (`lastNudgeStage`) is issued on the wire. That
8
+ * ordering is what keeps a mid-reply crash from landing the persistent
9
+ * state in "stage cleared, owner still idle", which could otherwise let a
10
+ * duplicate nudge fire on the next tick after restart.
11
+ */
12
+ export function createOwnerReplyPersistenceQueue(api, log = {}) {
13
+ let tail = Promise.resolve();
14
+ return {
15
+ enqueue(batch) {
16
+ tail = tail
17
+ .catch(() => undefined)
18
+ .then(async () => {
19
+ try {
20
+ await Promise.all([
21
+ api.poke({
22
+ app: "settings",
23
+ mark: "settings-event",
24
+ json: {
25
+ "put-entry": {
26
+ desk: "moltbot",
27
+ "bucket-key": "tlon",
28
+ "entry-key": "lastOwnerMessageAt",
29
+ value: batch.at,
30
+ },
31
+ },
32
+ }),
33
+ api.poke({
34
+ app: "settings",
35
+ mark: "settings-event",
36
+ json: {
37
+ "put-entry": {
38
+ desk: "moltbot",
39
+ "bucket-key": "tlon",
40
+ "entry-key": "lastOwnerMessageDate",
41
+ value: batch.date,
42
+ },
43
+ },
44
+ }),
45
+ ]);
46
+ if (batch.clearStage) {
47
+ await api.poke({
48
+ app: "settings",
49
+ mark: "settings-event",
50
+ json: {
51
+ "del-entry": {
52
+ desk: "moltbot",
53
+ "bucket-key": "tlon",
54
+ "entry-key": "lastNudgeStage",
55
+ },
56
+ },
57
+ });
58
+ }
59
+ }
60
+ catch (err) {
61
+ log.error?.(`[tlon] owner-reply persistence failed: ${String(err)}`);
62
+ }
63
+ });
64
+ },
65
+ enqueueStageClear() {
66
+ tail = tail
67
+ .catch(() => undefined)
68
+ .then(async () => {
69
+ try {
70
+ await api.poke({
71
+ app: "settings",
72
+ mark: "settings-event",
73
+ json: {
74
+ "del-entry": {
75
+ desk: "moltbot",
76
+ "bucket-key": "tlon",
77
+ "entry-key": "lastNudgeStage",
78
+ },
79
+ },
80
+ });
81
+ }
82
+ catch (err) {
83
+ log.error?.(`[tlon] owner-reply stage-clear failed: ${String(err)}`);
84
+ }
85
+ });
86
+ },
87
+ async flush() {
88
+ await tail;
89
+ },
90
+ };
91
+ }
92
+ //# sourceMappingURL=owner-reply-persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner-reply-persistence.js","sourceRoot":"","sources":["../../../src/monitor/owner-reply-persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA6BH,MAAM,UAAU,gCAAgC,CAC9C,GAAa,EACb,MAAyC,EAAE;IAE3C,IAAI,IAAI,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAE5C,OAAO;QACL,OAAO,CAAC,KAAiC;YACvC,IAAI,GAAG,IAAI;iBACR,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;iBACtB,IAAI,CAAC,KAAK,IAAI,EAAE;gBACf,IAAI,CAAC;oBACH,MAAM,OAAO,CAAC,GAAG,CAAC;wBAChB,GAAG,CAAC,IAAI,CAAC;4BACP,GAAG,EAAE,UAAU;4BACf,IAAI,EAAE,gBAAgB;4BACtB,IAAI,EAAE;gCACJ,WAAW,EAAE;oCACX,IAAI,EAAE,SAAS;oCACf,YAAY,EAAE,MAAM;oCACpB,WAAW,EAAE,oBAAoB;oCACjC,KAAK,EAAE,KAAK,CAAC,EAAE;iCAChB;6BACF;yBACF,CAAC;wBACF,GAAG,CAAC,IAAI,CAAC;4BACP,GAAG,EAAE,UAAU;4BACf,IAAI,EAAE,gBAAgB;4BACtB,IAAI,EAAE;gCACJ,WAAW,EAAE;oCACX,IAAI,EAAE,SAAS;oCACf,YAAY,EAAE,MAAM;oCACpB,WAAW,EAAE,sBAAsB;oCACnC,KAAK,EAAE,KAAK,CAAC,IAAI;iCAClB;6BACF;yBACF,CAAC;qBACH,CAAC,CAAC;oBAEH,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;wBACrB,MAAM,GAAG,CAAC,IAAI,CAAC;4BACb,GAAG,EAAE,UAAU;4BACf,IAAI,EAAE,gBAAgB;4BACtB,IAAI,EAAE;gCACJ,WAAW,EAAE;oCACX,IAAI,EAAE,SAAS;oCACf,YAAY,EAAE,MAAM;oCACpB,WAAW,EAAE,gBAAgB;iCAC9B;6BACF;yBACF,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,GAAG,CAAC,KAAK,EAAE,CAAC,0CAA0C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACvE,CAAC;YACH,CAAC,CAAC,CAAC;QACP,CAAC;QACD,iBAAiB;YACf,IAAI,GAAG,IAAI;iBACR,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;iBACtB,IAAI,CAAC,KAAK,IAAI,EAAE;gBACf,IAAI,CAAC;oBACH,MAAM,GAAG,CAAC,IAAI,CAAC;wBACb,GAAG,EAAE,UAAU;wBACf,IAAI,EAAE,gBAAgB;wBACtB,IAAI,EAAE;4BACJ,WAAW,EAAE;gCACX,IAAI,EAAE,SAAS;gCACf,YAAY,EAAE,MAAM;gCACpB,WAAW,EAAE,gBAAgB;6BAC9B;yBACF;qBACF,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,GAAG,CAAC,KAAK,EAAE,CAAC,0CAA0C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACvE,CAAC;YACH,CAAC,CAAC,CAAC;QACP,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,IAAI,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Serialize pending-nudge persistence so %settings writes land in-order.
3
+ */
4
+ export function createPendingNudgePersistenceQueue(write) {
5
+ let tail = Promise.resolve();
6
+ return {
7
+ enqueue(nudge) {
8
+ tail = tail.catch(() => undefined).then(() => write(nudge));
9
+ },
10
+ async flush() {
11
+ await tail;
12
+ },
13
+ };
14
+ }
15
+ //# sourceMappingURL=pending-nudge-persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending-nudge-persistence.js","sourceRoot":"","sources":["../../../src/monitor/pending-nudge-persistence.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,UAAU,kCAAkC,CAAC,KAAwB;IACzE,IAAI,IAAI,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAE5C,OAAO;QACL,OAAO,CAAC,KAA0B;YAChC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,IAAI,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Pure helper for settings mirror synchronization.
3
+ *
4
+ * Detects ownerShip and pendingNudge transitions from the settings mirror.
5
+ * The scheduler no longer routes through this helper for lastNudgeStage —
6
+ * the authoritative stage lives in a fresh scry plus a local shadow.
7
+ */
8
+ import { normalizeShip } from "../targets.js";
9
+ export function resolveSettingsMirrorSync(params) {
10
+ const { prevSettings, newSettings, fileConfigOwnerShip } = params;
11
+ // ownerShip: compare string values (normalize for comparison)
12
+ const prevOwner = prevSettings.ownerShip;
13
+ const newOwner = newSettings.ownerShip;
14
+ const normalizedPrevOwner = prevOwner ? normalizeShip(prevOwner) : null;
15
+ const normalizedNewOwner = newOwner ? normalizeShip(newOwner) : null;
16
+ const ownerShipChanged = normalizedPrevOwner !== normalizedNewOwner;
17
+ const effectiveOwnerShip = normalizedNewOwner ?? fileConfigOwnerShip;
18
+ // pendingNudge: reference equality since applySettingsUpdate uses shallow spread
19
+ const pendingNudgeChanged = prevSettings.pendingNudge !== newSettings.pendingNudge;
20
+ const pendingNudge = newSettings.pendingNudge ?? null;
21
+ return {
22
+ ownerShipChanged,
23
+ effectiveOwnerShip,
24
+ pendingNudgeChanged,
25
+ pendingNudge,
26
+ };
27
+ }
28
+ //# sourceMappingURL=settings-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-sync.js","sourceRoot":"","sources":["../../../src/monitor/settings-sync.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAS9C,MAAM,UAAU,yBAAyB,CAAC,MAIzC;IACC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAAC;IAElE,8DAA8D;IAC9D,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC;IACzC,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC;IACvC,MAAM,mBAAmB,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxE,MAAM,kBAAkB,GAAG,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrE,MAAM,gBAAgB,GAAG,mBAAmB,KAAK,kBAAkB,CAAC;IACpE,MAAM,kBAAkB,GAAkB,kBAAkB,IAAI,mBAAmB,CAAC;IAEpF,iFAAiF;IACjF,MAAM,mBAAmB,GAAG,YAAY,CAAC,YAAY,KAAK,WAAW,CAAC,YAAY,CAAC;IACnF,MAAM,YAAY,GAAwB,WAAW,CAAC,YAAY,IAAI,IAAI,CAAC;IAE3E,OAAO;QACL,gBAAgB;QAChB,kBAAkB;QAClB,mBAAmB;QACnB,YAAY;KACb,CAAC;AACJ,CAAC"}
@@ -65,10 +65,6 @@ export function isBotMentioned(messageText, botShipName, nickname) {
65
65
  if (!messageText || !botShipName) {
66
66
  return false;
67
67
  }
68
- // Check for @all mention
69
- if (/@all\b/i.test(messageText)) {
70
- return true;
71
- }
72
68
  // Check for ship mention
73
69
  const normalizedBotShip = normalizeShip(botShipName);
74
70
  const escapedShip = normalizedBotShip.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/monitor/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/monitor/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Candidate send state for two-signal nudge confirmation.
3
+ *
4
+ * A successful `message:sent` to ownerShip during a heartbeat session is stored
5
+ * as a "candidate" here. The candidate is only promoted to a confirmed nudge
6
+ * when it is paired with a matching `lastNudgeStage` settings-store update,
7
+ * regardless of which signal arrives first.
8
+ *
9
+ * Keyed by accountId — each account has at most one candidate at a time.
10
+ */
11
+ /** TTL for unconfirmed candidates (10 minutes). Longer than the 5-minute settings refresh interval to give the stale-subscription fallback time to deliver a missed lastNudgeStage update. */
12
+ const CANDIDATE_TTL_MS = 10 * 60 * 1000;
13
+ const candidates = new Map();
14
+ const pendingStageSignals = new Map();
15
+ const confirmationCallbacks = new Map();
16
+ function isNudgeStage(stage) {
17
+ return stage === 1 || stage === 2 || stage === 3;
18
+ }
19
+ function cleanupStaleCandidates(now = Date.now()) {
20
+ for (const [key, candidate] of candidates) {
21
+ if (now - candidate.sentAt > CANDIDATE_TTL_MS) {
22
+ candidates.delete(key);
23
+ }
24
+ }
25
+ }
26
+ function cleanupStaleStageSignals(now = Date.now()) {
27
+ for (const [key, signal] of pendingStageSignals) {
28
+ if (now - signal.observedAt > CANDIDATE_TTL_MS) {
29
+ pendingStageSignals.delete(key);
30
+ }
31
+ }
32
+ }
33
+ function buildConfirmedNudge(candidate, stage) {
34
+ return {
35
+ accountId: candidate.accountId,
36
+ sessionKey: candidate.sessionKey,
37
+ sentAt: candidate.sentAt,
38
+ ownerShip: candidate.ownerShip,
39
+ nudgeStage: stage,
40
+ content: candidate.content,
41
+ provider: candidate.provider,
42
+ model: candidate.model,
43
+ };
44
+ }
45
+ function emitConfirmedNudge(accountId, confirmed) {
46
+ if (confirmed) {
47
+ confirmationCallbacks.get(accountId)?.(confirmed);
48
+ }
49
+ return confirmed;
50
+ }
51
+ function consumePendingConfirmation(accountId) {
52
+ const candidate = candidates.get(accountId);
53
+ const signal = pendingStageSignals.get(accountId);
54
+ if (!candidate || !signal) {
55
+ return null;
56
+ }
57
+ candidates.delete(accountId);
58
+ pendingStageSignals.delete(accountId);
59
+ return buildConfirmedNudge(candidate, signal.stage);
60
+ }
61
+ export function setCandidateSend(accountId, candidate) {
62
+ cleanupStaleCandidates();
63
+ cleanupStaleStageSignals();
64
+ // Always keep the most recent candidate — if the same heartbeat session
65
+ // produces multiple owner-targeted sends, we attribute to the latest one.
66
+ candidates.set(accountId, candidate);
67
+ return emitConfirmedNudge(accountId, consumePendingConfirmation(accountId));
68
+ }
69
+ export function getCandidateSend(accountId) {
70
+ cleanupStaleCandidates();
71
+ cleanupStaleStageSignals();
72
+ return candidates.get(accountId) ?? null;
73
+ }
74
+ export function clearCandidateSend(accountId) {
75
+ candidates.delete(accountId);
76
+ pendingStageSignals.delete(accountId);
77
+ }
78
+ /** Clear all candidate state (shutdown cleanup). */
79
+ export function clearAllCandidates() {
80
+ candidates.clear();
81
+ pendingStageSignals.clear();
82
+ }
83
+ export function confirmNudgeCandidate(accountId, lastNudgeStage) {
84
+ cleanupStaleCandidates();
85
+ cleanupStaleStageSignals();
86
+ if (!isNudgeStage(lastNudgeStage)) {
87
+ return null;
88
+ }
89
+ pendingStageSignals.set(accountId, {
90
+ stage: lastNudgeStage,
91
+ observedAt: Date.now(),
92
+ });
93
+ return emitConfirmedNudge(accountId, consumePendingConfirmation(accountId));
94
+ }
95
+ export function registerConfirmedNudgeCallback(accountId, cb) {
96
+ confirmationCallbacks.set(accountId, cb);
97
+ }
98
+ export function clearConfirmedNudgeCallback(accountId) {
99
+ confirmationCallbacks.delete(accountId);
100
+ }
101
+ export const _testing = {
102
+ clearAll: () => {
103
+ candidates.clear();
104
+ pendingStageSignals.clear();
105
+ confirmationCallbacks.clear();
106
+ },
107
+ getCandidateTtlMs: () => CANDIDATE_TTL_MS,
108
+ };
109
+ //# sourceMappingURL=nudge-candidate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nudge-candidate.js","sourceRoot":"","sources":["../../src/nudge-candidate.ts"],"names":[],"mappings":"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"}