agent-comms 9.0.15 → 9.1.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.
@@ -2,9 +2,10 @@
2
2
  * WireMeshTransport's own core/data frame dispatch (data-have, data-request, data-entries), split out under the repo's max-lines cap the same way gossip-directory.ts and hub-forwarding.ts were each split from the same owning file.
3
3
  */
4
4
  import { handleDataEntries, handleDataHave, handleDataRequest, } from "wire-mesh-core/domain/data-sync";
5
- import { deviceIdToHex } from "wire-mesh-core/domain/device-id";
5
+ import { bytesToHex, deviceIdToHex } from "wire-mesh-core/domain/device-id";
6
6
  import { isDataFrame } from "wire-mesh-core/domain/hub-mailbox";
7
7
  import { readMembershipProof } from "./gossip-directory.js";
8
+ import { LedgerGapTracker } from "./ledger-gaps.js";
8
9
  /** The most entries one data-entries reply carries, for every log this side answers for, the account ledger's included: a longer log catches up over several rounds, so the bound only caps one frame's size. */
9
10
  export const DATA_ENTRIES_RESPONSE_LIMIT = 100;
10
11
  /** The hub data channel over whatever hub session `hub()` currently returns, read on each call because the router is built before the hub it talks through. */
@@ -48,6 +49,9 @@ export async function routeDataFrame(deps, connection, frame) {
48
49
  ledger.ownsLog(frame.peer)) {
49
50
  if (!(await deps.account.isAccountPeer(deviceIdHex)))
50
51
  return;
52
+ if (frame.type === "data-have") {
53
+ deps.gaps?.noteHave(deviceIdHex, frame.peer, frame["head-seq"]);
54
+ }
51
55
  const reply = await ledger.handleDataFrame(frame);
52
56
  if (reply !== null)
53
57
  await connection.send(reply);
@@ -84,6 +88,9 @@ export async function routeRelayedDataFrame(deps, fromDeviceHex, frame) {
84
88
  return;
85
89
  if (!(await account.isAccountPeer(fromDeviceHex)))
86
90
  return;
91
+ if (frame.type === "data-have") {
92
+ deps.gaps?.noteHave(fromDeviceHex, frame.peer, frame["head-seq"]);
93
+ }
87
94
  const reply = await ledger.handleDataFrame(frame);
88
95
  if (reply !== null)
89
96
  await hub.send(fromDeviceHex, reply);
@@ -92,28 +99,44 @@ export async function routeRelayedDataFrame(deps, fromDeviceHex, frame) {
92
99
  deps.onError?.(error instanceof Error ? error : new Error(String(error)));
93
100
  }
94
101
  }
95
- /** Offers every account writer log this machine holds to every device that holds the same account and that this side can reach (agent-comms#344): over a live, trusted data connection, or, for a device it meets only through the relay hub, over a relay pairing. Such a device that is behind asks for what it is missing, which is the data-domain fan-out that carries each machine's grants and revocations to every other. A device reachable both ways is offered the logs once, directly. Called on the gossip cadence, so a machine that was away when an entry was written still catches up the next time it is reachable. A send that fails is reported and the rest carry on; the next round retries it. */
102
+ /** Offers every account writer log this machine holds to every device that holds the same account and that this side can reach (agent-comms#344): over a live, trusted data connection, or, for a device it meets only through the relay hub, over a relay pairing. Such a device that is behind asks for what it is missing, which is the data-domain fan-out that carries each machine's grants and revocations to every other. A device reachable both ways is offered the logs once, directly. Called on the gossip cadence, so a machine that was away when an entry was written still catches up the next time it is reachable. A send that fails is reported through onError and the rest carry on; the next round retries it. Resolves with whether any device was reached and with this side's heads, read once. */
96
103
  export async function announceAccountLedger(deps) {
97
104
  const ledger = deps.account.ledger();
98
105
  if (ledger === undefined)
99
- return;
106
+ return { reached: false, localHeads: new Map() };
100
107
  const frames = await ledger.announcements();
101
- if (frames.length === 0)
102
- return;
108
+ const localHeads = new Map();
109
+ for (const frame of frames) {
110
+ localHeads.set(bytesToHex(frame.peer), frame["head-seq"]);
111
+ }
112
+ let devices = 0;
113
+ let sent = 0;
103
114
  const reportError = (error) => {
104
115
  deps.onError?.(error instanceof Error ? error : new Error(String(error)));
105
116
  };
117
+ // A device whose membership cannot be read is reported and skipped: one device that makes this throw must not stop the round from being counted.
118
+ const isAccountPeer = async (deviceHex) => {
119
+ try {
120
+ return await deps.account.isAccountPeer(deviceHex);
121
+ }
122
+ catch (error) {
123
+ reportError(error);
124
+ return false;
125
+ }
126
+ };
106
127
  const direct = new Set();
107
128
  const offers = [];
108
129
  for (const [deviceHex, connection] of deps.connectionsByPeer) {
109
130
  if (!deps.peerSessions.has(deviceHex))
110
131
  continue;
111
- if (!(await deps.account.isAccountPeer(deviceHex)))
132
+ if (!(await isAccountPeer(deviceHex)))
112
133
  continue;
113
134
  direct.add(deviceHex);
135
+ devices += 1;
114
136
  for (const frame of frames) {
115
137
  try {
116
138
  await connection.send(frame);
139
+ sent += 1;
117
140
  }
118
141
  catch (error) {
119
142
  reportError(error);
@@ -121,26 +144,39 @@ export async function announceAccountLedger(deps) {
121
144
  }
122
145
  }
123
146
  const { hub } = deps;
124
- if (hub === undefined)
125
- return;
126
- for (const deviceHex of hub.peers()) {
127
- if (direct.has(deviceHex))
128
- continue;
129
- if (!(await deps.account.isAccountPeer(deviceHex)))
130
- continue;
131
- // Each device is offered concurrently: a pairing to a device that is not there waits out its own handshake, which must not hold up the others.
132
- offers.push((async () => {
133
- for (const frame of frames) {
134
- try {
135
- await hub.send(deviceHex, frame);
136
- }
137
- catch (error) {
138
- reportError(error);
147
+ if (hub !== undefined) {
148
+ let hubPeers = [];
149
+ try {
150
+ hubPeers = hub.peers();
151
+ }
152
+ catch (error) {
153
+ reportError(error);
154
+ }
155
+ for (const deviceHex of hubPeers) {
156
+ if (direct.has(deviceHex))
157
+ continue;
158
+ if (!(await isAccountPeer(deviceHex)))
159
+ continue;
160
+ devices += 1;
161
+ // Each device is offered concurrently: a pairing to a device that is not there waits out its own handshake, which must not hold up the others.
162
+ offers.push((async () => {
163
+ for (const frame of frames) {
164
+ try {
165
+ await hub.send(deviceHex, frame);
166
+ sent += 1;
167
+ }
168
+ catch (error) {
169
+ reportError(error);
170
+ }
139
171
  }
140
- }
141
- })());
172
+ })());
173
+ }
142
174
  }
143
175
  await Promise.all(offers);
176
+ return {
177
+ reached: sent > 0 || (frames.length === 0 && devices > 0),
178
+ localHeads,
179
+ };
144
180
  }
145
181
  /** WireMeshTransport's core/data state and dispatch, split out under the repo's max-lines cap: the connection each peer's frames arrive on, routing of every data frame received, the mechanical send primitive, and the periodic offer of the account ledger's writer logs, and the same exchange with a device met only through the relay hub. */
146
182
  export class DataFrameRouter {
@@ -150,6 +186,8 @@ export class DataFrameRouter {
150
186
  /** Every peer this side has ever received a frame from, keyed by device-id hex, tracking the raw wire-mesh-core Connection each frame arrived on: what sendDataFrame needs, since neither AcceptedMeshSession nor MeshSession exposes a generic "send an arbitrary frame" method the way the raw Connection itself does. Registered eagerly on the very first frame from a connection (including one still in quarantine, e.g. before connect_request approval) so a later sendDataFrame call can reach it; routeDataFrame's own trust gate (peerSessions.has) is what actually decides whether to act on anything received this way, not this map. */
151
187
  connectionsByPeer = new Map();
152
188
  announceInterval;
189
+ /** What each peer says the account's writer logs reach, and the rounds this side has stayed behind it. Undefined for a transport with no account ledger. */
190
+ gaps;
153
191
  /** Whether an announcement round is still running, so a round slowed by an unreachable hub peer is not stacked on by the next tick. */
154
192
  announcing = false;
155
193
  constructor(deps) {
@@ -158,10 +196,22 @@ export class DataFrameRouter {
158
196
  const { account } = deps;
159
197
  if (account === undefined)
160
198
  return;
199
+ const gaps = new LedgerGapTracker({
200
+ request: async (source, frame) => this.requestFrom(source, frame),
201
+ isLive: (source) => deps.peerSessions.has(source) ||
202
+ (deps.hub?.peers().includes(source) ?? false),
203
+ onError: (error) => {
204
+ deps.onError?.(error);
205
+ },
206
+ });
207
+ this.gaps = gaps;
161
208
  this.announceInterval = setInterval(() => {
162
209
  if (this.announcing)
163
210
  return;
164
211
  this.announcing = true;
212
+ const report = (error) => {
213
+ deps.onError?.(error instanceof Error ? error : new Error(String(error)));
214
+ };
165
215
  announceAccountLedger({
166
216
  connectionsByPeer: this.connectionsByPeer,
167
217
  account,
@@ -169,15 +219,30 @@ export class DataFrameRouter {
169
219
  peerSessions: deps.peerSessions,
170
220
  onError: deps.onError,
171
221
  })
172
- .catch((error) => {
173
- deps.onError?.(error instanceof Error ? error : new Error(String(error)));
174
- })
222
+ .then(async (offered) => gaps.round(offered.localHeads, { offline: !offered.reached }))
223
+ .catch(report)
175
224
  .finally(() => {
176
225
  this.announcing = false;
177
226
  });
178
227
  }, deps.announceIntervalMs);
179
228
  this.announceInterval.unref();
180
229
  }
230
+ /** Sends a data-request to one source, over its direct session when it has one and through the relay hub otherwise. */
231
+ async requestFrom(source, frame) {
232
+ const connection = this.connectionsByPeer.get(source);
233
+ if (connection !== undefined && this.deps.peerSessions.has(source)) {
234
+ await connection.send(frame);
235
+ return;
236
+ }
237
+ if (this.deps.hub === undefined) {
238
+ throw new Error(`no route to ${source} to ask it for ledger entries`);
239
+ }
240
+ await this.deps.hub.send(source, frame);
241
+ }
242
+ /** The account ledger's logs this side has stayed behind for several rounds, for whoami. Empty when there is no account ledger. */
243
+ stalledLogs() {
244
+ return this.gaps?.stalled() ?? [];
245
+ }
181
246
  /** See routeDataFrame. */
182
247
  async route(connection, frame) {
183
248
  await routeDataFrame({
@@ -185,6 +250,7 @@ export class DataFrameRouter {
185
250
  dataStorage: this.dataStorage,
186
251
  account: this.deps.account,
187
252
  peerSessions: this.deps.peerSessions,
253
+ gaps: this.gaps,
188
254
  onError: this.deps.onError,
189
255
  }, connection, frame);
190
256
  }
@@ -193,6 +259,7 @@ export class DataFrameRouter {
193
259
  await routeRelayedDataFrame({
194
260
  account: this.deps.account,
195
261
  hub: this.deps.hub,
262
+ gaps: this.gaps,
196
263
  onError: this.deps.onError,
197
264
  }, fromDeviceHex, frame);
198
265
  };
@@ -1 +1 @@
1
- {"version":3,"file":"data-frame-routing.js","sourceRoot":"","sources":["../../src/core/data-frame-routing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-frame-routing.js","sourceRoot":"","sources":["../../src/core/data-frame-routing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Gap detection for the account ledger's replicated writer logs (agent-comms#344), with no wire change. A `data-have` frame already carries the head sequence of the log it names, so each machine can see how far every peer says a log goes. A machine that stays behind that head for several rounds in a row, while the entries it asks for do not arrive, has a log something is withholding or dropping: a revocation could be in the missing part.
3
+ *
4
+ * What is kept: for each log, each live source's own announced head. A source is a peer this side reached over a direct session or over the relay hub. Each replication round compares those heads with this side's own and counts the rounds a log has stayed behind without advancing. At LEDGER_STALL_ROUNDS the log is reported as stalled, and again only if the gap grew and LEDGER_REPORT_REPEAT_ROUNDS rounds have passed, and the entries are asked of every source that announced a higher head, not only the one that answered first. A log that catches up, or whose announcing sources have gone, is forgotten.
5
+ *
6
+ * What is bounded: the logs tracked (MAX_TRACKED_LEDGER_LOGS, preferring logs this side already holds), how far ahead of this side's head an announced head may be (MAX_ANNOUNCED_HEAD_DISTANCE), how many reports of an ignored announcement are remembered, and how often a repeated report is made. Reports of ignored announcements are remembered apart from the logs, so forgetting a log never makes a report repeat.
7
+ *
8
+ * What it cannot see: a single path that withholds everything, including the higher head, since the head is learned from the same frames; a log beyond the tracked limit that this side does not hold; a head more than MAX_ANNOUNCED_HEAD_DISTANCE ahead, which is ignored; a log that is slow but still advancing, which is never behind for LEDGER_STALL_ROUNDS rounds without moving; and a machine that reaches no peer of the account at all, whose rounds are not counted.
9
+ */
10
+ import type { DataRequestFrame } from "wire-mesh-core/generated/protocol";
11
+ /** How many consecutive replication rounds a log may stay behind an announced head, without a new entry arriving, before it is reported as stalled. */
12
+ export declare const LEDGER_STALL_ROUNDS = 3;
13
+ /** How many rounds pass before a gap that has grown since it was last reported is reported again, so a peer that raises its head every round gets one report per interval and not one per round. */
14
+ export declare const LEDGER_REPORT_REPEAT_ROUNDS = 10;
15
+ /** The most writer logs tracked at once. The account's logs are one per machine that ever wrote, so this is far above any real account. At the limit a log this side holds takes the place of one it does not, and any other log announced is not tracked, which is reported at most once per LEDGER_REPORT_REPEAT_ROUNDS rounds. */
16
+ export declare const MAX_TRACKED_LEDGER_LOGS = 256;
17
+ /** The furthest an announced head may be ahead of this side's own and still be believed. Heads count ledger entries, which are grants and revocations, and a reply carries a bounded batch, so a head further ahead than this is not an honest gap: it is not recorded, and is reported once. */
18
+ export declare const MAX_ANNOUNCED_HEAD_DISTANCE = 1000000;
19
+ /** A log this side is behind, reported once it has stayed so for LEDGER_STALL_ROUNDS rounds. */
20
+ export interface StalledLedgerLog {
21
+ /** The writer log's id, hex. */
22
+ log: string;
23
+ /** This side's head sequence for it. */
24
+ localHead: number;
25
+ /** The highest head any live source announced. */
26
+ announcedHead: number;
27
+ /** The rounds it has stayed behind. */
28
+ rounds: number;
29
+ }
30
+ /** What the tracker needs from its owner. */
31
+ export interface LedgerGapDeps {
32
+ /** Sends a request for the entries after `frame["from-seq"]` of a log to one source, directly or through the hub. A rejection is reported and does not stop the others. */
33
+ request: (source: string, frame: Readonly<DataRequestFrame>) => Promise<void>;
34
+ /** Whether a source is still reachable: its announced heads are forgotten when it is not. */
35
+ isLive: (source: string) => boolean;
36
+ /** Where a stall is reported, and a failed request. */
37
+ onError: (error: Error) => void;
38
+ }
39
+ /** What a round is told about how it went. */
40
+ export interface LedgerRoundOptions {
41
+ /** True when this machine reached no peer of the account this round: no offer went out, so nothing was asked of anyone. The round still notices a log that has caught up, but it is not counted as a round the log stayed behind. */
42
+ offline?: boolean;
43
+ }
44
+ export declare class LedgerGapTracker {
45
+ private readonly deps;
46
+ private readonly logs;
47
+ private roundNumber;
48
+ private overLimitReportedAtRound;
49
+ /** The logs this side held at the last round, which a log announced at the tracking limit is preferred for. */
50
+ private held;
51
+ /** The `log:source` of every out-of-range announcement reported, oldest first, kept apart from the logs so that a log forgotten and announced again is not reported again. */
52
+ private readonly reportedOutOfRange;
53
+ constructor(deps: Readonly<LedgerGapDeps>);
54
+ /** Records the head `source` announced for a log. Called for every `data-have` an account peer sends for one of the account's logs. */
55
+ noteHave(source: string, log: Uint8Array, head: number): void;
56
+ /** Makes room for a log at the tracking limit by dropping a tracked log this side holds nothing of, and only when this side holds the new one. */
57
+ private makeRoomFor;
58
+ private reportOverLimit;
59
+ /** Remembers that an out-of-range announcement was reported, and whether it had been before. */
60
+ private firstReportOfOutOfRange;
61
+ /**
62
+ * One replication round: compares every announced head with this side's (`localHeads`, by log id hex, absent for a log this side holds nothing of), counts the rounds each log stays behind without advancing, and on reaching LEDGER_STALL_ROUNDS reports it and asks every source that announced a higher head for the entries. Resolves once the requests have been sent.
63
+ */
64
+ round(localHeads: ReadonlyMap<string, number>, options?: Readonly<LedgerRoundOptions>): Promise<void>;
65
+ /** The logs that have stayed behind for LEDGER_STALL_ROUNDS rounds or more as of the last round, for whoami. */
66
+ stalled(): StalledLedgerLog[];
67
+ }
68
+ //# sourceMappingURL=ledger-gaps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-gaps.d.ts","sourceRoot":"","sources":["../../src/core/ledger-gaps.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,uJAAuJ;AACvJ,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,oMAAoM;AACpM,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAE9C,qUAAqU;AACrU,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAO3C,iSAAiS;AACjS,eAAO,MAAM,2BAA2B,UAAY,CAAC;AAErD,gGAAgG;AAChG,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,aAAa,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC5B,2KAA2K;IAC3K,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,6FAA6F;IAC7F,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IACpC,uDAAuD;IACvD,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACjC;AAeD,8CAA8C;AAC9C,MAAM,WAAW,kBAAkB;IACjC,qOAAqO;IACrO,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,gBAAgB;IASf,OAAO,CAAC,QAAQ,CAAC,IAAI;IARjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA+B;IACpD,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,wBAAwB,CAAqB;IACrD,+GAA+G;IAC/G,OAAO,CAAC,IAAI,CAAkC;IAC9C,8KAA8K;IAC9K,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;gBAE3B,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC;IAE1D,uIAAuI;IACvI,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAqB7D,kJAAkJ;IAClJ,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,eAAe;IAgBvB,gGAAgG;IAChG,OAAO,CAAC,uBAAuB;IAW/B;;OAEG;IACG,KAAK,CACT,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EACvC,OAAO,GAAE,QAAQ,CAAC,kBAAkB,CAAM,GACzC,OAAO,CAAC,IAAI,CAAC;IAqEhB,gHAAgH;IAChH,OAAO,IAAI,gBAAgB,EAAE;CAc9B"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Gap detection for the account ledger's replicated writer logs (agent-comms#344), with no wire change. A `data-have` frame already carries the head sequence of the log it names, so each machine can see how far every peer says a log goes. A machine that stays behind that head for several rounds in a row, while the entries it asks for do not arrive, has a log something is withholding or dropping: a revocation could be in the missing part.
3
+ *
4
+ * What is kept: for each log, each live source's own announced head. A source is a peer this side reached over a direct session or over the relay hub. Each replication round compares those heads with this side's own and counts the rounds a log has stayed behind without advancing. At LEDGER_STALL_ROUNDS the log is reported as stalled, and again only if the gap grew and LEDGER_REPORT_REPEAT_ROUNDS rounds have passed, and the entries are asked of every source that announced a higher head, not only the one that answered first. A log that catches up, or whose announcing sources have gone, is forgotten.
5
+ *
6
+ * What is bounded: the logs tracked (MAX_TRACKED_LEDGER_LOGS, preferring logs this side already holds), how far ahead of this side's head an announced head may be (MAX_ANNOUNCED_HEAD_DISTANCE), how many reports of an ignored announcement are remembered, and how often a repeated report is made. Reports of ignored announcements are remembered apart from the logs, so forgetting a log never makes a report repeat.
7
+ *
8
+ * What it cannot see: a single path that withholds everything, including the higher head, since the head is learned from the same frames; a log beyond the tracked limit that this side does not hold; a head more than MAX_ANNOUNCED_HEAD_DISTANCE ahead, which is ignored; a log that is slow but still advancing, which is never behind for LEDGER_STALL_ROUNDS rounds without moving; and a machine that reaches no peer of the account at all, whose rounds are not counted.
9
+ */
10
+ import { bytesToHex } from "wire-mesh-core/domain/device-id";
11
+ /** How many consecutive replication rounds a log may stay behind an announced head, without a new entry arriving, before it is reported as stalled. */
12
+ export const LEDGER_STALL_ROUNDS = 3;
13
+ /** How many rounds pass before a gap that has grown since it was last reported is reported again, so a peer that raises its head every round gets one report per interval and not one per round. */
14
+ export const LEDGER_REPORT_REPEAT_ROUNDS = 10;
15
+ /** The most writer logs tracked at once. The account's logs are one per machine that ever wrote, so this is far above any real account. At the limit a log this side holds takes the place of one it does not, and any other log announced is not tracked, which is reported at most once per LEDGER_REPORT_REPEAT_ROUNDS rounds. */
16
+ export const MAX_TRACKED_LEDGER_LOGS = 256;
17
+ /** How many out-of-range reports are remembered per tracked log; the oldest is forgotten first. */
18
+ const REMEMBERED_REPORTS_PER_LOG = 4;
19
+ const MAX_REMEMBERED_REPORTS = REMEMBERED_REPORTS_PER_LOG * MAX_TRACKED_LEDGER_LOGS;
20
+ /** The furthest an announced head may be ahead of this side's own and still be believed. Heads count ledger entries, which are grants and revocations, and a reply carries a bounded batch, so a head further ahead than this is not an honest gap: it is not recorded, and is reported once. */
21
+ export const MAX_ANNOUNCED_HEAD_DISTANCE = 1_000_000;
22
+ export class LedgerGapTracker {
23
+ deps;
24
+ logs = new Map();
25
+ roundNumber = 0;
26
+ overLimitReportedAtRound;
27
+ /** The logs this side held at the last round, which a log announced at the tracking limit is preferred for. */
28
+ held = new Set();
29
+ /** The `log:source` of every out-of-range announcement reported, oldest first, kept apart from the logs so that a log forgotten and announced again is not reported again. */
30
+ reportedOutOfRange = new Set();
31
+ constructor(deps) {
32
+ this.deps = deps;
33
+ }
34
+ /** Records the head `source` announced for a log. Called for every `data-have` an account peer sends for one of the account's logs. */
35
+ noteHave(source, log, head) {
36
+ const key = bytesToHex(log);
37
+ let state = this.logs.get(key);
38
+ if (state === undefined) {
39
+ if (this.logs.size >= MAX_TRACKED_LEDGER_LOGS && !this.makeRoomFor(key)) {
40
+ this.reportOverLimit();
41
+ return;
42
+ }
43
+ state = {
44
+ id: Uint8Array.from(log),
45
+ heads: new Map(),
46
+ lastLocal: undefined,
47
+ rounds: 0,
48
+ reportedGap: 0,
49
+ reportedAtRound: undefined,
50
+ };
51
+ this.logs.set(key, state);
52
+ }
53
+ state.heads.set(source, head);
54
+ }
55
+ /** Makes room for a log at the tracking limit by dropping a tracked log this side holds nothing of, and only when this side holds the new one. */
56
+ makeRoomFor(key) {
57
+ if (!this.held.has(key))
58
+ return false;
59
+ for (const other of this.logs.keys()) {
60
+ if (this.held.has(other))
61
+ continue;
62
+ this.logs.delete(other);
63
+ return true;
64
+ }
65
+ return false;
66
+ }
67
+ reportOverLimit() {
68
+ const last = this.overLimitReportedAtRound;
69
+ if (last !== undefined &&
70
+ this.roundNumber - last < LEDGER_REPORT_REPEAT_ROUNDS) {
71
+ return;
72
+ }
73
+ this.overLimitReportedAtRound = this.roundNumber;
74
+ this.deps.onError(new Error(`the account ledger announces more than ${String(MAX_TRACKED_LEDGER_LOGS)} writer logs, which is more than any account has: the logs beyond them that this machine holds nothing of are ignored, so one of them that stays behind is not reported`));
75
+ }
76
+ /** Remembers that an out-of-range announcement was reported, and whether it had been before. */
77
+ firstReportOfOutOfRange(key, source) {
78
+ const id = `${key}:${source}`;
79
+ if (this.reportedOutOfRange.has(id))
80
+ return false;
81
+ this.reportedOutOfRange.add(id);
82
+ if (this.reportedOutOfRange.size > MAX_REMEMBERED_REPORTS) {
83
+ const [oldest] = this.reportedOutOfRange;
84
+ if (oldest !== undefined)
85
+ this.reportedOutOfRange.delete(oldest);
86
+ }
87
+ return true;
88
+ }
89
+ /**
90
+ * One replication round: compares every announced head with this side's (`localHeads`, by log id hex, absent for a log this side holds nothing of), counts the rounds each log stays behind without advancing, and on reaching LEDGER_STALL_ROUNDS reports it and asks every source that announced a higher head for the entries. Resolves once the requests have been sent.
91
+ */
92
+ async round(localHeads, options = {}) {
93
+ this.roundNumber += 1;
94
+ this.held = new Set(localHeads.keys());
95
+ const requests = [];
96
+ for (const [key, state] of this.logs) {
97
+ const local = localHeads.get(key) ?? 0;
98
+ for (const [source, head] of [...state.heads]) {
99
+ if (!this.deps.isLive(source)) {
100
+ state.heads.delete(source);
101
+ }
102
+ else if (head - local > MAX_ANNOUNCED_HEAD_DISTANCE) {
103
+ state.heads.delete(source);
104
+ if (this.firstReportOfOutOfRange(key, source)) {
105
+ this.deps.onError(new Error(`a peer announced head ${String(head)} for account ledger log ${key}, which is out of range for a log this machine holds up to entry ${String(local)} of, and the announcement is ignored`));
106
+ }
107
+ }
108
+ else {
109
+ this.reportedOutOfRange.delete(`${key}:${source}`);
110
+ }
111
+ }
112
+ const announced = Math.max(0, ...state.heads.values());
113
+ if (announced <= local) {
114
+ this.logs.delete(key);
115
+ continue;
116
+ }
117
+ if (options.offline === true)
118
+ continue;
119
+ if (state.lastLocal === local) {
120
+ state.rounds += 1;
121
+ }
122
+ else {
123
+ state.rounds = 1;
124
+ state.reportedGap = 0;
125
+ }
126
+ state.lastLocal = local;
127
+ if (state.rounds < LEDGER_STALL_ROUNDS)
128
+ continue;
129
+ const gap = announced - local;
130
+ const due = state.reportedAtRound === undefined ||
131
+ this.roundNumber - state.reportedAtRound >= LEDGER_REPORT_REPEAT_ROUNDS;
132
+ if (gap > state.reportedGap && due) {
133
+ state.reportedGap = gap;
134
+ state.reportedAtRound = this.roundNumber;
135
+ this.deps.onError(new Error(`account ledger log ${key} has stayed behind for ${String(state.rounds)} rounds: this machine holds up to entry ${String(local)} and a peer announces ${String(announced)}; a grant or a revocation in the missing entries is not applied here, and the entries are being asked of every peer that announced them`));
136
+ }
137
+ for (const [source, head] of state.heads) {
138
+ if (head <= local)
139
+ continue;
140
+ requests.push(this.deps
141
+ .request(source, {
142
+ type: "data-request",
143
+ peer: state.id,
144
+ "from-seq": local,
145
+ })
146
+ .catch((error) => {
147
+ this.deps.onError(error instanceof Error ? error : new Error(String(error)));
148
+ }));
149
+ }
150
+ }
151
+ await Promise.all(requests);
152
+ }
153
+ /** The logs that have stayed behind for LEDGER_STALL_ROUNDS rounds or more as of the last round, for whoami. */
154
+ stalled() {
155
+ const out = [];
156
+ for (const [key, state] of this.logs) {
157
+ if (state.rounds < LEDGER_STALL_ROUNDS)
158
+ continue;
159
+ const announced = Math.max(0, ...state.heads.values());
160
+ out.push({
161
+ log: key,
162
+ localHead: state.lastLocal ?? 0,
163
+ announcedHead: announced,
164
+ rounds: state.rounds,
165
+ });
166
+ }
167
+ return out;
168
+ }
169
+ }
170
+ //# sourceMappingURL=ledger-gaps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-gaps.js","sourceRoot":"","sources":["../../src/core/ledger-gaps.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@
6
6
  * 2. Call handleAction(action)
7
7
  * 3. Return the result string to the LLM
8
8
  */
9
+ import type { StalledLedgerLog } from "./ledger-gaps.js";
9
10
  import type { AgentDetailsExchange } from "./agent-details.js";
10
11
  import { type Naming } from "./naming.js";
11
12
  import type { LanWebUiEntry } from "./lan-web-uis.js";
@@ -138,6 +139,8 @@ export interface CommsToolOptions {
138
139
  readonly getNewerVersionIfAny?: () => string | undefined;
139
140
  /** How many stored account ledger entries cannot be read, for whoami; omitted when the store has no account ledger. */
140
141
  readonly getUnreadableLedgerEntries?: () => number;
142
+ /** The account ledger's writer logs this side has stayed behind for several rounds, for whoami; omitted when the transport has no account ledger. */
143
+ readonly getStalledLedgerLogs?: () => readonly StalledLedgerLog[];
141
144
  /** Fetches a signer's armored PGP public key by fingerprint, used by gateway_redeem_connection_code when the caller supplies a fingerprint but not the key text itself. Defaults to the real keys.openpgp.org lookup (pgp-keyserver.ts); a test that would otherwise trigger real network I/O injects a fake resolver instead, the same reasoning bridge-mesh.ts's own fetchLatestVersion override already establishes for getNewerVersionIfAny above. */
142
145
  readonly fetchPgpPublicKeyByFingerprintImpl?: (fingerprint: string) => Promise<string>;
143
146
  }
@@ -149,6 +152,7 @@ export declare class CommsTool {
149
152
  private readonly naming;
150
153
  private readonly getNewerVersionIfAny;
151
154
  private readonly getUnreadableLedgerEntries;
155
+ private readonly getStalledLedgerLogs;
152
156
  private readonly fetchPgpPublicKeyByFingerprintImpl;
153
157
  constructor(store: CommsStore & MeshOnlyFeatures, options?: Readonly<CommsToolOptions>);
154
158
  /** The "Update available: ..." line appended to whoami/update output when a newer release is known, or undefined when there's nothing to report. */
@@ -158,6 +162,8 @@ export declare class CommsTool {
158
162
  private update;
159
163
  /** The namer for ctx's view: petnames and known self names when naming is wired, otherwise only what each caller passes. */
160
164
  private namerFor;
165
+ /** The `Account ledger log <id> is behind` lines for whoami and update, one per writer log this side has stayed behind, at most MAX_STALLED_LEDGER_LINES of them and then one `Account ledger: <n> more logs are behind` line. The wording is part of the interface: the README states it. */
166
+ private stalledLedgerLines;
161
167
  private whoami;
162
168
  private webUrl;
163
169
  private createRoom;
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/core/tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/core/tool.ts"],"names":[],"mappings":"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"}