@cello-protocol/daemon 0.0.194 → 0.0.195

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 (103) hide show
  1. package/dist/assignment-verify.d.ts +39 -11
  2. package/dist/assignment-verify.d.ts.map +1 -1
  3. package/dist/assignment-verify.js +133 -17
  4. package/dist/assignment-verify.js.map +1 -1
  5. package/dist/authorship-verification.d.ts +70 -0
  6. package/dist/authorship-verification.d.ts.map +1 -0
  7. package/dist/authorship-verification.js +441 -0
  8. package/dist/authorship-verification.js.map +1 -0
  9. package/dist/db-identity-store.d.ts +1 -0
  10. package/dist/db-identity-store.d.ts.map +1 -1
  11. package/dist/db-identity-store.js +19 -1
  12. package/dist/db-identity-store.js.map +1 -1
  13. package/dist/held-content.d.ts +141 -0
  14. package/dist/held-content.d.ts.map +1 -0
  15. package/dist/held-content.js +388 -0
  16. package/dist/held-content.js.map +1 -0
  17. package/dist/inbound-refusals.d.ts +283 -0
  18. package/dist/inbound-refusals.d.ts.map +1 -0
  19. package/dist/inbound-refusals.js +919 -0
  20. package/dist/inbound-refusals.js.map +1 -0
  21. package/dist/inbound-sessions.d.ts.map +1 -1
  22. package/dist/inbound-sessions.js +65 -27
  23. package/dist/inbound-sessions.js.map +1 -1
  24. package/dist/initiate-session-handler.d.ts.map +1 -1
  25. package/dist/initiate-session-handler.js +63 -0
  26. package/dist/initiate-session-handler.js.map +1 -1
  27. package/dist/outbound-sessions.d.ts.map +1 -1
  28. package/dist/outbound-sessions.js +108 -8
  29. package/dist/outbound-sessions.js.map +1 -1
  30. package/dist/park-recovery.d.ts +205 -0
  31. package/dist/park-recovery.d.ts.map +1 -0
  32. package/dist/park-recovery.js +600 -0
  33. package/dist/park-recovery.js.map +1 -0
  34. package/dist/refusal-notices.d.ts +196 -0
  35. package/dist/refusal-notices.d.ts.map +1 -0
  36. package/dist/refusal-notices.js +496 -0
  37. package/dist/refusal-notices.js.map +1 -0
  38. package/dist/refusal-reasons.d.ts +11 -0
  39. package/dist/refusal-reasons.d.ts.map +1 -1
  40. package/dist/refusal-reasons.js +18 -0
  41. package/dist/refusal-reasons.js.map +1 -1
  42. package/dist/registration-manager.d.ts.map +1 -1
  43. package/dist/registration-manager.js +126 -5
  44. package/dist/registration-manager.js.map +1 -1
  45. package/dist/registration-persistence.d.ts +18 -0
  46. package/dist/registration-persistence.d.ts.map +1 -1
  47. package/dist/registration-persistence.js +6 -0
  48. package/dist/registration-persistence.js.map +1 -1
  49. package/dist/session-assignment-parser.d.ts.map +1 -1
  50. package/dist/session-assignment-parser.js +23 -1
  51. package/dist/session-assignment-parser.js.map +1 -1
  52. package/dist/session-ceremony.d.ts +12 -7
  53. package/dist/session-ceremony.d.ts.map +1 -1
  54. package/dist/session-ceremony.js +12 -7
  55. package/dist/session-ceremony.js.map +1 -1
  56. package/dist/session-ephemerals.d.ts +271 -0
  57. package/dist/session-ephemerals.d.ts.map +1 -0
  58. package/dist/session-ephemerals.js +546 -0
  59. package/dist/session-ephemerals.js.map +1 -0
  60. package/dist/session-leaf-records.d.ts +132 -0
  61. package/dist/session-leaf-records.d.ts.map +1 -0
  62. package/dist/session-leaf-records.js +320 -0
  63. package/dist/session-leaf-records.js.map +1 -0
  64. package/dist/session-liveness.d.ts +135 -0
  65. package/dist/session-liveness.d.ts.map +1 -0
  66. package/dist/session-liveness.js +347 -0
  67. package/dist/session-liveness.js.map +1 -0
  68. package/dist/session-node-manager.d.ts +300 -1670
  69. package/dist/session-node-manager.d.ts.map +1 -1
  70. package/dist/session-node-manager.js +871 -9951
  71. package/dist/session-node-manager.js.map +1 -1
  72. package/dist/session-node-types.d.ts +933 -0
  73. package/dist/session-node-types.d.ts.map +1 -0
  74. package/dist/session-node-types.js +576 -0
  75. package/dist/session-node-types.js.map +1 -0
  76. package/dist/session-queries.d.ts +476 -0
  77. package/dist/session-queries.d.ts.map +1 -0
  78. package/dist/session-queries.js +1006 -0
  79. package/dist/session-queries.js.map +1 -0
  80. package/dist/session-records.d.ts +320 -0
  81. package/dist/session-records.d.ts.map +1 -0
  82. package/dist/session-records.js +792 -0
  83. package/dist/session-records.js.map +1 -0
  84. package/dist/session-salts.d.ts +390 -0
  85. package/dist/session-salts.d.ts.map +1 -0
  86. package/dist/session-salts.js +1457 -0
  87. package/dist/session-salts.js.map +1 -0
  88. package/dist/session-schema.d.ts +30 -0
  89. package/dist/session-schema.d.ts.map +1 -0
  90. package/dist/session-schema.js +786 -0
  91. package/dist/session-schema.js.map +1 -0
  92. package/dist/standing-receivers.d.ts +280 -0
  93. package/dist/standing-receivers.d.ts.map +1 -0
  94. package/dist/standing-receivers.js +1100 -0
  95. package/dist/standing-receivers.js.map +1 -0
  96. package/dist/transport-selector.d.ts +13 -0
  97. package/dist/transport-selector.d.ts.map +1 -1
  98. package/dist/transport-selector.js.map +1 -1
  99. package/dist/witness-alerts.d.ts +40 -0
  100. package/dist/witness-alerts.d.ts.map +1 -0
  101. package/dist/witness-alerts.js +102 -0
  102. package/dist/witness-alerts.js.map +1 -0
  103. package/package.json +5 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-schema.js","sourceRoot":"","sources":["../src/session-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,280 @@
1
+ /**
2
+ * CELLO Daemon — THE STANDING RECEIVER: THE NODE THAT IS ALWAYS LISTENING
3
+ *
4
+ * Split out of `session-node-manager.ts` by 037-SESSIONCORE. One pre-created node per agent, kept
5
+ * alive at all times and handed to the first inbound session — then immediately replaced, so there
6
+ * is always one waiting.
7
+ *
8
+ * ⚠️ **ITS GATER IS NOT OPEN, and this sentence used to say it was.** `DOD-M15-ASSIGN-1` closed
9
+ * exactly that: the gater admits NOBODY inbound until a session offer names the dialer, while
10
+ * leaving this node's own outbound errands open (`allowedPeerId: null` — see the construction
11
+ * below, which says the same thing in the imperative).
12
+ *
13
+ * The wrong version is called out rather than quietly corrected because of what believing it costs:
14
+ * a reader who thinks the gater is open reads an unnamed-dialer rejection as a BUG and opens it, or
15
+ * waves off the hardening as already done. It was inherited from the manager's own header, which is
16
+ * corrected in the same commit.
17
+ *
18
+ * Moved verbatim, comments included.
19
+ *
20
+ * ⚠️ ITS ABSENCE IS THE FIRST SUSPECT WHEN A LIVE SESSION FAILS. `standing_receiver_unavailable`,
21
+ * an empty counterparty peer id, `Invalid peer ID: ""` — all of them start here. The receiver is
22
+ * created when the agent is STARTED, not at daemon boot, so an agent that was never started has no
23
+ * receiver and nothing to hand an inbound session.
24
+ */
25
+ import type { Logger } from "./types.js";
26
+ import { NodeAutoNatService, type CelloNode, type IAutoNatService } from "@cello-protocol/transport";
27
+ import { SessionConnectionGater } from "./session-connection-gater.js";
28
+ import type { DaemonDatabase } from "./sqlcipher-db.js";
29
+ import type { ISessionNodeFactory } from "./session-node-types.js";
30
+ import { type SessionNodeConfig } from "./session-node-types.js";
31
+ import type { SessionRecords } from "./session-records.js";
32
+ import type { ParkRecovery } from "./park-recovery.js";
33
+ /** What the standing receiver needs from the manager. */
34
+ export interface StandingReceiverContext {
35
+ readonly logger: Logger;
36
+ readonly records: SessionRecords;
37
+ readonly park: ParkRecovery;
38
+ readonly factory: ISessionNodeFactory;
39
+ /** A function: the manager opens its database after construction. Re-exposed below as `#db`. */
40
+ db(): DaemonDatabase | null;
41
+ shuttingDown(): boolean;
42
+ sessionKey(agentName: string, sessionId: string): string;
43
+ /**
44
+ * ⚠️ THESE MAPS ARE SHARED BY REFERENCE, NOT OWNED HERE. The reservation watchdog, the relay
45
+ * paths and session creation all read them and all stayed behind, so giving this module its own
46
+ * copies would create two answers to "which agents have a receiver". Each is assigned exactly
47
+ * once, at construction, so there is one object and no divergence.
48
+ */
49
+ readonly standingReceivers: Map<string, {
50
+ node: CelloNode;
51
+ gater: SessionConnectionGater;
52
+ autoNat: NodeAutoNatService;
53
+ seed: Uint8Array;
54
+ relayPeerIds: string[];
55
+ }>;
56
+ readonly standingReceiverCreating: Set<string>;
57
+ readonly agentsWantingReceiver: Set<string>;
58
+ readonly standingReceiverRemoving: Set<string>;
59
+ readonly srReservationRetry: Map<string, {
60
+ attempts: number;
61
+ nextAt: number;
62
+ correlationId: string;
63
+ lastReason?: string;
64
+ }>;
65
+ readonly srLastRejectionReason: Map<string, string>;
66
+ readonly srLastRespreadAt: Map<string, number>;
67
+ readonly directoryRelayEndpoints: Map<string, Array<{
68
+ relayPeerId: string;
69
+ relayAddrs: string[];
70
+ }>>;
71
+ readonly srRetryDelaysMs: number[];
72
+ readonly srReservationTimeoutMs: number;
73
+ /** The AutoNAT prober list, injected by the composition root. */
74
+ autoNatProbers(): string[];
75
+ proveToRelay(agentName: string, circuitAddr: string, node: CelloNode, correlationId: string, surfaceAsReceiverRefusal: boolean): Promise<"proven" | "refused_try_another_relay" | "refused_this_agent" | "unavailable">;
76
+ reservationCircuitAddrs(agentName: string): {
77
+ addrs: string[];
78
+ relayPeerIds: string[];
79
+ };
80
+ authenticateStandingReceiver(agentName: string, node: CelloNode, relayPeerId: string, heldCircuitAddr: string, correlationId: string): Promise<void>;
81
+ }
82
+ export declare class StandingReceivers {
83
+ #private;
84
+ constructor(ctx: StandingReceiverContext);
85
+ /**
86
+ * DOD-LOOP-1: ensure the given agent has a standing receiver node (idempotent). Created when an
87
+ * agent comes online (cello_start_agent) and replaced after it is handed off to a session. The
88
+ * `#standingReceiverCreating` guard prevents two concurrent ensure() calls (e.g. the
89
+ * cello_start_agent hook racing a consume-site retry) from building two nodes for one agent.
90
+ *
91
+ * M8B F14: a create failure no longer strands the agent deaf. Each ensure runs a BOUNDED
92
+ * retry loop (`standingReceiverRetryDelaysMs`, default 1s/5s/15s) — covering the fixed-port
93
+ * race where the consumed receiver still holds the port until its session node is torn down —
94
+ * and when every attempt fails, fires the alarm-worthy `session.standing_receiver.dead`
95
+ * (error level), distinct from the per-attempt `session.node.create.failed`. Re-arm is also
96
+ * kicked from destroySessionNode/retireSessionNode (the moment the port frees) and from the
97
+ * inbound accept path (ensure on demand), so one failure can never leave the agent deaf forever.
98
+ */
99
+ ensureStandingReceiver(agentName: string, correlationId?: string): Promise<void>;
100
+ /**
101
+ * Replace an agent's reservation-less standing receiver with one that reserves.
102
+ *
103
+ * Deliberately NOT removeStandingReceiverForAgent()+ensureStandingReceiverForAgent():
104
+ * the public remove CLEARS #agentsWantingReceiver, so a cello_set_agent_offline landing in
105
+ * the window while node.stop() is awaited would find no map entry and no creating
106
+ * marker, leave no tombstone, and the re-ensure would then RESURRECT a receiver for
107
+ * an agent that asked to go dark — accepting inbound sessions for an offline agent.
108
+ * Here the want-flag is left intact and re-checked after the stop: a concurrent stop
109
+ * clears it, and the rebuild correctly no-ops.
110
+ */
111
+ rebuildStandingReceiver(agentName: string): Promise<void>;
112
+ /**
113
+ * DOD-M12B-SESSION-SEED-1 — build a revived session node that is REACHABLE, without ever hanging.
114
+ *
115
+ * MEASURED 2026-08-18, live, three ways:
116
+ * - handed 2 relay addrs at once, no deadline: `start()` never completes (10,002ms and counting)
117
+ * - handed none: `start()` in 1ms, but NOBODY can dial the node —
118
+ * the counterparty's re-dial fails
119
+ * `counterparty_dial_failed` and every message in
120
+ * both directions has to go the relay park route
121
+ * - this: one candidate at a time, each raced against its
122
+ * own deadline, plain node as the floor
123
+ *
124
+ * The middle option is what shipped for one test run and it made the session half-dead: revived,
125
+ * `active`, and unreachable. The first is what shipped before that and it hung. Neither is a
126
+ * choice between "fast" and "reliable" — the per-candidate race is how `#startReceiverNode` has
127
+ * always done it, and it is the shape that works in production every day.
128
+ *
129
+ * A FAILED CANDIDATE IS TORN DOWN AT SETTLEMENT. The first version awaited `stop()` immediately
130
+ * and claimed that made seed reuse safe; it did not — `libp2p.stop()` returns at once unless the
131
+ * node is `'started'`, and during the timeout window it is `'starting'` (review HIGH-3, verified
132
+ * against libp2p 3.3.2). The teardown is now chained onto the candidate's OWN start promise, so it
133
+ * runs whenever that settles, however late.
134
+ *
135
+ * A BRIEF OVERLAP IS THEREFORE POSSIBLE and is stated rather than denied: a candidate that grants
136
+ * at 4s comes up on this session's peer id and is stopped immediately after. What is guaranteed is
137
+ * that it dies, not that it never lives. The receiver path avoids even that by minting a seed per
138
+ * candidate; here the identity is fixed, which is the whole point of a revival, so that option
139
+ * does not exist.
140
+ *
141
+ * The floor is a plain node: a session that is usable over the relay park route beats no session.
142
+ */
143
+ buildRevivedNode(sessionId: string, gater: SessionConnectionGater, seed: Uint8Array, candidateAddrs: string[], agentName: string): Promise<CelloNode>;
144
+ /**
145
+ * DOD-M15-RELAYONLY-1: build a transport node for THIS AGENT, with its privacy posture applied.
146
+ *
147
+ * ⚠️ THE CHOKE POINT FOR NODE CREATION, and it exists for the same reason as the one around
148
+ * `getStandingReceiverInfo`. Five call sites construct nodes; passing `relayOnly` at each would be
149
+ * a hand-kept list, and the SIXTH — added next month by someone who has never read this line —
150
+ * would build a node that hole-punches its way to a direct connection for an operator who asked
151
+ * never to be directly reachable. Here, a new caller inherits the posture instead of being told.
152
+ *
153
+ * `unknown` counts as ON, matching the publish and dial halves: a node that declines to hole-punch
154
+ * is reachable over the relay, while a disclosed address cannot be recalled.
155
+ */
156
+ createAgentNode(agentName: string, config: SessionNodeConfig): Promise<CelloNode>;
157
+ /**
158
+ * DOD-PARK-DRAIN-1 (review F6): why there is no standing-receiver node to dial from — named
159
+ * precisely, because `standing_receiver_unavailable` is the exit-point label that stood in for
160
+ * four different causes and misnamed this very incident 102 times.
161
+ *
162
+ * Only meaningful once `getStandingReceiverNode()` has returned null, which means NO agent on
163
+ * this daemon has a ready receiver — the dial node is not agent-scoped.
164
+ */
165
+ standingReceiverAbsenceReason(agentName: string): "daemon_shutting_down" | "standing_receiver_creating" | "agent_offline" | "no_standing_receiver";
166
+ getStandingReceiverInfo(agentName: string): {
167
+ peerId: string;
168
+ addrs: string[];
169
+ } | null;
170
+ /** DOD-LOOP-1: whether the given agent has a standing receiver ready (any agent if omitted). */
171
+ getStandingReceiverReady(agentName?: string): boolean;
172
+ /**
173
+ * The standing receiver's libp2p node — a general-purpose node usable for OUTBOUND dials that
174
+ * are not session-scoped (e.g. the content-park deposit/pull to the relay, MSG-001-3b). Its
175
+ * gater admits nobody INBOUND until a session names them (DOD-M15-ASSIGN-1), but leaves these
176
+ * outbound errands open. Returns null until the receiver is ready.
177
+ */
178
+ getStandingReceiverNode(agentName?: string): CelloNode | null;
179
+ /**
180
+ * DOD-M12B-RESERVATION-RETRY-1 — whether a NAT'd peer can actually DIAL this agent.
181
+ *
182
+ * `standing_receiver_ready` answers "is there a receiver?", which is true for a plain TCP node
183
+ * that no relay would give a circuit reservation to. Behind NAT that node is reachable by nobody,
184
+ * and the difference was visible only in the log — where it was visible 481 times and nobody
185
+ * acted. `"retrying"` and `"unreachable"` are the states an operator can do something about.
186
+ *
187
+ * reserved — holds a circuit reservation; a NAT'd peer can dial it.
188
+ * retrying — no reservation yet, still re-asking on a backoff.
189
+ * unreachable — no circuit reservation and the automatic re-attempts are spent, so only peers
190
+ * that can connect DIRECTLY will get in. It is not permanent: a directory
191
+ * reconnect carrying a DIFFERENT relay pool re-arms the budget, because a relay we
192
+ * have never tried is new information.
193
+ * absent — no receiver at all (the agent is not online).
194
+ */
195
+ getStandingReceiverReachability(agentName: string): "reserved" | "retrying" | "unreachable" | "absent";
196
+ /**
197
+ * CELLO-M7-TRANSPORT-001: the AutoNAT service wrapping the current standing
198
+ * receiver node, or null if the standing receiver is not ready. The composition
199
+ * root uses this as the daemon's runtime IAutoNatService — its getDialability()
200
+ * drives the SessionAssignment advertised address (AC-004/AC-019), and it is the
201
+ * source of the transport.autonat.result / transport.autonat.unavailable events.
202
+ */
203
+ getStandingReceiverAutoNat(): IAutoNatService | null;
204
+ /**
205
+ * Which peer this agent's standing receiver is currently admitting INBOUND — `null` for nobody.
206
+ *
207
+ * Read-only, and it answers a question the daemon otherwise cannot: *"whose dial would this
208
+ * receiver accept right now?"* The gate is narrowed and re-closed from several paths (an offer
209
+ * arrives, an assignment is refused, a session is promoted), and until now the only way to know
210
+ * where it had ended up was to reproduce the sequence in your head.
211
+ *
212
+ * Added for `DOD-M15-RESPONDER-VERIFY-1`, where a refusal for one session was closing the gate a
213
+ * DIFFERENT session had narrowed — a defect with no observable symptom short of the second
214
+ * session's initiator being refused with "nothing invited it".
215
+ */
216
+ getStandingReceiverAllowedPeer(agentName: string): string | null;
217
+ /**
218
+ * DOD-M15-ASSIGN-1 — name the one peer allowed to dial this agent's standing receiver, at the
219
+ * moment the directory's `session_offer` says who is coming.
220
+ *
221
+ * This is what makes the receiver's deny-by-default safe. The offer names
222
+ * `initiator_session_peer_id`, and the responder answers it by advertising its OWN address in
223
+ * `session_offer_accept`. Narrowing here — BEFORE that answer goes out — means the door opens to
224
+ * exactly one peer at the same instant the address that reaches them is published, and never
225
+ * before. The initiator cannot know where to dial until the accept it triggers has been sent.
226
+ *
227
+ * Returns WHICH failure it was, never a bare false (review F6). The caller reports a distinct
228
+ * reason per cause: "no receiver" and "the directory named nobody" are different subsystems, and
229
+ * collapsing them sent the operator to the directory for a local problem. This method never
230
+ * widens the gate to compensate.
231
+ *
232
+ * Narrows INBOUND ONLY. The receiver is still the daemon's general-purpose dialer at this point
233
+ * — no assignment exists yet — so revoking its outbound latitude here would break content
234
+ * parking and restart-seal submission (review F2).
235
+ */
236
+ admitOfferedDialer(agentName: string, initiatorSessionPeerId: string, sessionIdHex: string): "narrowed" | "no_receiver" | "no_peer_named";
237
+ /**
238
+ * What the UNSIGNED offer claimed, so the SIGNED assignment can be checked against it.
239
+ *
240
+ * DOD-M15-OFFER-SIGNED-1. Decision 2 rules that the listening socket is "gated on the
241
+ * assignment", and the gate is narrowed from `session_offer` — a frame carrying no signature —
242
+ * because that is the only thing that arrives early enough. Timing forced the offer; it does not
243
+ * excuse trusting it.
244
+ *
245
+ * Keeping what the offer said turns the two frames into a CHECK ON EACH OTHER. The assignment is
246
+ * FROST-signed by the initiator's own threshold group, which no single directory can produce, and
247
+ * it names the same peer id. A directory that says one peer in the offer and another in the
248
+ * assignment is naming two different dialers for one session — which a truthful directory never
249
+ * does, and which is exactly the move a compromised one would make to slip a peer past the gate
250
+ * before the signed document arrives.
251
+ */
252
+ getOfferedDialer(agentName: string, sessionIdHex: string): string | null;
253
+ /** Forget the offered dialer for ONE session — called on BOTH the claim and the refusal paths. */
254
+ clearOfferedDialer(agentName: string, sessionIdHex: string): void;
255
+ /**
256
+ * RE-CLOSE the standing receiver — but ONLY if this session is still the one holding it.
257
+ *
258
+ * DOD-M15-OFFER-SIGNED-1 review F4, then N1. The first version closed the gate unconditionally,
259
+ * and that was worse than the defect it fixed: an agent has ONE standing receiver with ONE allowed
260
+ * peer, so a refusal for session P closed the gate that offer Q had narrowed. Q's initiator —
261
+ * invited, legitimate — was then refused with *"nothing invited it"*, which this daemon had.
262
+ *
263
+ * That is the same cross-session interference F1 was written to remove, moved one method along,
264
+ * and triggerable the same way: one bogus offer/assignment pair collapses a concurrent real
265
+ * session.
266
+ *
267
+ * So the gate is closed only when it still names the peer THIS session opened it to. If a later
268
+ * offer has already re-narrowed it, that offer owns the receiver and its narrowing stands.
269
+ *
270
+ * NO EVICTION SWEEP, deliberately (N4). The sweep evicts by "not the allowed peer", and
271
+ * `getConnections()` returns OUTBOUND connections too — including the content-park and
272
+ * restart-seal dials this node makes as the daemon's general-purpose dialer, whose targets are on
273
+ * no allowlist by construction. Sweeping here hung those up, and the failure surfaced as
274
+ * `relay_unavailable`: a transport label for a local decision, which is the exact substitution
275
+ * that comment was written to prevent. The load-bearing control is `DOD-M15-FRAME-1`'s frame gate,
276
+ * which refuses what an unauthorised peer sends; closing the door is enough here.
277
+ */
278
+ revokeOfferedDialer(agentName: string, sessionIdHex: string, offeredPeerId: string | null): void;
279
+ }
280
+ //# sourceMappingURL=standing-receivers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standing-receivers.d.ts","sourceRoot":"","sources":["../src/standing-receivers.ts"],"names":[],"mappings":"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"}