@cello-protocol/daemon 0.0.52 → 0.0.54
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/dist/agent-handlers.d.ts +57 -0
- package/dist/agent-handlers.d.ts.map +1 -0
- package/dist/agent-handlers.js +360 -0
- package/dist/agent-handlers.js.map +1 -0
- package/dist/agent-id-migration.d.ts.map +1 -1
- package/dist/agent-id-migration.js +1 -0
- package/dist/agent-id-migration.js.map +1 -1
- package/dist/agent-loader.d.ts +3 -4
- package/dist/agent-loader.d.ts.map +1 -1
- package/dist/agent-loader.js +3 -4
- package/dist/agent-loader.js.map +1 -1
- package/dist/cbor-blob-migration.d.ts +8 -0
- package/dist/cbor-blob-migration.d.ts.map +1 -0
- package/dist/cbor-blob-migration.js +115 -0
- package/dist/cbor-blob-migration.js.map +1 -0
- package/dist/close-session-handler.d.ts +41 -0
- package/dist/close-session-handler.d.ts.map +1 -0
- package/dist/close-session-handler.js +399 -0
- package/dist/close-session-handler.js.map +1 -0
- package/dist/consortium-bootstrap.d.ts +83 -0
- package/dist/consortium-bootstrap.d.ts.map +1 -0
- package/dist/consortium-bootstrap.js +120 -0
- package/dist/consortium-bootstrap.js.map +1 -0
- package/dist/contact-handlers.d.ts +56 -0
- package/dist/contact-handlers.d.ts.map +1 -0
- package/dist/contact-handlers.js +303 -0
- package/dist/contact-handlers.js.map +1 -0
- package/dist/content-park-client.d.ts.map +1 -1
- package/dist/content-park-client.js +7 -7
- package/dist/content-park-client.js.map +1 -1
- package/dist/content-park.d.ts +15 -0
- package/dist/content-park.d.ts.map +1 -0
- package/dist/content-park.js +227 -0
- package/dist/content-park.js.map +1 -0
- package/dist/daemon.d.ts +0 -11
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +407 -4552
- package/dist/daemon.js.map +1 -1
- package/dist/db-identity-store.d.ts +31 -35
- package/dist/db-identity-store.d.ts.map +1 -1
- package/dist/db-identity-store.js +62 -66
- package/dist/db-identity-store.js.map +1 -1
- package/dist/directory-bootstrap.d.ts +27 -31
- package/dist/directory-bootstrap.d.ts.map +1 -1
- package/dist/directory-bootstrap.js +18 -21
- package/dist/directory-bootstrap.js.map +1 -1
- package/dist/frame-values.d.ts +3 -0
- package/dist/frame-values.d.ts.map +1 -0
- package/dist/frame-values.js +73 -0
- package/dist/frame-values.js.map +1 -0
- package/dist/identity-migration.d.ts +8 -8
- package/dist/identity-migration.d.ts.map +1 -1
- package/dist/identity-migration.js +30 -31
- package/dist/identity-migration.js.map +1 -1
- package/dist/inbound-seal-request.d.ts +17 -0
- package/dist/inbound-seal-request.d.ts.map +1 -0
- package/dist/inbound-seal-request.js +155 -0
- package/dist/inbound-seal-request.js.map +1 -0
- package/dist/inbound-sessions.d.ts +54 -0
- package/dist/inbound-sessions.d.ts.map +1 -0
- package/dist/inbound-sessions.js +603 -0
- package/dist/inbound-sessions.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -10
- package/dist/index.js.map +1 -1
- package/dist/initiate-session-handler.d.ts +22 -0
- package/dist/initiate-session-handler.d.ts.map +1 -0
- package/dist/initiate-session-handler.js +150 -0
- package/dist/initiate-session-handler.js.map +1 -0
- package/dist/network-directory-node.d.ts +6 -6
- package/dist/network-directory-node.d.ts.map +1 -1
- package/dist/network-directory-node.js +29 -28
- package/dist/network-directory-node.js.map +1 -1
- package/dist/notification-handlers.d.ts +32 -0
- package/dist/notification-handlers.d.ts.map +1 -0
- package/dist/notification-handlers.js +73 -0
- package/dist/notification-handlers.js.map +1 -0
- package/dist/outbound-sessions.d.ts +54 -0
- package/dist/outbound-sessions.d.ts.map +1 -0
- package/dist/outbound-sessions.js +429 -0
- package/dist/outbound-sessions.js.map +1 -0
- package/dist/park-envelope.d.ts.map +1 -1
- package/dist/park-envelope.js +3 -2
- package/dist/park-envelope.js.map +1 -1
- package/dist/register-handler.d.ts +35 -0
- package/dist/register-handler.d.ts.map +1 -0
- package/dist/register-handler.js +179 -0
- package/dist/register-handler.js.map +1 -0
- package/dist/registration-manager.d.ts.map +1 -1
- package/dist/registration-manager.js +3 -6
- package/dist/registration-manager.js.map +1 -1
- package/dist/relay-receipt-store.d.ts.map +1 -1
- package/dist/relay-receipt-store.js +1 -2
- package/dist/relay-receipt-store.js.map +1 -1
- package/dist/retry-queue.d.ts +18 -60
- package/dist/retry-queue.d.ts.map +1 -1
- package/dist/retry-queue.js +46 -97
- package/dist/retry-queue.js.map +1 -1
- package/dist/seal-coordinator.d.ts +47 -0
- package/dist/seal-coordinator.d.ts.map +1 -0
- package/dist/seal-coordinator.js +551 -0
- package/dist/seal-coordinator.js.map +1 -0
- package/dist/seal-flows.d.ts +50 -0
- package/dist/seal-flows.d.ts.map +1 -0
- package/dist/seal-flows.js +454 -0
- package/dist/seal-flows.js.map +1 -0
- package/dist/seal-frontier-verify.d.ts +9 -9
- package/dist/seal-frontier-verify.d.ts.map +1 -1
- package/dist/seal-frontier-verify.js +11 -12
- package/dist/seal-frontier-verify.js.map +1 -1
- package/dist/seal-leaf.d.ts +58 -0
- package/dist/seal-leaf.d.ts.map +1 -0
- package/dist/seal-leaf.js +111 -0
- package/dist/seal-leaf.js.map +1 -0
- package/dist/seal-receipt-upgrade.d.ts +1 -1
- package/dist/seal-receipt-upgrade.js +1 -1
- package/dist/seal-upgrade.d.ts +10 -10
- package/dist/seal-upgrade.d.ts.map +1 -1
- package/dist/seal-upgrade.js +23 -24
- package/dist/seal-upgrade.js.map +1 -1
- package/dist/session-assignment-parser.d.ts +16 -19
- package/dist/session-assignment-parser.d.ts.map +1 -1
- package/dist/session-assignment-parser.js +30 -29
- package/dist/session-assignment-parser.js.map +1 -1
- package/dist/session-ceremony.d.ts +3 -6
- package/dist/session-ceremony.d.ts.map +1 -1
- package/dist/session-ceremony.js +7 -9
- package/dist/session-ceremony.js.map +1 -1
- package/dist/session-content-handlers.d.ts +25 -0
- package/dist/session-content-handlers.d.ts.map +1 -0
- package/dist/session-content-handlers.js +436 -0
- package/dist/session-content-handlers.js.map +1 -0
- package/dist/session-name.d.ts +35 -0
- package/dist/session-name.d.ts.map +1 -0
- package/dist/session-name.js +60 -0
- package/dist/session-name.js.map +1 -0
- package/dist/session-node-manager.d.ts +26 -62
- package/dist/session-node-manager.d.ts.map +1 -1
- package/dist/session-node-manager.js +115 -92
- package/dist/session-node-manager.js.map +1 -1
- package/dist/session-read-handlers.d.ts +38 -0
- package/dist/session-read-handlers.d.ts.map +1 -0
- package/dist/session-read-handlers.js +233 -0
- package/dist/session-read-handlers.js.map +1 -0
- package/dist/session-relay-client.d.ts +8 -8
- package/dist/session-relay-client.d.ts.map +1 -1
- package/dist/session-relay-client.js +44 -46
- package/dist/session-relay-client.js.map +1 -1
- package/dist/session-tree.d.ts +11 -23
- package/dist/session-tree.d.ts.map +1 -1
- package/dist/session-tree.js +14 -26
- package/dist/session-tree.js.map +1 -1
- package/dist/signaling-connect.d.ts +2 -5
- package/dist/signaling-connect.d.ts.map +1 -1
- package/dist/signaling-connect.js +7 -12
- package/dist/signaling-connect.js.map +1 -1
- package/dist/sqlcipher-db.d.ts +18 -19
- package/dist/sqlcipher-db.d.ts.map +1 -1
- package/dist/sqlcipher-db.js +30 -30
- package/dist/sqlcipher-db.js.map +1 -1
- package/dist/telegram-doorbell.d.ts +38 -0
- package/dist/telegram-doorbell.d.ts.map +1 -0
- package/dist/telegram-doorbell.js +139 -0
- package/dist/telegram-doorbell.js.map +1 -0
- package/dist/types.d.ts +86 -79
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -1
- package/dist/types.js.map +1 -1
- package/dist/vocabulary.d.ts +30 -30
- package/dist/vocabulary.d.ts.map +1 -1
- package/dist/vocabulary.js +41 -49
- package/dist/vocabulary.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { KeyProvider } from "@cello-protocol/crypto";
|
|
2
|
+
import type { SessionNodeManager } from "./session-node-manager.js";
|
|
3
|
+
import type { AgentInfo, Logger } from "./types.js";
|
|
4
|
+
export interface InboundSealRequestDeps {
|
|
5
|
+
logger: Logger;
|
|
6
|
+
sessionNodeManager: SessionNodeManager;
|
|
7
|
+
agents: AgentInfo[];
|
|
8
|
+
getKeyProvider: (agentName: string) => KeyProvider | undefined;
|
|
9
|
+
sendOver: (agentName: string, frame: Record<string, unknown>) => Promise<{
|
|
10
|
+
ok: boolean;
|
|
11
|
+
reason?: string;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
export declare function createInboundSealRequestHandler(deps: InboundSealRequestDeps): {
|
|
15
|
+
handleInboundSealInterruptedRequest: (frame: Record<string, unknown>) => Promise<void>;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=inbound-seal-request.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbound-seal-request.d.ts","sourceRoot":"","sources":["../src/inbound-seal-request.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGpD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,WAAW,GAAG,SAAS,CAAC;IAC/D,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5G;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,sBAAsB;iDAYhB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,OAAO,CAAC,IAAI,CAAC;EA+HlG"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The inbound seal-interrupted REQUEST: the counterparty went away, and the other side is asking us
|
|
3
|
+
* to co-sign the seal of a session neither of us can finish normally.
|
|
4
|
+
*
|
|
5
|
+
* We answer with our OWN signed leaf, or with a rejection naming the exact mismatch (nonce,
|
|
6
|
+
* leaf count, signature). We never sign a leaf whose content we cannot corroborate — a
|
|
7
|
+
* seal-interrupted ack is a cryptographic statement about what was said, not a courtesy.
|
|
8
|
+
*/
|
|
9
|
+
import { randomUUID } from "node:crypto";
|
|
10
|
+
import { buildSignedSealInterruptedLeaf } from "./seal-leaf.js";
|
|
11
|
+
export function createInboundSealRequestHandler(deps) {
|
|
12
|
+
const { logger, sessionNodeManager, agents, getKeyProvider, sendOver } = deps;
|
|
13
|
+
// ─── M7-SESSION-001 (H-1): seal-interrupted bilateral RESPONDER ────────────
|
|
14
|
+
//
|
|
15
|
+
// A PERSISTENT inbound handler (registered once, below) that reacts to inbound
|
|
16
|
+
// `seal_interrupted_request` frames from a counterparty. It validates local
|
|
17
|
+
// state, K_local-signs this node's SEAL-INTERRUPTED leaf (co-signing the same
|
|
18
|
+
// Merkle root the initiator sent), echoes the nonce, includes initiatorPubkey
|
|
19
|
+
// for directory routing, persists the responder side of the commitment, moves
|
|
20
|
+
// the session to 'seal_interrupted_pending', and returns a seal_interrupted_ack.
|
|
21
|
+
// On any inconsistent local state it returns a seal_interrupted_rejection.
|
|
22
|
+
async function handleInboundSealInterruptedRequest(frame) {
|
|
23
|
+
const correlationId = randomUUID();
|
|
24
|
+
const sessionId = typeof frame["sessionId"] === "string" ? frame["sessionId"] : null;
|
|
25
|
+
const initiatorPubkey = typeof frame["initiatorPubkey"] === "string" ? frame["initiatorPubkey"] : null;
|
|
26
|
+
const counterpartyPubkey = typeof frame["counterpartyPubkey"] === "string" ? frame["counterpartyPubkey"] : null;
|
|
27
|
+
const leafCountReq = typeof frame["leafCountAtInterruption"] === "number" ? frame["leafCountAtInterruption"] : null;
|
|
28
|
+
const merkleRootReq = typeof frame["merkleRootAtInterruption"] === "string" ? frame["merkleRootAtInterruption"] : "";
|
|
29
|
+
const nonce = typeof frame["nonce"] === "string" ? frame["nonce"] : null;
|
|
30
|
+
// Cannot even route a rejection without sessionId + initiatorPubkey.
|
|
31
|
+
if (!sessionId || !initiatorPubkey || !counterpartyPubkey || nonce === null || leafCountReq === null) {
|
|
32
|
+
logger.warn("session.interrupted.request.malformed", {
|
|
33
|
+
correlationId,
|
|
34
|
+
hasSessionId: sessionId !== null,
|
|
35
|
+
hasInitiatorPubkey: initiatorPubkey !== null,
|
|
36
|
+
});
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const reject = async (reason) => {
|
|
40
|
+
// CONN-001: send the rejection over the LOCAL responder agent's own stream (the agent whose
|
|
41
|
+
// pubkey is counterpartyPubkey — the stream this request arrived on). If unresolved, sendOver
|
|
42
|
+
// reports a send failure rather than throwing.
|
|
43
|
+
const sent = await sendOver(agents.find((a) => a.pubkey === counterpartyPubkey)?.name ?? "", {
|
|
44
|
+
type: "seal_interrupted_rejection",
|
|
45
|
+
sessionId,
|
|
46
|
+
initiatorPubkey,
|
|
47
|
+
reason,
|
|
48
|
+
});
|
|
49
|
+
// fallback-finder LOW: don't log the rejection as delivered when the send failed (e.g. no local
|
|
50
|
+
// agent for counterpartyPubkey, or a transient send error) — the counterparty would otherwise
|
|
51
|
+
// appear rejected but only ever see a timeout.
|
|
52
|
+
if (sent.ok) {
|
|
53
|
+
logger.warn("session.interrupted.request.rejected", { sessionId, reason, correlationId });
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
logger.warn("session.interrupted.request.rejection.send.failed", { sessionId, reason, sendReason: sent.reason, correlationId });
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
// DOD-LOOP-1: resolve the addressed local agent FIRST — the composite (agent, session_id) key
|
|
60
|
+
// needs it. The request must be addressed to one of our agents (counterpartyPubkey is OUR
|
|
61
|
+
// pubkey from the initiator's perspective).
|
|
62
|
+
const localAgent = agents.find((a) => a.pubkey === counterpartyPubkey);
|
|
63
|
+
if (!localAgent) {
|
|
64
|
+
await reject("unknown_counterparty");
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const localRecord = sessionNodeManager.getSessionRecord(localAgent.name, sessionId);
|
|
68
|
+
if (!localRecord) {
|
|
69
|
+
await reject("session_not_found");
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// DAEMON-004: an 'active' session is eligible too (the active-session seal
|
|
73
|
+
// reuses this exchange). We still never re-process a terminal 'sealed' row or
|
|
74
|
+
// an already-pending one.
|
|
75
|
+
if (localRecord.status !== "interrupted" && localRecord.status !== "active") {
|
|
76
|
+
await reject("session_not_interrupted");
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// From our perspective the initiator is our counterparty.
|
|
80
|
+
if (localRecord.counterparty_pubkey !== initiatorPubkey) {
|
|
81
|
+
await reject("initiator_mismatch");
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// DAEMON-004 (SI-001): we sign over OUR OWN daemon-owned tree, never the
|
|
85
|
+
// initiator-supplied root.
|
|
86
|
+
//
|
|
87
|
+
// round-2 finding #6: for an ACTIVE session the daemon ALWAYS binds its own tree
|
|
88
|
+
// root — even the canonical EMPTY-tree root when no content has flowed — never the
|
|
89
|
+
// initiator-supplied `merkleRootReq`. Echoing the caller's root would let an
|
|
90
|
+
// initiator dictate the root a responder signs (the SI-001 trust hole). Only a
|
|
91
|
+
// LEGACY 'interrupted' session that predates DAEMON-004 (no tree ever persisted)
|
|
92
|
+
// falls back to message_count + the supplied root (SESSION-001 behavior).
|
|
93
|
+
const ownTree = sessionNodeManager.getSessionTree(localAgent.name, sessionId);
|
|
94
|
+
const isActive = localRecord.status === "active";
|
|
95
|
+
const useOwnTree = isActive || ownTree.size() > 0;
|
|
96
|
+
const ownLeafCount = useOwnTree ? ownTree.size() : (localRecord.message_count ?? 0);
|
|
97
|
+
const ownRoot = useOwnTree ? sessionNodeManager.getSessionTreeRootHex(localAgent.name, sessionId) : merkleRootReq;
|
|
98
|
+
// SI-002/AC-008: leaf-count agreement against our own state.
|
|
99
|
+
if (ownLeafCount !== leafCountReq) {
|
|
100
|
+
await reject("leaf_count_mismatch");
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const kp = getKeyProvider(localAgent.name);
|
|
104
|
+
if (!kp) {
|
|
105
|
+
await reject("signing_key_unavailable");
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// Co-sign our SEAL-INTERRUPTED leaf. When we hold our own tree the root is
|
|
109
|
+
// ours (SI-001); otherwise we echo the initiator-supplied root unchanged.
|
|
110
|
+
const ownLeaf = await buildSignedSealInterruptedLeaf(kp, {
|
|
111
|
+
sessionId,
|
|
112
|
+
leafCount: ownLeafCount,
|
|
113
|
+
merkleRootAtInterruption: ownRoot,
|
|
114
|
+
signerPubkeyHex: counterpartyPubkey,
|
|
115
|
+
});
|
|
116
|
+
// Persist the responder side of the bilateral commitment. The responder never
|
|
117
|
+
// receives the initiator's leaf in this request→ack protocol, so it records
|
|
118
|
+
// only its own signed leaf plus the agreed root; the full both-leaves artifact
|
|
119
|
+
// lives on the initiator side. Advances status interrupted → seal_interrupted_pending.
|
|
120
|
+
sessionNodeManager.persistSealInterruptedCommitment({
|
|
121
|
+
agentName: localAgent.name,
|
|
122
|
+
sessionId,
|
|
123
|
+
role: "responder",
|
|
124
|
+
ownLeaf,
|
|
125
|
+
counterpartyLeaf: null,
|
|
126
|
+
merkleRoot: ownRoot,
|
|
127
|
+
nonce,
|
|
128
|
+
});
|
|
129
|
+
const ack = {
|
|
130
|
+
type: "seal_interrupted_ack",
|
|
131
|
+
sessionId,
|
|
132
|
+
initiatorPubkey,
|
|
133
|
+
nonce,
|
|
134
|
+
sealInterruptedLeaf: ownLeaf,
|
|
135
|
+
};
|
|
136
|
+
const sendResult = await sendOver(localAgent.name, ack);
|
|
137
|
+
if (!sendResult.ok) {
|
|
138
|
+
logger.error("session.interrupted.ack.send.failed", {
|
|
139
|
+
sessionId,
|
|
140
|
+
agentName: localAgent.name,
|
|
141
|
+
reason: sendResult.reason,
|
|
142
|
+
correlationId,
|
|
143
|
+
});
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
logger.info("session.interrupted.responder.acked", {
|
|
147
|
+
sessionId,
|
|
148
|
+
agentName: localAgent.name,
|
|
149
|
+
leafCount: ownLeafCount,
|
|
150
|
+
correlationId,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return { handleInboundSealInterruptedRequest };
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=inbound-seal-request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbound-seal-request.js","sourceRoot":"","sources":["../src/inbound-seal-request.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { SignalingManager } from "@cello-protocol/transport";
|
|
2
|
+
import type { KeyProvider } from "@cello-protocol/crypto";
|
|
3
|
+
import type { IpcHandler } from "./ipc-server.js";
|
|
4
|
+
import type { SessionNodeManager } from "./session-node-manager.js";
|
|
5
|
+
import type { AgentInfo, Logger } from "./types.js";
|
|
6
|
+
import type { ConnState } from "./contact-handlers.js";
|
|
7
|
+
/** How long an un-accepted inbound session request stays claimable. */
|
|
8
|
+
export declare const INBOUND_SESSION_TTL_MS: number;
|
|
9
|
+
/** A session request that expired before anyone claimed it. Surfaced by the push-loss reconciler. */
|
|
10
|
+
export interface ExpiredSessionRequest {
|
|
11
|
+
sessionIdHex: string;
|
|
12
|
+
counterpartyPubkeyHex: string;
|
|
13
|
+
expiredAt: number;
|
|
14
|
+
}
|
|
15
|
+
export interface InboundSessionEvent {
|
|
16
|
+
sessionIdHex: string;
|
|
17
|
+
counterpartyPubkeyHex: string;
|
|
18
|
+
genesisPrevRootHex: string;
|
|
19
|
+
offeredMoniker?: string | null;
|
|
20
|
+
enqueuedAt?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface InboundSessionWaiter {
|
|
23
|
+
connectionId: string;
|
|
24
|
+
deliver: (e: InboundSessionEvent | null) => void;
|
|
25
|
+
}
|
|
26
|
+
export interface InboundSessionDeps {
|
|
27
|
+
logger: Logger;
|
|
28
|
+
sessionNodeManager: SessionNodeManager;
|
|
29
|
+
agents: AgentInfo[];
|
|
30
|
+
getConnState: (connectionId: string) => ConnState | undefined;
|
|
31
|
+
resolveCurrentAgent: (connState: ConnState | undefined, explicitAgent?: string) => string | null;
|
|
32
|
+
NO_CURRENT_AGENT_RESPONSE: unknown;
|
|
33
|
+
getKeyProvider: (agentName: string) => KeyProvider | undefined;
|
|
34
|
+
sharedSignaling: SignalingManager | undefined;
|
|
35
|
+
handleInboundSealInterruptedRequest: (frame: Record<string, unknown>) => Promise<void>;
|
|
36
|
+
reapDeadHalfOpenSessions: (agentName?: string) => void;
|
|
37
|
+
/** AWAY-1: the auto-reply when nobody is attending this agent. */
|
|
38
|
+
sendAwayResponse: (agentName: string, sessionId: string, kind: "request" | "message") => Promise<void>;
|
|
39
|
+
dispatchSessionStateChangedWithTelegram: (agentName: string, sessionId: string, state: string, counterpartyPubkey: string | null) => void;
|
|
40
|
+
sendTelegramDoorbell: (agentName: string, sessionId: string, kind: "session_request" | "message_waiting" | "state_change", detail: string) => Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
export declare function createInboundSessions(deps: InboundSessionDeps): {
|
|
43
|
+
registerHandlers: (handlers: Map<string, IpcHandler>) => void;
|
|
44
|
+
wirePerAgentSessionInbound: (mgr: SignalingManager) => void;
|
|
45
|
+
handleTrustSignalPickup: (frame: Record<string, unknown>, keyProvider: import("@cello-protocol/crypto").KeyProvider, mgr: SignalingManager, agentName: string) => Promise<void>;
|
|
46
|
+
enqueueInboundSession: (agentName: string, event: InboundSessionEvent) => void;
|
|
47
|
+
reapExpiredInboundSessions: (agentName: string) => void;
|
|
48
|
+
inboundSessionQueues: Map<string, InboundSessionEvent[]>;
|
|
49
|
+
inboundSessionWaiters: Map<string, InboundSessionWaiter[]>;
|
|
50
|
+
expiredSessionRequests: Map<string, ExpiredSessionRequest[]>;
|
|
51
|
+
offeredMonikers: Map<string, string>;
|
|
52
|
+
offerKey: (agentName: string, sessionIdHex: string) => string;
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=inbound-sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbound-sessions.d.ts","sourceRoot":"","sources":["../src/inbound-sessions.ts"],"names":[],"mappings":"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"}
|