@tinycloud/courier 0.6.0-beta.33 → 0.6.0-beta.35

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 (45) hide show
  1. package/README.md +54 -13
  2. package/dist/commands.js +21 -5
  3. package/dist/commands.js.map +1 -1
  4. package/dist/flags.js +1 -1
  5. package/dist/flags.js.map +1 -1
  6. package/dist/guard/paseo.js +1 -0
  7. package/dist/guard/paseo.js.map +1 -1
  8. package/dist/inbox.js +13 -8
  9. package/dist/inbox.js.map +1 -1
  10. package/dist/intake/intake.js +32 -2
  11. package/dist/intake/intake.js.map +1 -1
  12. package/dist/interim-owner.js +2 -2
  13. package/dist/interim-owner.js.map +1 -1
  14. package/dist/interim-runtime.js +2 -2
  15. package/dist/interim-runtime.js.map +1 -1
  16. package/dist/invitation.js +2 -0
  17. package/dist/invitation.js.map +1 -1
  18. package/dist/node.d.ts +4 -0
  19. package/dist/node.js +15 -0
  20. package/dist/node.js.map +1 -1
  21. package/dist/notify.d.ts +1 -1
  22. package/dist/notify.js +3 -1
  23. package/dist/notify.js.map +1 -1
  24. package/dist/pause.js +4 -1
  25. package/dist/pause.js.map +1 -1
  26. package/dist/private-dir.d.ts +37 -0
  27. package/dist/private-dir.js +270 -0
  28. package/dist/private-dir.js.map +1 -0
  29. package/dist/state.js +2 -2
  30. package/dist/state.js.map +1 -1
  31. package/dist/store.d.ts +30 -0
  32. package/dist/store.js +74 -1
  33. package/dist/store.js.map +1 -1
  34. package/dist/thread.d.ts +26 -3
  35. package/dist/thread.js +215 -50
  36. package/dist/thread.js.map +1 -1
  37. package/dist/watch-cache.d.ts +16 -0
  38. package/dist/watch-cache.js +84 -0
  39. package/dist/watch-cache.js.map +1 -0
  40. package/dist/watch-cmd.js +3 -0
  41. package/dist/watch-cmd.js.map +1 -1
  42. package/dist/watch.d.ts +73 -4
  43. package/dist/watch.js +275 -58
  44. package/dist/watch.js.map +1 -1
  45. package/package.json +3 -3
package/dist/thread.d.ts CHANGED
@@ -15,13 +15,34 @@ export interface CacheLimits {
15
15
  * `courier read`'s private cache of one thread, per agent (`<COURIER_HOME>/read-cache/<did:key id>/<thread>.json`,
16
16
  * owner-only): messages and meta are create-only, so a repeated read fetches only entries it has not read yet. Tasks
17
17
  * change and are always fetched. A missing, foreign, expired (7 days) or corrupt file is an empty cache; the agent's
18
- * files stay within 64 MiB together, oldest dropped first.
18
+ * files stay within 64 MiB together, oldest dropped first. `full` starts empty: everything is fetched again and kept.
19
+ * Nothing is read or written unless every directory from the profile down is a real, owner-only directory of this user.
19
20
  */
20
- export declare function diskThreadCache(agent: string, threadId: string, limits?: CacheLimits): ThreadCache & {
21
+ export declare function diskThreadCache(agent: string, threadId: string, limits?: CacheLimits, full?: boolean): ThreadCache & {
21
22
  save(): void;
22
23
  };
23
- /** Revocation, refusal, peer removal or a new agent key: every cached counterparty body on this machine goes. */
24
+ /** Only the read cache: every cached counterparty body on this machine, removed through checked directories only. */
24
25
  export declare function clearReadCache(): void;
26
+ /**
27
+ * Revocation, refusal, owner revocation or a new agent key: the read cache and the watcher's local knowledge
28
+ * (`watch-cache/`) both go.
29
+ */
30
+ export declare function clearLocalCaches(): void;
31
+ /**
32
+ * Records one key this agent created under its thread root in the owner's space, after the write succeeded (`send`,
33
+ * the outbox, a pause inform, a task, a session's meta). One file per entry, so concurrent writers never lose each
34
+ * other's records. It never fails the write: if the record can't be written, the thread's listing marks are dropped
35
+ * so the next read lists again.
36
+ */
37
+ export declare function recordOwnerSpaceWrite(agent: string, spaceId: string | undefined, threadId: string, key: string): void;
38
+ /** This agent's thread roots in the owner's space: from the local record while a listing is under an hour old. */
39
+ export interface OwnerSpaceIndex {
40
+ /** The keys under `root`, or undefined when the root must be listed. */
41
+ keys(root: string): string[] | undefined;
42
+ /** A listing of `root` just returned `keys`: they are recorded, then the listing is marked as current. */
43
+ listed(root: string, keys: readonly string[]): void;
44
+ }
45
+ export declare function diskOwnerSpaceIndex(agent: string, spaceId: string, threadId: string, full?: boolean, now?: number): OwnerSpaceIndex;
25
46
  export interface ThreadEntry {
26
47
  peer?: string;
27
48
  kind: 'meta' | 'msg' | 'task';
@@ -46,6 +67,8 @@ export declare function collectThread(input: {
46
67
  exactPeer?: boolean;
47
68
  kvFor(peer: StoredPeer): Promise<KV>;
48
69
  cache?: ThreadCache;
70
+ /** The owner-space index of our thread roots: while current, our side of the thread isn't listed. */
71
+ ownerSpace?: OwnerSpaceIndex;
49
72
  /** This agent's courier DID and space: cached own entries belong to them, so a re-init or a new key starts empty. */
50
73
  self?: {
51
74
  courierDid: string;
package/dist/thread.js CHANGED
@@ -1,45 +1,52 @@
1
+ import { createHash } from 'node:crypto';
1
2
  import fs from 'node:fs';
2
3
  import path from 'node:path';
3
4
  import { messageView, oneLine, taskView } from './a2a.js';
4
5
  import { agentId, k, PREFIX } from './keys.js';
5
- import { profileDir, readRegularFile, writeSecure } from './profile.js';
6
- import { getJson, listAll } from './store.js';
6
+ import { profileDir } from './profile.js';
7
+ import { privateChild, privateDir, readPrivateFile, removePrivate, stillPrivate, unlinkPrivateFile, writePrivateFile } from './private-dir.js';
8
+ import { getJsonMany, listAll } from './store.js';
9
+ import { ULID } from './request.js';
7
10
  const SAFE_ID = /^[0-9A-Za-z_-]{1,64}$/;
8
11
  /** All of one agent's cached threads together, in bytes as written. */
9
12
  const CACHE_MAX_BYTES = 64 * 1024 * 1024;
10
13
  const CACHE_MAX_AGE_MS = 7 * 24 * 3600_000;
11
- const cacheRoot = () => path.join(profileDir(), 'read-cache');
14
+ /** How long `courier read` uses its local record of this agent's own writes to a thread before listing them again. */
15
+ const OWN_INDEX_TRUST_MS = 3600_000;
16
+ const READ_CACHE = 'read-cache';
17
+ const WATCH_CACHE = 'watch-cache';
12
18
  let preparedRoot;
13
19
  /**
14
20
  * Once per process: the cache directories are owner-only (0700) even if an earlier run left them looser, and thread
15
- * files from before the cache was per agent (`read-cache/<thread>.json`) are deleted. Symlinks and other users' entries
16
- * are never followed or changed.
21
+ * files from before the cache was per agent (`read-cache/<thread ULID>.json`) are deleted; nothing else at the root is.
22
+ * Every directory is opened without following a symlink and the chain from the profile down is checked again right
23
+ * before each change, so a component swapped for a link is never followed. Other users' entries are left alone.
17
24
  */
18
25
  function prepareCacheRoot() {
19
- const root = cacheRoot();
20
- if (preparedRoot === root)
26
+ const marker = path.join(profileDir(), READ_CACHE);
27
+ if (preparedRoot === marker)
21
28
  return;
22
- preparedRoot = root;
23
- let stat;
24
- try {
25
- stat = fs.lstatSync(root);
26
- }
27
- catch {
29
+ preparedRoot = marker;
30
+ const root = privateDir([READ_CACHE], false);
31
+ if (!root)
28
32
  return;
29
- }
30
- if (!stat.isDirectory() || stat.uid !== process.getuid?.())
31
- return;
32
- if ((stat.mode & 0o777) !== 0o700)
33
- fs.chmodSync(root, 0o700);
34
- for (const name of fs.readdirSync(root)) {
35
- const entry = path.join(root, name);
36
- const child = fs.lstatSync(entry);
33
+ for (const name of fs.readdirSync(root.path)) {
34
+ if (!stillPrivate(root))
35
+ return;
36
+ let child;
37
+ try {
38
+ child = fs.lstatSync(path.join(root.path, name));
39
+ }
40
+ catch {
41
+ continue;
42
+ }
37
43
  if (child.uid !== process.getuid?.())
38
44
  continue;
39
- if (child.isFile() && name.endsWith('.json'))
40
- fs.rmSync(entry, { force: true });
41
- else if (child.isDirectory() && (child.mode & 0o777) !== 0o700)
42
- fs.chmodSync(entry, 0o700);
45
+ // Only our own pre-upgrade thread files, unlinked after the chain and the entry are checked again.
46
+ if (child.isFile() && name.endsWith('.json') && ULID.test(name.slice(0, -5)))
47
+ unlinkPrivateFile(root, name);
48
+ else if (child.isDirectory())
49
+ privateChild(root, name);
43
50
  }
44
51
  }
45
52
  /** A cached thread file is used only while it is a regular file of this user written within the age bound. */
@@ -54,32 +61,38 @@ function fresh(file, limits) {
54
61
  }
55
62
  /** Keeps the agent's newest thread files within the byte bound and drops any older than the age bound. */
56
63
  function prune(dir, limits) {
57
- const files = fs.readdirSync(dir).filter(name => name.endsWith('.json')).map(name => {
58
- const file = path.join(dir, name);
59
- const stat = fs.lstatSync(file);
60
- return { file, mtime: stat.mtimeMs, bytes: stat.size, keep: stat.isFile() && limits.now - stat.mtimeMs < limits.maxAgeMs };
64
+ const files = fs.readdirSync(dir.path).filter(name => name.endsWith('.json')).flatMap(name => {
65
+ try {
66
+ const stat = fs.lstatSync(path.join(dir.path, name));
67
+ return [{ name, mtime: stat.mtimeMs, bytes: stat.size, keep: stat.isFile() && limits.now - stat.mtimeMs < limits.maxAgeMs }];
68
+ }
69
+ catch {
70
+ return [];
71
+ }
61
72
  }).sort((a, b) => b.mtime - a.mtime);
62
73
  let total = 0;
63
74
  for (const entry of files) {
64
75
  total += entry.bytes;
65
76
  if (!entry.keep || total > limits.maxBytes)
66
- fs.rmSync(entry.file, { force: true });
77
+ unlinkPrivateFile(dir, entry.name);
67
78
  }
68
79
  }
69
80
  /**
70
81
  * `courier read`'s private cache of one thread, per agent (`<COURIER_HOME>/read-cache/<did:key id>/<thread>.json`,
71
82
  * owner-only): messages and meta are create-only, so a repeated read fetches only entries it has not read yet. Tasks
72
83
  * change and are always fetched. A missing, foreign, expired (7 days) or corrupt file is an empty cache; the agent's
73
- * files stay within 64 MiB together, oldest dropped first.
84
+ * files stay within 64 MiB together, oldest dropped first. `full` starts empty: everything is fetched again and kept.
85
+ * Nothing is read or written unless every directory from the profile down is a real, owner-only directory of this user.
74
86
  */
75
- export function diskThreadCache(agent, threadId, limits = { now: Date.now(), maxBytes: CACHE_MAX_BYTES, maxAgeMs: CACHE_MAX_AGE_MS }) {
87
+ export function diskThreadCache(agent, threadId, limits = { now: Date.now(), maxBytes: CACHE_MAX_BYTES, maxAgeMs: CACHE_MAX_AGE_MS }, full = false) {
76
88
  prepareCacheRoot();
77
- const dir = path.join(cacheRoot(), agentId(agent));
78
- const file = path.join(dir, `${threadId}.json`);
89
+ const parts = [READ_CACHE, agentId(agent)];
90
+ const name = `${threadId}.json`;
79
91
  let entries = {};
80
- if (SAFE_ID.test(threadId) && fresh(file, limits)) {
92
+ const existing = !full && SAFE_ID.test(threadId) ? privateDir(parts, false) : undefined;
93
+ if (existing && fresh(path.join(existing.path, name), limits)) {
81
94
  try {
82
- const parsed = JSON.parse(readRegularFile(file) ?? '{}');
95
+ const parsed = JSON.parse(readPrivateFile(existing, name) ?? '{}');
83
96
  if (parsed && typeof parsed === 'object' && !Array.isArray(parsed))
84
97
  entries = parsed;
85
98
  }
@@ -92,23 +105,158 @@ export function diskThreadCache(agent, threadId, limits = { now: Date.now(), max
92
105
  save() {
93
106
  if (!changed || !SAFE_ID.test(threadId))
94
107
  return;
95
- fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
96
- if (!fs.lstatSync(cacheRoot()).isDirectory() || !fs.lstatSync(dir).isDirectory())
108
+ const dir = privateDir(parts, true);
109
+ if (!dir)
97
110
  return;
98
- // writeSecure writes pretty JSON and a newline.
111
+ // The file is pretty JSON and a newline.
99
112
  if (Buffer.byteLength(JSON.stringify(entries, null, 2)) + 1 > limits.maxBytes)
100
- fs.rmSync(file, { force: true });
113
+ unlinkPrivateFile(dir, name);
101
114
  else
102
- writeSecure(file, entries);
115
+ writePrivateFile(dir, name, entries);
103
116
  prune(dir, limits);
104
117
  },
105
118
  };
106
119
  }
107
- /** Revocation, refusal, peer removal or a new agent key: every cached counterparty body on this machine goes. */
120
+ /** Only the read cache: every cached counterparty body on this machine, removed through checked directories only. */
108
121
  export function clearReadCache() {
109
- fs.rmSync(cacheRoot(), { recursive: true, force: true });
122
+ removePrivate(READ_CACHE);
110
123
  preparedRoot = undefined;
111
124
  }
125
+ /**
126
+ * Revocation, refusal, owner revocation or a new agent key: the read cache and the watcher's local knowledge
127
+ * (`watch-cache/`) both go.
128
+ */
129
+ export function clearLocalCaches() {
130
+ clearReadCache();
131
+ removePrivate(WATCH_CACHE);
132
+ }
133
+ /**
134
+ * The owner-space index: keys written under this agent's thread roots in the owner's space, which may be by this agent
135
+ * or by another agent of the same owner (same-owner agents are one principal, as the grants are). `courier read`
136
+ * shows them as `authority: 'self'`.
137
+ */
138
+ const ownerSpaceParts = (agent, threadId) => [READ_CACHE, agentId(agent), 'owner-space', threadId];
139
+ const ownerSpaceName = (prefix, spaceId, key) => `${prefix}-${createHash('sha256').update(`${spaceId}\n${key}`).digest('hex')}.json`;
140
+ /**
141
+ * Records one key this agent created under its thread root in the owner's space, after the write succeeded (`send`,
142
+ * the outbox, a pause inform, a task, a session's meta). One file per entry, so concurrent writers never lose each
143
+ * other's records. It never fails the write: if the record can't be written, the thread's listing marks are dropped
144
+ * so the next read lists again.
145
+ */
146
+ export function recordOwnerSpaceWrite(agent, spaceId, threadId, key) {
147
+ if (!SAFE_ID.test(threadId) || !spaceId)
148
+ return;
149
+ let parts;
150
+ try {
151
+ parts = ownerSpaceParts(agent, threadId);
152
+ }
153
+ catch {
154
+ return;
155
+ } // no did:key: this agent has no read cache at all
156
+ try {
157
+ prepareCacheRoot();
158
+ const dir = privateDir(parts, true);
159
+ if (!dir || !writePrivateFile(dir, ownerSpaceName('e', spaceId, key), { space: spaceId, key }))
160
+ throw new Error('not recorded');
161
+ }
162
+ catch {
163
+ try {
164
+ const dir = privateDir(parts, false);
165
+ if (!dir)
166
+ return; // no safe directory: no listing marks to trust
167
+ for (const name of fs.readdirSync(dir.path))
168
+ if (name.startsWith('listed-'))
169
+ unlinkPrivateFile(dir, name);
170
+ }
171
+ catch { /* no listing marks: the next read lists anyway */ }
172
+ }
173
+ }
174
+ export function diskOwnerSpaceIndex(agent, spaceId, threadId, full = false, now = Date.now()) {
175
+ const parts = ownerSpaceParts(agent, threadId);
176
+ const uid = process.getuid?.();
177
+ const regular = (dir, name) => {
178
+ try {
179
+ const stat = fs.lstatSync(path.join(dir.path, name));
180
+ return stat.isFile() && stat.uid === uid ? stat : undefined;
181
+ }
182
+ catch {
183
+ return undefined;
184
+ }
185
+ };
186
+ return {
187
+ keys(root) {
188
+ if (full || !SAFE_ID.test(threadId))
189
+ return undefined;
190
+ const dir = privateDir(parts, false);
191
+ if (!dir)
192
+ return undefined;
193
+ let listedAt;
194
+ try {
195
+ const name = ownerSpaceName('listed', spaceId, root);
196
+ if (!regular(dir, name))
197
+ return undefined;
198
+ const mark = JSON.parse(readPrivateFile(dir, name) ?? 'null');
199
+ if (!mark || typeof mark !== 'object')
200
+ return undefined;
201
+ const { space, root: markRoot, listedAt: at } = mark;
202
+ if (space !== spaceId || markRoot !== root || typeof at !== 'string')
203
+ return undefined;
204
+ listedAt = Date.parse(at);
205
+ }
206
+ catch {
207
+ return undefined;
208
+ }
209
+ if (!(now - listedAt >= 0 && now - listedAt < OWN_INDEX_TRUST_MS))
210
+ return undefined;
211
+ const keys = [];
212
+ try {
213
+ for (const name of fs.readdirSync(dir.path)) {
214
+ if (!name.startsWith('e-'))
215
+ continue;
216
+ const stat = regular(dir, name);
217
+ if (!stat)
218
+ continue;
219
+ // Every listing re-records what it saw, so an entry this old is from before the current listing mark.
220
+ if (now - stat.mtimeMs >= CACHE_MAX_AGE_MS) {
221
+ unlinkPrivateFile(dir, name);
222
+ continue;
223
+ }
224
+ const text = readPrivateFile(dir, name);
225
+ if (text === undefined)
226
+ return undefined;
227
+ const entry = JSON.parse(text);
228
+ if (!entry || typeof entry !== 'object')
229
+ return undefined;
230
+ const { space, key } = entry;
231
+ if (typeof key !== 'string' || typeof space !== 'string')
232
+ return undefined;
233
+ if (space === spaceId && key.startsWith(`${root}/`))
234
+ keys.push(key);
235
+ }
236
+ }
237
+ catch {
238
+ return undefined;
239
+ }
240
+ return keys.sort();
241
+ },
242
+ listed(root, keys) {
243
+ if (!SAFE_ID.test(threadId))
244
+ return;
245
+ try {
246
+ prepareCacheRoot();
247
+ const dir = privateDir(parts, true);
248
+ if (!dir)
249
+ return;
250
+ for (const key of keys) {
251
+ if (key.startsWith(`${root}/`) && !writePrivateFile(dir, ownerSpaceName('e', spaceId, key), { space: spaceId, key }))
252
+ return;
253
+ }
254
+ writePrivateFile(dir, ownerSpaceName('listed', spaceId, root), { space: spaceId, root, listedAt: new Date(now).toISOString() });
255
+ }
256
+ catch { /* without a mark, the next read lists again */ }
257
+ },
258
+ };
259
+ }
112
260
  export function peerReadError(peer) {
113
261
  return { peer, code: 'peer-read-failed', message: `Couldn't read messages from ${oneLine(peer, 80)}.` };
114
262
  }
@@ -133,6 +281,7 @@ export async function collectThread(input) {
133
281
  // Failure of our own listing cannot safely be interpreted as an absent mapping.
134
282
  const mine = await listAll(selfKv, `${k.threadRoot(peer.handle, threadId)}/`);
135
283
  local.set(peer.handle, mine);
284
+ input.ownerSpace?.listed(k.threadRoot(peer.handle, threadId), mine);
136
285
  const mirrored = await listAll(selfKv, `${PREFIX}/me/mirror/${peer.handle}/threads/${threadId}/`);
137
286
  if (mine.length || mirrored.length)
138
287
  known.push(peer);
@@ -140,20 +289,31 @@ export async function collectThread(input) {
140
289
  if (known.length)
141
290
  peers = known;
142
291
  }
143
- /** `source`: whose space the keys are in (none: not cached). A cached body is used only for a key the current, authorized listing returned. */
292
+ /**
293
+ * `source`: whose space the keys are in (none: not cached). A cached body is used only for a key the current,
294
+ * authorized listing returned, or, for our own entries, that our own record holds.
295
+ */
144
296
  async function append(kv, keys, peer, side, source) {
145
297
  const root = side === 'me' ? k.threadRoot(peer, threadId) : undefined;
146
- for (const key of keys) {
298
+ const wanted = keys.flatMap(key => {
147
299
  if (root && !key.startsWith(`${root}/`))
148
- continue;
300
+ return [];
149
301
  const kind = key.endsWith('/meta.json') ? 'meta'
150
302
  : /\/msg\/[^/]+\.json$/.test(key) ? 'msg'
151
303
  : /\/task\/[^/]+\.json$/.test(key) ? 'task' : undefined;
152
304
  if (!kind)
153
- continue;
305
+ return [];
154
306
  const cacheId = kind === 'task' || !source ? undefined : `${source}:${key}`;
155
- const cached = cacheId === undefined ? undefined : input.cache?.get(cacheId);
156
- const got = cached !== undefined ? { value: cached } : await getJson(kv, key);
307
+ return [{ key, kind, cacheId, cached: cacheId === undefined ? undefined : input.cache?.get(cacheId) }];
308
+ });
309
+ // Everything not already cached in bounded batches; each entry is still checked on its own below. A value over
310
+ // the cap is reported as an error for that entry, and every other entry is shown.
311
+ const fetched = await getJsonMany(kv, wanted.filter(entry => entry.cached === undefined).map(entry => entry.key));
312
+ for (const key of fetched.tooLarge) {
313
+ errors.push({ peer, code: 'entry-too-large', message: `An entry of ${oneLine(peer, 80)} is too large to read (${oneLine(key.slice(key.lastIndexOf('/') + 1), 80)}).` });
314
+ }
315
+ for (const { key, kind, cacheId, cached } of wanted) {
316
+ const got = cached !== undefined ? { value: cached } : fetched.values.get(key);
157
317
  if (!got)
158
318
  continue;
159
319
  if (cacheId !== undefined && cached === undefined)
@@ -165,7 +325,12 @@ export async function collectThread(input) {
165
325
  }
166
326
  }
167
327
  for (const peer of peers) {
168
- const mine = local.get(peer.handle) ?? await listAll(selfKv, `${k.threadRoot(peer.handle, threadId)}/`);
328
+ const root = k.threadRoot(peer.handle, threadId);
329
+ let mine = local.get(peer.handle) ?? input.ownerSpace?.keys(root);
330
+ if (mine === undefined) {
331
+ mine = await listAll(selfKv, `${root}/`);
332
+ input.ownerSpace?.listed(root, mine);
333
+ }
169
334
  await append(selfKv, mine, peer.handle, 'me', input.self && `self:${input.self.courierDid}:${input.self.spaceId}`);
170
335
  if (!peer.inbound || !peer.theirHandleForMe)
171
336
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"thread.js","sourceRoot":"","sources":["../src/thread.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"thread.js","sourceRoot":"","sources":["../src/thread.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { StoredPeer } from './profile.js';
2
+ import { type LocalWatchCache } from './watch.js';
3
+ /**
4
+ * `<COURIER_HOME>/watch-cache/<did:key id>.json`, owner-only, in a checked private directory: what this agent's watcher
5
+ * already learned from the node (receipted message ids, mirrored meta keys, marker read times, the claim pruning
6
+ * time), so a restart or a `--once` run need not fetch it again.
7
+ * - Bound to this agent's DID and space.
8
+ * - Each peer's facts carry the identity (DID, space, session) they were learned under. They are loaded and saved
9
+ * only while the peer's current identity is the same; otherwise they are dropped, never re-stamped.
10
+ * - Only `peers()` (the eligible peers) are kept. A bad file, an old format or an unsafe directory is the same as no
11
+ * file. Deleted with the read cache (revoke, refusal, owner revocation, key rotation).
12
+ */
13
+ export declare function fileWatchCache(agent: string, space: string, peers: () => StoredPeer[]): {
14
+ load(): LocalWatchCache | undefined;
15
+ save(cache: LocalWatchCache): void;
16
+ };
@@ -0,0 +1,84 @@
1
+ import { isRecord } from './a2a.js';
2
+ import { agentId, PREFIX } from './keys.js';
3
+ import { privateDir, readPrivateFile, writePrivateFile } from './private-dir.js';
4
+ import { peerIdentity, sameIdentity } from './watch.js';
5
+ const DIR = 'watch-cache';
6
+ const strings = (value) => Array.isArray(value) && value.every(item => typeof item === 'string');
7
+ const metaPrefix = (peer) => peer.theirHandleForMe ? `${PREFIX}/to/${peer.theirHandleForMe}/` : undefined;
8
+ function parse(text) {
9
+ const value = JSON.parse(text ?? 'null');
10
+ if (!isRecord(value) || value.v !== 2 || !isRecord(value.self) || typeof value.self.did !== 'string' || typeof value.self.space !== 'string'
11
+ || !isRecord(value.peers) || (value.claimsPrunedAt !== undefined && typeof value.claimsPrunedAt !== 'number'))
12
+ return undefined;
13
+ for (const facts of Object.values(value.peers)) {
14
+ if (!isRecord(facts) || typeof facts.did !== 'string' || typeof facts.space !== 'string'
15
+ || !(facts.session === null || typeof facts.session === 'string') || !strings(facts.receipted) || !strings(facts.metaMirrored)
16
+ || (facts.markerReadAt !== undefined && typeof facts.markerReadAt !== 'number'))
17
+ return undefined;
18
+ }
19
+ return value;
20
+ }
21
+ /**
22
+ * `<COURIER_HOME>/watch-cache/<did:key id>.json`, owner-only, in a checked private directory: what this agent's watcher
23
+ * already learned from the node (receipted message ids, mirrored meta keys, marker read times, the claim pruning
24
+ * time), so a restart or a `--once` run need not fetch it again.
25
+ * - Bound to this agent's DID and space.
26
+ * - Each peer's facts carry the identity (DID, space, session) they were learned under. They are loaded and saved
27
+ * only while the peer's current identity is the same; otherwise they are dropped, never re-stamped.
28
+ * - Only `peers()` (the eligible peers) are kept. A bad file, an old format or an unsafe directory is the same as no
29
+ * file. Deleted with the read cache (revoke, refusal, owner revocation, key rotation).
30
+ */
31
+ export function fileWatchCache(agent, space, peers) {
32
+ const name = `${agentId(agent)}.json`;
33
+ return {
34
+ load() {
35
+ try {
36
+ const dir = privateDir([DIR], false);
37
+ if (!dir)
38
+ return undefined;
39
+ const file = parse(readPrivateFile(dir, name));
40
+ if (!file || file.self.did !== agent || file.self.space !== space)
41
+ return undefined;
42
+ const cache = { v: 1, claimsPrunedAt: file.claimsPrunedAt, markerReadAt: {}, metaMirrored: {}, receipted: {}, identities: {} };
43
+ for (const peer of peers()) {
44
+ const facts = Object.hasOwn(file.peers, peer.handle) ? file.peers[peer.handle] : undefined;
45
+ const identity = peerIdentity(peer);
46
+ if (!facts || !sameIdentity({ did: facts.did, space: facts.space, session: facts.session }, identity))
47
+ continue;
48
+ cache.identities[peer.handle] = identity;
49
+ if (facts.markerReadAt !== undefined)
50
+ cache.markerReadAt[peer.handle] = facts.markerReadAt;
51
+ cache.receipted[peer.handle] = facts.receipted;
52
+ const prefix = metaPrefix(peer);
53
+ if (prefix)
54
+ cache.metaMirrored[peer.handle] = facts.metaMirrored.filter(key => key.startsWith(prefix));
55
+ }
56
+ return cache;
57
+ }
58
+ catch {
59
+ return undefined;
60
+ }
61
+ },
62
+ save(cache) {
63
+ const dir = privateDir([DIR], true);
64
+ if (!dir)
65
+ return;
66
+ const file = { v: 2, self: { did: agent, space }, peers: {}, ...(cache.claimsPrunedAt !== undefined ? { claimsPrunedAt: cache.claimsPrunedAt } : {}) };
67
+ for (const peer of peers()) {
68
+ const identity = peerIdentity(peer);
69
+ // Facts learned under another identity of this handle are dropped, never stamped with the current one.
70
+ if (!sameIdentity(Object.hasOwn(cache.identities, peer.handle) ? cache.identities[peer.handle] : undefined, identity))
71
+ continue;
72
+ const prefix = metaPrefix(peer);
73
+ file.peers[peer.handle] = {
74
+ ...identity,
75
+ ...(cache.markerReadAt[peer.handle] !== undefined ? { markerReadAt: cache.markerReadAt[peer.handle] } : {}),
76
+ receipted: cache.receipted[peer.handle] ?? [],
77
+ metaMirrored: prefix ? (cache.metaMirrored[peer.handle] ?? []).filter(key => key.startsWith(prefix)) : [],
78
+ };
79
+ }
80
+ writePrivateFile(dir, name, file);
81
+ },
82
+ };
83
+ }
84
+ //# sourceMappingURL=watch-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-cache.js","sourceRoot":"","sources":["../src/watch-cache.ts"],"names":[],"mappings":"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"}
package/dist/watch-cmd.js CHANGED
@@ -9,6 +9,7 @@ import { CourierError } from './errors.js';
9
9
  import { loadProfile, profileDir, writeSecure } from './profile.js';
10
10
  import { peerHooks, peerKv } from './node.js';
11
11
  import { WATCH_DEFAULTS, Watcher } from './watch.js';
12
+ import { fileWatchCache } from './watch-cache.js';
12
13
  import { UNGUARDED_REFUSAL, createWaker, jsonLineLog, killAllRunners, spawnRunner } from './wake.js';
13
14
  import { startsAgentCli } from './guard/policy.js';
14
15
  import { guardArgv } from './guard/command.js';
@@ -278,6 +279,8 @@ export async function cmdWatch(args) {
278
279
  postInform: async (peer, threadId, text, pauseId) => { await postPausedInform(node.kv, loadProfile(), peer, threadId, text, pauseId); },
279
280
  notify: createNotifier(notifyConfig(args, config), { run: spawnRunner }),
280
281
  holder: { profileId: watcherProfileId() },
282
+ // Only eligible peers' facts are kept: a refused, latched or removed peer's facts go with the next save.
283
+ localCache: fileWatchCache(node.credentialHolderDid, profile.spaceId, () => Object.values(loadProfile().peers).filter(peer => watchPeerEligible(peer))),
281
284
  log,
282
285
  }, opts);
283
286
  const stop = new AbortController();