@tinycloud/courier 0.1.6-beta.9 → 0.2.0-beta.32
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 +99 -1
- package/dist/args.js +1 -1
- package/dist/args.js.map +1 -1
- package/dist/defer.d.ts +6 -0
- package/dist/defer.js +11 -0
- package/dist/defer.js.map +1 -0
- package/dist/inbox.js +2 -1
- package/dist/inbox.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/keys.d.ts +6 -0
- package/dist/keys.js +6 -0
- package/dist/keys.js.map +1 -1
- package/dist/main.js +20 -1
- package/dist/main.js.map +1 -1
- package/dist/node.d.ts +7 -0
- package/dist/node.js +26 -1
- package/dist/node.js.map +1 -1
- package/dist/service.d.ts +34 -0
- package/dist/service.js +124 -0
- package/dist/service.js.map +1 -0
- package/dist/store.d.ts +4 -2
- package/dist/store.js +14 -3
- package/dist/store.js.map +1 -1
- package/dist/wake.d.ts +80 -0
- package/dist/wake.js +213 -0
- package/dist/wake.js.map +1 -0
- package/dist/watch-cmd.d.ts +15 -0
- package/dist/watch-cmd.js +229 -0
- package/dist/watch-cmd.js.map +1 -0
- package/dist/watch.d.ts +140 -0
- package/dist/watch.js +590 -0
- package/dist/watch.js.map +1 -0
- package/package.json +3 -3
package/dist/watch.js
ADDED
|
@@ -0,0 +1,590 @@
|
|
|
1
|
+
import { defer } from './defer.js';
|
|
2
|
+
import { decodeTime, ulid } from 'ulid';
|
|
3
|
+
import { errInfo, CourierError } from './errors.js';
|
|
4
|
+
import { k, PREFIX } from './keys.js';
|
|
5
|
+
import { isRecord, messageView, oneLine, taskView } from './a2a.js';
|
|
6
|
+
import { commitReceipts, selectUndelivered } from './inbox.js';
|
|
7
|
+
import { del, getJson, listAll, putCreate, putMatch, putOverwrite } from './store.js';
|
|
8
|
+
/** Spec §8. inform and receipts never wake; a message with no valid intent is delivered but never wakes. */
|
|
9
|
+
const WAKE_INTENTS = new Set(['request', 'ask', 'answer', 'update']);
|
|
10
|
+
const TERMINAL_TASK_STATES = new Set([
|
|
11
|
+
'TASK_STATE_COMPLETED', 'TASK_STATE_FAILED', 'TASK_STATE_CANCELED', 'TASK_STATE_REJECTED',
|
|
12
|
+
]);
|
|
13
|
+
const WAKEN_MEMORY = 500;
|
|
14
|
+
const WAKE_RETRY_MS = 60_000;
|
|
15
|
+
/** Delay between starting a re-opened subscription and its catch-up list, so the stream is live first. */
|
|
16
|
+
const RECONNECT_CATCH_UP_MS = 2000;
|
|
17
|
+
/** Adapter runs are capped at 30 min in total (`--wake-timeout`, one deadline across all its calls). This profile's own claim is respected 35 min unless its holder is provably gone; another profile's or machine's, 45. */
|
|
18
|
+
const OWN_CLAIM_LEASE_MS = 35 * 60_000;
|
|
19
|
+
/** Another profile or machine: the same plus a margin for clock skew (`at` is the claimer's own clock). */
|
|
20
|
+
const FOREIGN_CLAIM_LEASE_MS = 45 * 60_000;
|
|
21
|
+
/** A thread another watcher is waking is looked at again after this. */
|
|
22
|
+
const CLAIM_SKIP_MS = 30_000;
|
|
23
|
+
const DAY_MS = 24 * 3600 * 1000;
|
|
24
|
+
/** The subject is peer-controlled text that reaches state, prompts and environments: one line, control characters removed, capped. */
|
|
25
|
+
const MAX_SUBJECT = 200;
|
|
26
|
+
/** Thread and message ids come from key names the peer controls; they reach prompts and argv, so only ULID-like ids pass. */
|
|
27
|
+
const SAFE_ID = /^[0-9A-Za-z_-]{1,64}$/;
|
|
28
|
+
export const WATCH_DEFAULTS = { debounceMs: 30_000, pollMs: 60_000, ticketSeconds: 25 };
|
|
29
|
+
export function emptyWatchState() {
|
|
30
|
+
return { v: 1, pending: {}, woken: [], approvalsSeen: [] };
|
|
31
|
+
}
|
|
32
|
+
/** Wake time: `debounce` after the latest message, but never later than twice `debounce` after the first. */
|
|
33
|
+
export function wakeDueAt(pending, debounceMs) {
|
|
34
|
+
return Math.min(pending.lastSeenAt + debounceMs, pending.firstSeenAt + 2 * debounceMs);
|
|
35
|
+
}
|
|
36
|
+
export function sentAtOf(messageId) {
|
|
37
|
+
try {
|
|
38
|
+
return new Date(decodeTime(messageId)).toISOString();
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return '';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Signal 0 only probes: ESRCH = gone, EPERM = alive but not ours. */
|
|
45
|
+
function pidAlive(pid) {
|
|
46
|
+
try {
|
|
47
|
+
process.kill(pid, 0);
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
return error.code === 'EPERM';
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function sleep(ms, signal) {
|
|
55
|
+
const { promise, resolve } = defer();
|
|
56
|
+
if (signal.aborted)
|
|
57
|
+
return Promise.resolve();
|
|
58
|
+
const done = () => {
|
|
59
|
+
clearTimeout(timer);
|
|
60
|
+
signal.removeEventListener('abort', done);
|
|
61
|
+
resolve();
|
|
62
|
+
};
|
|
63
|
+
const timer = setTimeout(done, ms);
|
|
64
|
+
signal.addEventListener('abort', done, { once: true });
|
|
65
|
+
return promise;
|
|
66
|
+
}
|
|
67
|
+
export class Watcher {
|
|
68
|
+
deps;
|
|
69
|
+
opts;
|
|
70
|
+
state = emptyWatchState();
|
|
71
|
+
retryAt = new Map();
|
|
72
|
+
waking = new Set();
|
|
73
|
+
/** Unique to this run: a claim with this id is this process's own. */
|
|
74
|
+
runId = ulid();
|
|
75
|
+
profileId;
|
|
76
|
+
pid;
|
|
77
|
+
isAlive;
|
|
78
|
+
lastClaimPrune = 0;
|
|
79
|
+
/** Set when another watcher is writing this profile's state: this one stops and `run` throws it. */
|
|
80
|
+
fatalError;
|
|
81
|
+
onFatal;
|
|
82
|
+
/** Etag of me/state/watch.json as this watcher last saw it: null = absent, undefined = unknown (fetch before writing). */
|
|
83
|
+
stateEtag;
|
|
84
|
+
taskCache = new Map();
|
|
85
|
+
metaMirrored = new Set();
|
|
86
|
+
syncing = new Map();
|
|
87
|
+
stateQueue = Promise.resolve();
|
|
88
|
+
now;
|
|
89
|
+
constructor(deps, opts = WATCH_DEFAULTS) {
|
|
90
|
+
this.deps = deps;
|
|
91
|
+
this.opts = opts;
|
|
92
|
+
this.now = deps.now ?? Date.now;
|
|
93
|
+
this.profileId = deps.holder?.profileId ?? this.runId;
|
|
94
|
+
this.pid = deps.holder?.pid ?? process.pid;
|
|
95
|
+
this.isAlive = deps.holder?.isAlive ?? pidAlive;
|
|
96
|
+
}
|
|
97
|
+
// ---------- state ----------
|
|
98
|
+
async loadState() {
|
|
99
|
+
const got = await getJson(this.deps.selfKv, k.watchState);
|
|
100
|
+
const value = got?.value;
|
|
101
|
+
this.stateEtag = got?.etag ?? null;
|
|
102
|
+
this.state = isRecord(value) && value.v === 1
|
|
103
|
+
? { ...emptyWatchState(), ...value }
|
|
104
|
+
: emptyWatchState();
|
|
105
|
+
}
|
|
106
|
+
snapshot() {
|
|
107
|
+
return structuredClone(this.state);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Serialised: callers mutate `this.state` inside `fn`, then it is written with if-match against the etag this
|
|
111
|
+
* watcher last saw. A second `watch` on the same profile therefore fails with `state-conflict` instead of
|
|
112
|
+
* silently overwriting (last writer wins) the other's pending wakes.
|
|
113
|
+
*/
|
|
114
|
+
mutate(fn) {
|
|
115
|
+
const run = this.stateQueue.then(async () => {
|
|
116
|
+
const result = fn();
|
|
117
|
+
const { selfKv } = this.deps;
|
|
118
|
+
if (this.stateEtag === undefined)
|
|
119
|
+
this.stateEtag = (await getJson(selfKv, k.watchState))?.etag ?? null;
|
|
120
|
+
try {
|
|
121
|
+
const written = this.stateEtag
|
|
122
|
+
? await putMatch(selfKv, k.watchState, this.state, this.stateEtag)
|
|
123
|
+
: await putCreate(selfKv, k.watchState, this.state);
|
|
124
|
+
this.stateEtag = written ?? undefined;
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
if (error instanceof CourierError && error.code === 'conflict') {
|
|
128
|
+
throw this.stateConflict('me/state/watch.json was changed by another process; a second `watch` is running for this profile. This watcher is stopping.');
|
|
129
|
+
}
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
return result;
|
|
133
|
+
});
|
|
134
|
+
this.stateQueue = run.catch(() => undefined);
|
|
135
|
+
return run;
|
|
136
|
+
}
|
|
137
|
+
/** Another watcher owns this profile's state. Carrying on would double-wake and overwrite its pending wakes: stop. */
|
|
138
|
+
stateConflict(message) {
|
|
139
|
+
const conflict = new CourierError('state-conflict', message);
|
|
140
|
+
this.fatalError ??= conflict;
|
|
141
|
+
this.onFatal?.();
|
|
142
|
+
return conflict;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* One create-only marker per wake (keyed by the first message or approval it carries), so a second watcher that
|
|
146
|
+
* runs while this one's wake is in flight cannot wake the same thing. The marker names its holder
|
|
147
|
+
* (`profile`, `run`, `pid`):
|
|
148
|
+
* - this run's own marker: reuse it;
|
|
149
|
+
* - same profile and machine, holder pid gone or equal to ours (restart, crash, reboot, pid 1 in a container): take it over at once;
|
|
150
|
+
* - same profile and machine, holder pid alive and different: another watcher is running now: skip the thread (the
|
|
151
|
+
* state etag stops the loser when it writes state), unless the claim outlived the own lease (pid reuse);
|
|
152
|
+
* - another profile or machine: skip until the lease (plus clock-skew margin) runs out, then take it over.
|
|
153
|
+
* Returns false when the thread must be skipped this tick. Markers are deleted when the adapter fails.
|
|
154
|
+
*/
|
|
155
|
+
async claimWake(peer, threadId, firstId) {
|
|
156
|
+
const { selfKv, log } = this.deps;
|
|
157
|
+
const key = k.wakeClaim(peer, threadId, firstId);
|
|
158
|
+
const claim = { v: 1, profile: this.profileId, run: this.runId, pid: this.pid, at: new Date(this.now()).toISOString() };
|
|
159
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
160
|
+
try {
|
|
161
|
+
await putCreate(selfKv, key, claim);
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
if (!(error instanceof CourierError && error.code === 'conflict'))
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
const existing = await getJson(selfKv, key);
|
|
169
|
+
if (!existing)
|
|
170
|
+
continue; // released between our two calls
|
|
171
|
+
const held = existing.value;
|
|
172
|
+
let takeOver;
|
|
173
|
+
if (held.run === this.runId)
|
|
174
|
+
return true;
|
|
175
|
+
const age = typeof held.at === 'string' ? this.now() - Date.parse(held.at) : Infinity;
|
|
176
|
+
if (held.profile === this.profileId) {
|
|
177
|
+
// Same profile, same machine, so the same clock. A pid proves liveness only while it is not reused: a live pid
|
|
178
|
+
// that is not a watcher (pid reuse, another user's process), or this very pid number (pid 1 in a container
|
|
179
|
+
// after a restart), would otherwise stall the thread, so the own-profile lease is the backstop.
|
|
180
|
+
if (typeof held.pid !== 'number')
|
|
181
|
+
takeOver = 'no-pid';
|
|
182
|
+
else if (held.pid === this.pid)
|
|
183
|
+
takeOver = 'same-pid';
|
|
184
|
+
else if (!this.isAlive(held.pid))
|
|
185
|
+
takeOver = 'holder-dead';
|
|
186
|
+
else if (!(age < OWN_CLAIM_LEASE_MS))
|
|
187
|
+
takeOver = 'own-lease-expired';
|
|
188
|
+
}
|
|
189
|
+
else if (!(age < FOREIGN_CLAIM_LEASE_MS)) {
|
|
190
|
+
takeOver = 'lease-expired';
|
|
191
|
+
}
|
|
192
|
+
if (takeOver && existing.etag) {
|
|
193
|
+
try {
|
|
194
|
+
await putMatch(selfKv, key, claim, existing.etag);
|
|
195
|
+
log('claim-taken-over', { peer, threadId, reason: takeOver });
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
if (!(error instanceof CourierError && error.code === 'conflict'))
|
|
200
|
+
throw error;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
log('claimed-elsewhere', { peer, threadId, messageId: firstId });
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
/** Drops this run's own claim (best effort): a failed wake must not keep the thread from being woken. */
|
|
209
|
+
async releaseClaim(peer, threadId, firstId) {
|
|
210
|
+
const key = k.wakeClaim(peer, threadId, firstId);
|
|
211
|
+
try {
|
|
212
|
+
const existing = await getJson(this.deps.selfKv, key);
|
|
213
|
+
if (existing?.value.run === this.runId)
|
|
214
|
+
await del(this.deps.selfKv, key);
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
this.deps.log('sync-error', { source: 'claim-release', ...errInfo(error) });
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/** Claim markers are only needed while a double wake is possible; drop those older than two days. */
|
|
221
|
+
async pruneClaims() {
|
|
222
|
+
try {
|
|
223
|
+
for (const key of await listAll(this.deps.selfKv, k.wakeClaimsPrefix)) {
|
|
224
|
+
const id = /\/([^/]+)\.json$/.exec(key)?.[1];
|
|
225
|
+
const sentAt = id ? Date.parse(sentAtOf(id)) : NaN;
|
|
226
|
+
if (Number.isFinite(sentAt) && this.now() - sentAt > 2 * DAY_MS)
|
|
227
|
+
await del(this.deps.selfKv, key);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
this.deps.log('sync-error', { source: 'claims', ...errInfo(error) });
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// ---------- catch-up and delivery ----------
|
|
235
|
+
/** Serialises syncs per peer; a request that arrives mid-sync reruns once after it. */
|
|
236
|
+
async sync(peer, via) {
|
|
237
|
+
const running = this.syncing.get(peer.handle);
|
|
238
|
+
if (running) {
|
|
239
|
+
running.again = true;
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const entry = { again: false, via };
|
|
243
|
+
this.syncing.set(peer.handle, entry);
|
|
244
|
+
try {
|
|
245
|
+
do {
|
|
246
|
+
entry.again = false;
|
|
247
|
+
try {
|
|
248
|
+
await this.syncPeer(peer, entry.via);
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
this.deps.log('sync-error', { peer: peer.handle, ...errInfo(error) });
|
|
252
|
+
}
|
|
253
|
+
} while (entry.again);
|
|
254
|
+
}
|
|
255
|
+
finally {
|
|
256
|
+
this.syncing.delete(peer.handle);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
async syncPeer(peer, via) {
|
|
260
|
+
if (peer.status !== 'paired' || !peer.inbound || !peer.theirHandleForMe)
|
|
261
|
+
return;
|
|
262
|
+
const { selfKv, log } = this.deps;
|
|
263
|
+
const mailbox = peer.theirHandleForMe;
|
|
264
|
+
const peerKv = await this.deps.kvFor(peer);
|
|
265
|
+
const keys = await listAll(peerKv, `${PREFIX}/to/${mailbox}/threads/`);
|
|
266
|
+
const receipts = (await getJson(selfKv, k.receipts(peer.handle)))?.value ?? { v: 1, threads: {} };
|
|
267
|
+
receipts.threads ??= {};
|
|
268
|
+
const delivered = [];
|
|
269
|
+
for (const selected of selectUndelivered(keys, receipts)) {
|
|
270
|
+
if (!SAFE_ID.test(selected.threadId) || !SAFE_ID.test(selected.messageId)) {
|
|
271
|
+
log('ignored', { peer: peer.handle, reason: 'unsafe-id' });
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
try {
|
|
275
|
+
const got = await getJson(peerKv, selected.key);
|
|
276
|
+
if (!got)
|
|
277
|
+
continue;
|
|
278
|
+
const value = got.value;
|
|
279
|
+
if (!isRecord(value) || value.messageId !== selected.messageId || value.contextId !== selected.threadId)
|
|
280
|
+
continue;
|
|
281
|
+
await this.mirrorCreate(k.mirrorMsg(peer.handle, selected.threadId, selected.messageId), value);
|
|
282
|
+
delivered.push({ threadId: selected.threadId, messageId: selected.messageId, intent: messageView(value).intent });
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
// Not delivered, so no receipt: this message is retried on the next sync; the others go ahead.
|
|
286
|
+
log('sync-error', { peer: peer.handle, messageId: selected.messageId, ...errInfo(error) });
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
if (!delivered.length) {
|
|
290
|
+
await this.mirrorThreads(peer, peerKv, keys);
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
const subjects = new Map();
|
|
294
|
+
for (const threadId of new Set(delivered.map((d) => d.threadId))) {
|
|
295
|
+
const meta = await getJson(peerKv, `${PREFIX}/to/${mailbox}/threads/${threadId}/meta.json`).catch(() => undefined);
|
|
296
|
+
subjects.set(threadId, isRecord(meta?.value) && typeof meta.value.subject === 'string' ? oneLine(meta.value.subject, MAX_SUBJECT) : '(no subject)');
|
|
297
|
+
}
|
|
298
|
+
const at = this.now();
|
|
299
|
+
for (const item of delivered) {
|
|
300
|
+
const sentAt = sentAtOf(item.messageId);
|
|
301
|
+
log('delivered', {
|
|
302
|
+
via, peer: peer.handle, threadId: item.threadId, messageId: item.messageId, intent: item.intent ?? null,
|
|
303
|
+
wakes: Boolean(item.intent && WAKE_INTENTS.has(item.intent)),
|
|
304
|
+
sentAt, latencyMs: sentAt ? at - Date.parse(sentAt) : null,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
await this.mutate(() => {
|
|
308
|
+
for (const item of delivered) {
|
|
309
|
+
if (!item.intent || !WAKE_INTENTS.has(item.intent) || this.state.woken.includes(item.messageId))
|
|
310
|
+
continue;
|
|
311
|
+
const key = `${peer.handle}/${item.threadId}`;
|
|
312
|
+
const entry = this.state.pending[key] ??= {
|
|
313
|
+
peer: peer.handle, threadId: item.threadId, subject: subjects.get(item.threadId), messages: [], firstSeenAt: at, lastSeenAt: at,
|
|
314
|
+
};
|
|
315
|
+
if (entry.messages.some((m) => m.messageId === item.messageId))
|
|
316
|
+
continue;
|
|
317
|
+
entry.messages.push({ messageId: item.messageId, intent: item.intent, sentAt: sentAtOf(item.messageId) });
|
|
318
|
+
entry.lastSeenAt = at;
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
await commitReceipts(selfKv, new Map([[peer.handle, delivered.map(({ threadId, messageId }) => ({ threadId, messageId }))]]));
|
|
322
|
+
await this.mirrorThreads(peer, peerKv, keys);
|
|
323
|
+
}
|
|
324
|
+
async mirrorCreate(key, value) {
|
|
325
|
+
try {
|
|
326
|
+
await putCreate(this.deps.selfKv, key, value);
|
|
327
|
+
}
|
|
328
|
+
catch (error) {
|
|
329
|
+
if (!(error instanceof CourierError && error.code === 'conflict'))
|
|
330
|
+
throw error;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* meta.json is immutable (create-only); tasks are mutable, so copy the latest until they are terminal. Runs after
|
|
335
|
+
* message delivery and each item is isolated: a bad or unwritable peer task never blocks receipts or wakes.
|
|
336
|
+
*/
|
|
337
|
+
async mirrorThreads(peer, peerKv, keys) {
|
|
338
|
+
for (const key of keys) {
|
|
339
|
+
try {
|
|
340
|
+
await this.mirrorThreadItem(peer, peerKv, key);
|
|
341
|
+
}
|
|
342
|
+
catch (error) {
|
|
343
|
+
this.deps.log('mirror-error', { peer: peer.handle, ...errInfo(error) });
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
async mirrorThreadItem(peer, peerKv, key) {
|
|
348
|
+
const meta = /\/threads\/([^/]+)\/meta\.json$/.exec(key);
|
|
349
|
+
if (meta) {
|
|
350
|
+
if (!SAFE_ID.test(meta[1]))
|
|
351
|
+
return;
|
|
352
|
+
if (this.metaMirrored.has(key))
|
|
353
|
+
return;
|
|
354
|
+
const got = await getJson(peerKv, key);
|
|
355
|
+
if (!got)
|
|
356
|
+
return;
|
|
357
|
+
await this.mirrorCreate(k.mirrorMeta(peer.handle, meta[1]), got.value);
|
|
358
|
+
this.metaMirrored.add(key);
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
const task = /\/threads\/([^/]+)\/task\/([^/]+)\.json$/.exec(key);
|
|
362
|
+
if (!task || !SAFE_ID.test(task[1]) || !SAFE_ID.test(task[2]))
|
|
363
|
+
return;
|
|
364
|
+
const cached = this.taskCache.get(key);
|
|
365
|
+
if (cached?.terminal)
|
|
366
|
+
return;
|
|
367
|
+
const got = await getJson(peerKv, key);
|
|
368
|
+
if (!got)
|
|
369
|
+
return;
|
|
370
|
+
if (cached && got.etag && cached.etag === got.etag)
|
|
371
|
+
return;
|
|
372
|
+
await putOverwrite(this.deps.selfKv, k.mirrorTask(peer.handle, task[1], task[2]), got.value);
|
|
373
|
+
const state = taskView(got.value).state;
|
|
374
|
+
this.taskCache.set(key, { etag: got.etag, terminal: Boolean(state && TERMINAL_TASK_STATES.has(state)) });
|
|
375
|
+
}
|
|
376
|
+
/** Own `me/approvals/`: record new decisions (the wake on them is added with `courier approval`). */
|
|
377
|
+
async syncApprovals(via) {
|
|
378
|
+
let fresh = [];
|
|
379
|
+
try {
|
|
380
|
+
const keys = await listAll(this.deps.selfKv, k.approvalsPrefix);
|
|
381
|
+
const ids = keys.map((key) => /\/([^/]+)\.json$/.exec(key)?.[1]).filter((id) => Boolean(id));
|
|
382
|
+
fresh = ids.filter((id) => !this.state.approvalsSeen.includes(id));
|
|
383
|
+
if (fresh.length) {
|
|
384
|
+
await this.mutate(() => {
|
|
385
|
+
this.state.approvalsSeen = [...new Set([...this.state.approvalsSeen, ...fresh])].sort();
|
|
386
|
+
});
|
|
387
|
+
for (const id of fresh)
|
|
388
|
+
this.deps.log('approval-seen', { via, approvalId: id });
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
catch (error) {
|
|
392
|
+
this.deps.log('sync-error', { source: 'approvals', ...errInfo(error) });
|
|
393
|
+
}
|
|
394
|
+
return fresh;
|
|
395
|
+
}
|
|
396
|
+
// ---------- wake ----------
|
|
397
|
+
/** Wake every thread whose debounce has elapsed (`force`: all of them now). Threads wake in parallel, one wake per thread at a time. */
|
|
398
|
+
async tick(force = false) {
|
|
399
|
+
if (this.fatalError)
|
|
400
|
+
return;
|
|
401
|
+
const at = this.now();
|
|
402
|
+
const runs = [];
|
|
403
|
+
for (const [key, pending] of Object.entries(this.state.pending)) {
|
|
404
|
+
if (this.waking.has(key))
|
|
405
|
+
continue;
|
|
406
|
+
if (!force && wakeDueAt(pending, this.opts.debounceMs) > at)
|
|
407
|
+
continue;
|
|
408
|
+
if (!force && (this.retryAt.get(key) ?? 0) > at)
|
|
409
|
+
continue;
|
|
410
|
+
this.waking.add(key);
|
|
411
|
+
runs.push(this.wakeThread(key, pending, at).finally(() => this.waking.delete(key)));
|
|
412
|
+
}
|
|
413
|
+
await Promise.all(runs);
|
|
414
|
+
}
|
|
415
|
+
async wakeThread(key, pending, at) {
|
|
416
|
+
// Messages that land while the wake runs stay pending for the next one, so wake exactly this snapshot.
|
|
417
|
+
const messages = [...pending.messages];
|
|
418
|
+
const woken = messages.map((m) => m.messageId);
|
|
419
|
+
const oldestSentAt = messages[0]?.sentAt ?? '';
|
|
420
|
+
// The per-wake claim goes first: a watcher that loses it skips the thread without having written the state, which
|
|
421
|
+
// would otherwise make the watcher that legitimately owns the wake fail its next conditional write. Then the
|
|
422
|
+
// state write: a stale second watcher fails that conditional write and stops before it can wake.
|
|
423
|
+
const claimId = woken[0];
|
|
424
|
+
if (!(await this.claimWake(pending.peer, pending.threadId, claimId))) {
|
|
425
|
+
this.retryAt.set(key, at + CLAIM_SKIP_MS);
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
try {
|
|
429
|
+
await this.mutate(() => { });
|
|
430
|
+
}
|
|
431
|
+
catch (error) {
|
|
432
|
+
await this.releaseClaim(pending.peer, pending.threadId, claimId);
|
|
433
|
+
throw error;
|
|
434
|
+
}
|
|
435
|
+
const startedAt = this.now();
|
|
436
|
+
// `waking` is when the adapter is invoked: the send-to-wake latency. `woke` follows when the adapter returns.
|
|
437
|
+
this.deps.log('waking', {
|
|
438
|
+
peer: pending.peer, threadId: pending.threadId, messageIds: woken,
|
|
439
|
+
oldestSentAt: oldestSentAt || null,
|
|
440
|
+
wakeLatencyMs: oldestSentAt ? startedAt - Date.parse(oldestSentAt) : null,
|
|
441
|
+
});
|
|
442
|
+
try {
|
|
443
|
+
await this.deps.wake({ peer: pending.peer, threadId: pending.threadId, subject: pending.subject, messages });
|
|
444
|
+
}
|
|
445
|
+
catch (error) {
|
|
446
|
+
this.retryAt.set(key, at + WAKE_RETRY_MS);
|
|
447
|
+
this.deps.log('wake-error', { peer: pending.peer, threadId: pending.threadId, ...errInfo(error) });
|
|
448
|
+
// The attempt failed, so the thread is not being woken: release the claim (a restart must not wait for it).
|
|
449
|
+
await this.releaseClaim(pending.peer, pending.threadId, claimId);
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
await this.mutate(() => {
|
|
453
|
+
const current = this.state.pending[key];
|
|
454
|
+
if (current) {
|
|
455
|
+
current.messages = current.messages.filter((m) => !woken.includes(m.messageId));
|
|
456
|
+
if (!current.messages.length)
|
|
457
|
+
delete this.state.pending[key];
|
|
458
|
+
}
|
|
459
|
+
this.state.woken = [...this.state.woken, ...woken].slice(-WAKEN_MEMORY);
|
|
460
|
+
});
|
|
461
|
+
// Only now, with the wake recorded, is the retry hold-off cleared.
|
|
462
|
+
this.retryAt.delete(key);
|
|
463
|
+
this.deps.log('woke', {
|
|
464
|
+
peer: pending.peer, threadId: pending.threadId, messageIds: woken,
|
|
465
|
+
runMs: this.now() - startedAt,
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
// ---------- run loop ----------
|
|
469
|
+
async pollOnce(via) {
|
|
470
|
+
await Promise.all(this.deps.loadPeers().map((peer) => this.sync(peer, via)));
|
|
471
|
+
await this.syncApprovals(via);
|
|
472
|
+
}
|
|
473
|
+
/**
|
|
474
|
+
* Runs until `signal` aborts. With `once`, does one catch-up and wakes everything immediately. Throws
|
|
475
|
+
* `state-conflict` (after stopping everything) if another watcher is writing this profile's state.
|
|
476
|
+
*/
|
|
477
|
+
async run(external, options = {}) {
|
|
478
|
+
const { log } = this.deps;
|
|
479
|
+
const stop = new AbortController();
|
|
480
|
+
const signal = stop.signal;
|
|
481
|
+
const onExternalAbort = () => stop.abort();
|
|
482
|
+
external.addEventListener('abort', onExternalAbort, { once: true });
|
|
483
|
+
if (external.aborted)
|
|
484
|
+
stop.abort();
|
|
485
|
+
this.onFatal = () => stop.abort();
|
|
486
|
+
const supervisors = new Map();
|
|
487
|
+
let ticker;
|
|
488
|
+
try {
|
|
489
|
+
await this.loadState();
|
|
490
|
+
log('start', { debounceMs: this.opts.debounceMs, pollMs: this.opts.pollMs, ticketSeconds: this.opts.ticketSeconds, once: Boolean(options.once) });
|
|
491
|
+
await this.pruneClaims();
|
|
492
|
+
this.lastClaimPrune = this.now();
|
|
493
|
+
const reconcile = () => {
|
|
494
|
+
const desired = new Map();
|
|
495
|
+
for (const peer of this.deps.loadPeers()) {
|
|
496
|
+
if (peer.status !== 'paired' || !peer.inbound || !peer.theirHandleForMe)
|
|
497
|
+
continue;
|
|
498
|
+
// The id carries the delegation CID: a renewed delegation restarts the subscription.
|
|
499
|
+
desired.set(`peer:${peer.handle}:${peer.inbound.cid}`, {
|
|
500
|
+
sub: { space: peer.spaceId, service: 'kv', pathPrefix: `${PREFIX}/to/${peer.theirHandleForMe}` },
|
|
501
|
+
hooks: () => this.deps.peerHooks(peer),
|
|
502
|
+
onEvent: () => void this.sync(peer, 'hook'),
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
desired.set('approvals', {
|
|
506
|
+
sub: { space: this.deps.spaceId, service: 'kv', pathPrefix: k.approvalsPrefix },
|
|
507
|
+
hooks: async () => this.deps.selfHooks,
|
|
508
|
+
onEvent: () => void this.syncApprovals('hook'),
|
|
509
|
+
});
|
|
510
|
+
for (const [id, controller] of supervisors) {
|
|
511
|
+
if (!desired.has(id)) {
|
|
512
|
+
controller.abort();
|
|
513
|
+
supervisors.delete(id);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
for (const [id, source] of desired) {
|
|
517
|
+
if (supervisors.has(id))
|
|
518
|
+
continue;
|
|
519
|
+
const controller = new AbortController();
|
|
520
|
+
supervisors.set(id, controller);
|
|
521
|
+
void this.supervise(id, source.sub, source.hooks, source.onEvent, controller.signal);
|
|
522
|
+
}
|
|
523
|
+
};
|
|
524
|
+
if (options.once) {
|
|
525
|
+
await this.pollOnce('startup');
|
|
526
|
+
await this.tick(true);
|
|
527
|
+
}
|
|
528
|
+
else {
|
|
529
|
+
// Open the subscriptions first, then catch up: a write between the two is seen by one or the other.
|
|
530
|
+
reconcile();
|
|
531
|
+
await sleep(RECONNECT_CATCH_UP_MS, signal);
|
|
532
|
+
if (!signal.aborted)
|
|
533
|
+
await this.pollOnce('startup');
|
|
534
|
+
ticker = setInterval(() => void this.tick().catch((e) => log('wake-error', errInfo(e))), 1000);
|
|
535
|
+
while (!signal.aborted) {
|
|
536
|
+
await sleep(this.opts.pollMs, signal);
|
|
537
|
+
if (signal.aborted)
|
|
538
|
+
break;
|
|
539
|
+
reconcile();
|
|
540
|
+
await this.pollOnce('poll');
|
|
541
|
+
if (this.now() - this.lastClaimPrune > 3600_000) {
|
|
542
|
+
this.lastClaimPrune = this.now();
|
|
543
|
+
await this.pruneClaims();
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
finally {
|
|
549
|
+
clearInterval(ticker);
|
|
550
|
+
for (const controller of supervisors.values())
|
|
551
|
+
controller.abort();
|
|
552
|
+
external.removeEventListener('abort', onExternalAbort);
|
|
553
|
+
this.onFatal = undefined;
|
|
554
|
+
log('stop');
|
|
555
|
+
}
|
|
556
|
+
if (this.fatalError)
|
|
557
|
+
throw this.fatalError;
|
|
558
|
+
}
|
|
559
|
+
/** One hook subscription. A refused ticket (revoked or expired delegation) backs off; the poll covers meanwhile. */
|
|
560
|
+
async supervise(id, sub, hooks, onEvent, signal) {
|
|
561
|
+
let failures = 0;
|
|
562
|
+
let opened = false;
|
|
563
|
+
while (!signal.aborted) {
|
|
564
|
+
try {
|
|
565
|
+
this.deps.log('hook-subscribe', { source: id.split(':').slice(0, 2).join(':'), ttlSeconds: this.opts.ticketSeconds });
|
|
566
|
+
// Spec §8.2: catch up on every (re)connect, since hooks have no replay. The catch-up runs after the
|
|
567
|
+
// subscription below has been started, so a write in between is seen by one or the other. (The SDK's own
|
|
568
|
+
// ticket reopen is invisible here; the poll covers those gaps.)
|
|
569
|
+
if (opened)
|
|
570
|
+
void sleep(RECONNECT_CATCH_UP_MS, signal).then(() => { if (!signal.aborted)
|
|
571
|
+
onEvent(); });
|
|
572
|
+
opened = true;
|
|
573
|
+
const service = await hooks();
|
|
574
|
+
for await (const event of service.subscribe([sub], { ttlSeconds: this.opts.ticketSeconds, signal })) {
|
|
575
|
+
failures = 0;
|
|
576
|
+
this.deps.log('hook-event', { source: id.split(':').slice(0, 2).join(':'), path: event.path ?? null });
|
|
577
|
+
onEvent(event);
|
|
578
|
+
}
|
|
579
|
+
if (!signal.aborted)
|
|
580
|
+
await sleep(5_000, signal);
|
|
581
|
+
}
|
|
582
|
+
catch (error) {
|
|
583
|
+
failures++;
|
|
584
|
+
this.deps.log('hook-error', { source: id.split(':').slice(0, 2).join(':'), ...errInfo(error) });
|
|
585
|
+
await sleep(Math.min(300_000, 15_000 * 2 ** Math.min(failures - 1, 5)), signal);
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tinycloud/courier",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0-beta.32",
|
|
4
4
|
"description": "Courier: agent-to-agent threads over TinyCloud (CLI, library and agent skill)",
|
|
5
5
|
"author": "TinyCloud, Inc.",
|
|
6
6
|
"type": "module",
|
|
@@ -30,11 +30,11 @@
|
|
|
30
30
|
"test:live": "tsc -p tsconfig.json && node scripts/happy-path.mjs"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@tinycloud/node-sdk": "3.3.0-beta.
|
|
33
|
+
"@tinycloud/node-sdk": "3.3.0-beta.33",
|
|
34
34
|
"ulid": "^3.0.2"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@tinycloud/sdk-core": "3.3.0-beta.
|
|
37
|
+
"@tinycloud/sdk-core": "3.3.0-beta.31",
|
|
38
38
|
"@types/node": "^20",
|
|
39
39
|
"typescript": "^5.9.3"
|
|
40
40
|
},
|