@cello-protocol/daemon 0.0.53 → 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.
Files changed (173) hide show
  1. package/dist/agent-handlers.d.ts +57 -0
  2. package/dist/agent-handlers.d.ts.map +1 -0
  3. package/dist/agent-handlers.js +360 -0
  4. package/dist/agent-handlers.js.map +1 -0
  5. package/dist/agent-id-migration.d.ts.map +1 -1
  6. package/dist/agent-id-migration.js +1 -0
  7. package/dist/agent-id-migration.js.map +1 -1
  8. package/dist/agent-loader.d.ts +3 -4
  9. package/dist/agent-loader.d.ts.map +1 -1
  10. package/dist/agent-loader.js +3 -4
  11. package/dist/agent-loader.js.map +1 -1
  12. package/dist/cbor-blob-migration.d.ts +8 -0
  13. package/dist/cbor-blob-migration.d.ts.map +1 -0
  14. package/dist/cbor-blob-migration.js +115 -0
  15. package/dist/cbor-blob-migration.js.map +1 -0
  16. package/dist/close-session-handler.d.ts +41 -0
  17. package/dist/close-session-handler.d.ts.map +1 -0
  18. package/dist/close-session-handler.js +399 -0
  19. package/dist/close-session-handler.js.map +1 -0
  20. package/dist/consortium-bootstrap.d.ts +83 -0
  21. package/dist/consortium-bootstrap.d.ts.map +1 -0
  22. package/dist/consortium-bootstrap.js +120 -0
  23. package/dist/consortium-bootstrap.js.map +1 -0
  24. package/dist/contact-handlers.d.ts +56 -0
  25. package/dist/contact-handlers.d.ts.map +1 -0
  26. package/dist/contact-handlers.js +303 -0
  27. package/dist/contact-handlers.js.map +1 -0
  28. package/dist/content-park-client.d.ts.map +1 -1
  29. package/dist/content-park-client.js +7 -7
  30. package/dist/content-park-client.js.map +1 -1
  31. package/dist/content-park.d.ts +15 -0
  32. package/dist/content-park.d.ts.map +1 -0
  33. package/dist/content-park.js +227 -0
  34. package/dist/content-park.js.map +1 -0
  35. package/dist/daemon.d.ts +0 -11
  36. package/dist/daemon.d.ts.map +1 -1
  37. package/dist/daemon.js +407 -4552
  38. package/dist/daemon.js.map +1 -1
  39. package/dist/db-identity-store.d.ts +31 -35
  40. package/dist/db-identity-store.d.ts.map +1 -1
  41. package/dist/db-identity-store.js +62 -66
  42. package/dist/db-identity-store.js.map +1 -1
  43. package/dist/directory-bootstrap.d.ts +27 -31
  44. package/dist/directory-bootstrap.d.ts.map +1 -1
  45. package/dist/directory-bootstrap.js +18 -21
  46. package/dist/directory-bootstrap.js.map +1 -1
  47. package/dist/frame-values.d.ts +3 -0
  48. package/dist/frame-values.d.ts.map +1 -0
  49. package/dist/frame-values.js +73 -0
  50. package/dist/frame-values.js.map +1 -0
  51. package/dist/identity-migration.d.ts +8 -8
  52. package/dist/identity-migration.d.ts.map +1 -1
  53. package/dist/identity-migration.js +30 -31
  54. package/dist/identity-migration.js.map +1 -1
  55. package/dist/inbound-seal-request.d.ts +17 -0
  56. package/dist/inbound-seal-request.d.ts.map +1 -0
  57. package/dist/inbound-seal-request.js +155 -0
  58. package/dist/inbound-seal-request.js.map +1 -0
  59. package/dist/inbound-sessions.d.ts +54 -0
  60. package/dist/inbound-sessions.d.ts.map +1 -0
  61. package/dist/inbound-sessions.js +603 -0
  62. package/dist/inbound-sessions.js.map +1 -0
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +8 -10
  65. package/dist/index.js.map +1 -1
  66. package/dist/initiate-session-handler.d.ts +22 -0
  67. package/dist/initiate-session-handler.d.ts.map +1 -0
  68. package/dist/initiate-session-handler.js +150 -0
  69. package/dist/initiate-session-handler.js.map +1 -0
  70. package/dist/network-directory-node.d.ts +6 -6
  71. package/dist/network-directory-node.d.ts.map +1 -1
  72. package/dist/network-directory-node.js +29 -28
  73. package/dist/network-directory-node.js.map +1 -1
  74. package/dist/notification-handlers.d.ts +32 -0
  75. package/dist/notification-handlers.d.ts.map +1 -0
  76. package/dist/notification-handlers.js +73 -0
  77. package/dist/notification-handlers.js.map +1 -0
  78. package/dist/outbound-sessions.d.ts +54 -0
  79. package/dist/outbound-sessions.d.ts.map +1 -0
  80. package/dist/outbound-sessions.js +429 -0
  81. package/dist/outbound-sessions.js.map +1 -0
  82. package/dist/park-envelope.d.ts.map +1 -1
  83. package/dist/park-envelope.js +3 -2
  84. package/dist/park-envelope.js.map +1 -1
  85. package/dist/register-handler.d.ts +35 -0
  86. package/dist/register-handler.d.ts.map +1 -0
  87. package/dist/register-handler.js +179 -0
  88. package/dist/register-handler.js.map +1 -0
  89. package/dist/registration-manager.d.ts.map +1 -1
  90. package/dist/registration-manager.js +3 -6
  91. package/dist/registration-manager.js.map +1 -1
  92. package/dist/relay-receipt-store.d.ts.map +1 -1
  93. package/dist/relay-receipt-store.js +1 -2
  94. package/dist/relay-receipt-store.js.map +1 -1
  95. package/dist/retry-queue.d.ts +18 -60
  96. package/dist/retry-queue.d.ts.map +1 -1
  97. package/dist/retry-queue.js +46 -97
  98. package/dist/retry-queue.js.map +1 -1
  99. package/dist/seal-coordinator.d.ts +47 -0
  100. package/dist/seal-coordinator.d.ts.map +1 -0
  101. package/dist/seal-coordinator.js +551 -0
  102. package/dist/seal-coordinator.js.map +1 -0
  103. package/dist/seal-flows.d.ts +50 -0
  104. package/dist/seal-flows.d.ts.map +1 -0
  105. package/dist/seal-flows.js +454 -0
  106. package/dist/seal-flows.js.map +1 -0
  107. package/dist/seal-frontier-verify.d.ts +9 -9
  108. package/dist/seal-frontier-verify.d.ts.map +1 -1
  109. package/dist/seal-frontier-verify.js +11 -12
  110. package/dist/seal-frontier-verify.js.map +1 -1
  111. package/dist/seal-leaf.d.ts +58 -0
  112. package/dist/seal-leaf.d.ts.map +1 -0
  113. package/dist/seal-leaf.js +111 -0
  114. package/dist/seal-leaf.js.map +1 -0
  115. package/dist/seal-receipt-upgrade.d.ts +1 -1
  116. package/dist/seal-receipt-upgrade.js +1 -1
  117. package/dist/seal-upgrade.d.ts +10 -10
  118. package/dist/seal-upgrade.d.ts.map +1 -1
  119. package/dist/seal-upgrade.js +23 -24
  120. package/dist/seal-upgrade.js.map +1 -1
  121. package/dist/session-assignment-parser.d.ts +16 -19
  122. package/dist/session-assignment-parser.d.ts.map +1 -1
  123. package/dist/session-assignment-parser.js +30 -29
  124. package/dist/session-assignment-parser.js.map +1 -1
  125. package/dist/session-ceremony.d.ts +3 -6
  126. package/dist/session-ceremony.d.ts.map +1 -1
  127. package/dist/session-ceremony.js +7 -9
  128. package/dist/session-ceremony.js.map +1 -1
  129. package/dist/session-content-handlers.d.ts +25 -0
  130. package/dist/session-content-handlers.d.ts.map +1 -0
  131. package/dist/session-content-handlers.js +436 -0
  132. package/dist/session-content-handlers.js.map +1 -0
  133. package/dist/session-name.d.ts +35 -0
  134. package/dist/session-name.d.ts.map +1 -0
  135. package/dist/session-name.js +60 -0
  136. package/dist/session-name.js.map +1 -0
  137. package/dist/session-node-manager.d.ts +26 -62
  138. package/dist/session-node-manager.d.ts.map +1 -1
  139. package/dist/session-node-manager.js +115 -92
  140. package/dist/session-node-manager.js.map +1 -1
  141. package/dist/session-read-handlers.d.ts +38 -0
  142. package/dist/session-read-handlers.d.ts.map +1 -0
  143. package/dist/session-read-handlers.js +233 -0
  144. package/dist/session-read-handlers.js.map +1 -0
  145. package/dist/session-relay-client.d.ts +8 -8
  146. package/dist/session-relay-client.d.ts.map +1 -1
  147. package/dist/session-relay-client.js +44 -46
  148. package/dist/session-relay-client.js.map +1 -1
  149. package/dist/session-tree.d.ts +11 -23
  150. package/dist/session-tree.d.ts.map +1 -1
  151. package/dist/session-tree.js +14 -26
  152. package/dist/session-tree.js.map +1 -1
  153. package/dist/signaling-connect.d.ts +2 -5
  154. package/dist/signaling-connect.d.ts.map +1 -1
  155. package/dist/signaling-connect.js +7 -12
  156. package/dist/signaling-connect.js.map +1 -1
  157. package/dist/sqlcipher-db.d.ts +18 -19
  158. package/dist/sqlcipher-db.d.ts.map +1 -1
  159. package/dist/sqlcipher-db.js +30 -30
  160. package/dist/sqlcipher-db.js.map +1 -1
  161. package/dist/telegram-doorbell.d.ts +38 -0
  162. package/dist/telegram-doorbell.d.ts.map +1 -0
  163. package/dist/telegram-doorbell.js +139 -0
  164. package/dist/telegram-doorbell.js.map +1 -0
  165. package/dist/types.d.ts +86 -79
  166. package/dist/types.d.ts.map +1 -1
  167. package/dist/types.js +0 -1
  168. package/dist/types.js.map +1 -1
  169. package/dist/vocabulary.d.ts +30 -30
  170. package/dist/vocabulary.d.ts.map +1 -1
  171. package/dist/vocabulary.js +41 -49
  172. package/dist/vocabulary.js.map +1 -1
  173. package/package.json +5 -5
@@ -0,0 +1,83 @@
1
+ /**
2
+ * The startup consortium gate, and the routing it feeds.
3
+ *
4
+ * Two functions, and the split between them is the point:
5
+ *
6
+ * 1. verifyStartupManifest — loads and verifies the consortium manifest, checks its validity
7
+ * window and anti-rollback, and resolves the verified node set to live directory endpoints.
8
+ * It REPORTS what it found. It does NOT decide what to do about a failure.
9
+ *
10
+ * 2. createConsortiumRouting — builds the roster-aware failover resolver and starts the HTTP
11
+ * manifest poll.
12
+ *
13
+ * They are separate because startDaemon must be able to REFUSE TO START between them (ADV-002:
14
+ * a configured manifestProvider that fails verification is fatal). That refusal has to close the
15
+ * DB and release the singleton lock — both owned by startDaemon, neither this module's business —
16
+ * and it must happen BEFORE the manifest poll starts, or a refused startup leaks a live timer.
17
+ * Fusing these into one call would either drag the lock in here or leak that timer.
18
+ */
19
+ import type { Logger } from "./types.js";
20
+ import type { IManifestProvider, IManifestVersionStore, IManifestPollScheduler } from "@cello-protocol/transport";
21
+ import type { DirectoryEndpoint } from "./signaling-connect.js";
22
+ import { type ConsortiumEndpoint } from "./directory-bootstrap.js";
23
+ export interface ManifestGateDeps {
24
+ manifestProvider?: IManifestProvider;
25
+ manifestRootKeys?: readonly string[];
26
+ manifestThreshold?: number;
27
+ manifestVersionStore: IManifestVersionStore;
28
+ logger: Logger;
29
+ /** Injectable fetch, threaded to the /bootstrap probes. Defaults to global fetch. */
30
+ fetchFn?: typeof fetch;
31
+ }
32
+ export interface ManifestGateResult {
33
+ /** True only when a manifest was loaded, verified, in-window, and not a rollback. */
34
+ manifestVerified: boolean;
35
+ /** The verified manifest's version — 0 on the no-manifest back-compat path. */
36
+ verifiedManifestVersion: number;
37
+ /**
38
+ * The verified node set resolved to REACHABLE directory endpoints. May be shorter than the
39
+ * manifest's node list (a down node is skipped, not fatal — a T-of-N ceremony needs only T),
40
+ * and is empty on the back-compat path or when nothing resolved.
41
+ */
42
+ consortiumEndpoints: ConsortiumEndpoint[];
43
+ }
44
+ /**
45
+ * Load + verify the manifest, then resolve its node set to live endpoints.
46
+ *
47
+ * Every failure is REPORTED (manifestVerified: false) and logged, never thrown — the caller owns
48
+ * the refuse-to-start decision, because only it can release what a refusal must release.
49
+ */
50
+ export declare function verifyStartupManifest(deps: ManifestGateDeps): Promise<ManifestGateResult>;
51
+ export interface ConsortiumRoutingDeps {
52
+ manifestProvider?: IManifestProvider;
53
+ manifestRootKeys?: readonly string[];
54
+ manifestThreshold?: number;
55
+ manifestVersionStore: IManifestVersionStore;
56
+ manifestPollScheduler?: IManifestPollScheduler;
57
+ directoryHttpUrl?: string;
58
+ directoryEndpointResolver?: () => Promise<DirectoryEndpoint | null>;
59
+ logger: Logger;
60
+ fetchFn?: typeof fetch;
61
+ }
62
+ export interface ConsortiumRouting {
63
+ /**
64
+ * The roster for a session/seal FROST ceremony, re-resolved at ceremony time from the CURRENT
65
+ * verified manifest. NULL (not []) when no manifest is configured — the difference is
66
+ * load-bearing: null means "single-node ceremony, M6/M7 back-compat"; [] means "a consortium
67
+ * whose nodes are all unreachable", which the ceremony layer must refuse.
68
+ */
69
+ resolveConsortiumRoster: () => Promise<ConsortiumEndpoint[] | null>;
70
+ /**
71
+ * Roster-aware failover over the injected primary resolver (FINDING-4, the bootstrap SPOF).
72
+ * ONE instance, so signaling and ceremonies share sticky state and fail over TOGETHER — they
73
+ * must not end up talking to two different directory nodes. Undefined on the in-process test
74
+ * path, where there is no primary resolver to wrap.
75
+ */
76
+ failoverEndpointResolver: (() => Promise<DirectoryEndpoint | null>) | undefined;
77
+ /** Null-safe accessor for the ceremony/handler getDirectoryEndpoint sites. */
78
+ getFailoverEndpoint: () => Promise<DirectoryEndpoint | null>;
79
+ /** Stops the daemon-level HTTP manifest poll. Undefined when no poll was started. */
80
+ stopHttpManifestPoll: (() => void) | undefined;
81
+ }
82
+ export declare function createConsortiumRouting(deps: ConsortiumRoutingDeps): ConsortiumRouting;
83
+ //# sourceMappingURL=consortium-bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consortium-bootstrap.d.ts","sourceRoot":"","sources":["../src/consortium-bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,CAAC,EAAE,iBAAiB,CAAC;IACrC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,qBAAqB,CAAC;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,qFAAqF;IACrF,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,qFAAqF;IACrF,gBAAgB,EAAE,OAAO,CAAC;IAC1B,+EAA+E;IAC/E,uBAAuB,EAAE,MAAM,CAAC;IAChC;;;;OAIG;IACH,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;CAC3C;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkF/F;AAED,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CAAC,EAAE,iBAAiB,CAAC;IACrC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,qBAAqB,CAAC;IAC5C,qBAAqB,CAAC,EAAE,sBAAsB,CAAC;IAC/C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yBAAyB,CAAC,EAAE,MAAM,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IACpE,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,uBAAuB,EAAE,MAAM,OAAO,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,CAAC;IACpE;;;;;OAKG;IACH,wBAAwB,EAAE,CAAC,MAAM,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;IAChF,8EAA8E;IAC9E,mBAAmB,EAAE,MAAM,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IAC7D,qFAAqF;IACrF,oBAAoB,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CAChD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,qBAAqB,GAAG,iBAAiB,CAyCtF"}
@@ -0,0 +1,120 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { startHttpManifestPoll } from "./http-manifest-poll.js";
3
+ import { resolveDirectoryUrl, manifestNodesToEndpoints, createRosterAwareEndpointResolver, } from "./directory-bootstrap.js";
4
+ /**
5
+ * Load + verify the manifest, then resolve its node set to live endpoints.
6
+ *
7
+ * Every failure is REPORTED (manifestVerified: false) and logged, never thrown — the caller owns
8
+ * the refuse-to-start decision, because only it can release what a refusal must release.
9
+ */
10
+ export async function verifyStartupManifest(deps) {
11
+ const { manifestProvider, manifestRootKeys, manifestThreshold, manifestVersionStore, logger, fetchFn } = deps;
12
+ let manifestVerified = false;
13
+ let verifiedManifestVersion = 0;
14
+ let consortiumEndpoints = [];
15
+ if (!manifestProvider || !manifestRootKeys || manifestThreshold === undefined) {
16
+ return { manifestVerified, verifiedManifestVersion, consortiumEndpoints };
17
+ }
18
+ try {
19
+ const manifest = await manifestProvider.loadAndVerify(manifestRootKeys, manifestThreshold);
20
+ const now = new Date();
21
+ const notBefore = new Date(manifest.not_before);
22
+ const expiresAt = new Date(manifest.expires);
23
+ if (now < notBefore) {
24
+ logger.error("directory.auth.manifest.not.yet.valid", {
25
+ manifestVersion: manifest.version,
26
+ notBefore: manifest.not_before,
27
+ });
28
+ return { manifestVerified, verifiedManifestVersion, consortiumEndpoints };
29
+ }
30
+ if (expiresAt <= now) {
31
+ logger.error("directory.auth.manifest.expired", {
32
+ manifestVersion: manifest.version,
33
+ expiresAt: manifest.expires,
34
+ });
35
+ return { manifestVerified, verifiedManifestVersion, consortiumEndpoints };
36
+ }
37
+ // Anti-rollback. Equal versions are fine (a restart on an unchanged manifest); only a STRICTLY
38
+ // older version is a rollback attempt.
39
+ const lastSeen = await manifestVersionStore.getLastSeenVersion();
40
+ if (lastSeen !== null && manifest.version < lastSeen) {
41
+ logger.error("directory.auth.manifest.version.rollback", {
42
+ manifestVersion: manifest.version,
43
+ lastSeenVersion: lastSeen,
44
+ });
45
+ return { manifestVerified, verifiedManifestVersion, consortiumEndpoints };
46
+ }
47
+ await manifestVersionStore.persistVersion(manifest.version);
48
+ manifestVerified = true;
49
+ verifiedManifestVersion = manifest.version;
50
+ logger.info("directory.auth.manifest.verified", {
51
+ manifestVersion: manifest.version,
52
+ signerCount: manifest.signatures.length,
53
+ });
54
+ // DOD-MANIFEST-1: resolve the FULL verified node set — this is the roster a T-of-N ceremony
55
+ // fans out to. Availability-aware: a down node is skipped and the rest still resolve. The
56
+ // threshold gate lives in the ceremony layer (DOD-DKG-1); it NEVER falls back to the single
57
+ // hardcoded endpoint for a missing node, which would mask a down/forged node as healthy.
58
+ consortiumEndpoints = await manifestNodesToEndpoints(manifest.nodes, { logger, fetchFn });
59
+ const declaredNodes = manifest.nodes.length;
60
+ const resolvedNodes = consortiumEndpoints.length;
61
+ // Carry the nodeId↔peerId pairing (not just peerIds) so a consumer can verify each manifest
62
+ // identity is bound to the right live directory, not merely that the set has the right size.
63
+ const consortiumLog = {
64
+ manifestVersion: manifest.version,
65
+ declaredNodes,
66
+ resolvedNodes,
67
+ nodes: consortiumEndpoints.map((e) => ({ nodeId: e.nodeId, peerId: e.peerId })),
68
+ };
69
+ // Degraded ≠ healthy: a shrunken or empty roster must be loud, never buried at info.
70
+ if (resolvedNodes === 0) {
71
+ logger.error("directory.consortium.none", consortiumLog);
72
+ }
73
+ else if (resolvedNodes < declaredNodes) {
74
+ logger.warn("directory.consortium.partial", consortiumLog);
75
+ }
76
+ else {
77
+ logger.info("directory.consortium.resolved", consortiumLog);
78
+ }
79
+ }
80
+ catch (err) {
81
+ logger.error("directory.auth.manifest.load.failed", {
82
+ error: err instanceof Error ? err.message : String(err),
83
+ });
84
+ }
85
+ return { manifestVerified, verifiedManifestVersion, consortiumEndpoints };
86
+ }
87
+ export function createConsortiumRouting(deps) {
88
+ const { manifestProvider, manifestRootKeys, manifestThreshold, manifestVersionStore, manifestPollScheduler, directoryHttpUrl, directoryEndpointResolver, logger, fetchFn, } = deps;
89
+ const resolveConsortiumRoster = async () => {
90
+ const m = manifestProvider?.getCurrentManifest();
91
+ return m ? await manifestNodesToEndpoints(m.nodes, { logger, fetchFn }) : null;
92
+ };
93
+ const failoverEndpointResolver = directoryEndpointResolver
94
+ ? createRosterAwareEndpointResolver({
95
+ primaryResolver: directoryEndpointResolver,
96
+ getConsortiumRoster: resolveConsortiumRoster,
97
+ logger,
98
+ })
99
+ : undefined;
100
+ const getFailoverEndpoint = async () => failoverEndpointResolver ? await failoverEndpointResolver() : null;
101
+ // CELLO-M7-CONN-001 (DOD-CONN-3): the daemon-level manifest poll — it adopts a newer manifest
102
+ // independent of any agent identity, and so runs even with ZERO agents (the keystone it replaced
103
+ // could not). Off on the M6 back-compat path (no scheduler), and off without real root keys: a
104
+ // poll that verifies against an empty key set verifies against nothing.
105
+ let stopHttpManifestPoll;
106
+ if (manifestPollScheduler && manifestProvider && manifestRootKeys && manifestRootKeys.length > 0 && manifestThreshold && manifestThreshold >= 1) {
107
+ stopHttpManifestPoll = startHttpManifestPoll({
108
+ scheduler: manifestPollScheduler,
109
+ directoryUrl: directoryHttpUrl ?? resolveDirectoryUrl(process.env),
110
+ manifestProvider,
111
+ manifestVersionStore,
112
+ rootKeys: manifestRootKeys,
113
+ threshold: manifestThreshold,
114
+ logger,
115
+ mintCorrelationId: () => randomUUID(),
116
+ });
117
+ }
118
+ return { resolveConsortiumRoster, failoverEndpointResolver, getFailoverEndpoint, stopHttpManifestPoll };
119
+ }
120
+ //# sourceMappingURL=consortium-bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consortium-bootstrap.js","sourceRoot":"","sources":["../src/consortium-bootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { IpcHandler } from "./ipc-server.js";
2
+ import type { SessionNodeManager } from "./session-node-manager.js";
3
+ import type { Logger } from "./types.js";
4
+ /** The per-connection agent selection, as the address book needs to read it. */
5
+ export interface ConnState {
6
+ currentAgent: string | null;
7
+ clearedAgent?: string;
8
+ }
9
+ export interface ContactHandlerDeps {
10
+ handlers: Map<string, IpcHandler>;
11
+ sessionNodeManager: SessionNodeManager;
12
+ /**
13
+ * Read this connection's agent selection. The READ, not the container: these handlers only ever
14
+ * `.get(connectionId)`, and injecting the whole Map would hand the address book the power to
15
+ * mutate connection state it has no business touching.
16
+ */
17
+ getConnState: (connectionId: string) => ConnState | undefined;
18
+ /** The daemon's single agent-selection rule. Injected, never re-implemented here. */
19
+ resolveCurrentAgent: (connState: ConnState | undefined, explicitAgent?: string) => string | null;
20
+ /**
21
+ * Set (or clear, with null) an agent's outbound-name override. False when no such agent exists.
22
+ *
23
+ * Injected as a capability rather than reached for, because `cello_set_moniker` was the ONE
24
+ * address-book handler that bypassed the store interface entirely and grabbed the raw SQLite
25
+ * handle (`sessionNodeManager.getDb()`) to build a DbIdentityStore. Every other handler goes
26
+ * through a store method. Inside the closure that asymmetry was invisible; the extraction made it
27
+ * the single thing standing between this module and "needs no database". Same call, same
28
+ * behavior — the daemon still constructs the DbIdentityStore. It just says so out loud now.
29
+ */
30
+ setAgentMoniker: (agentName: string, moniker: string | null) => boolean;
31
+ logger: Logger;
32
+ /** M8C-TGDOOR-1: restart the poller after a token change, with no daemon restart. */
33
+ startTelegramPollerIfConfigured: () => void;
34
+ }
35
+ type Refusal = {
36
+ ok: false;
37
+ reason: string;
38
+ guidance: string;
39
+ };
40
+ /**
41
+ * Review finding 7 — a contact pubkey must LOOK like a pubkey, or the row can never work.
42
+ *
43
+ * The address-book handlers took `params.pubkey` as any string and stored it. So
44
+ * `cello contact tier add` — a plausible slip under the `contact <pubkey> <op>` shape, where the
45
+ * FIRST positional is the pubkey — persisted a contact whose pubkey is the literal text "tier",
46
+ * and answered ok:true. Nothing would ever match it: it is not a key, so it can never be a
47
+ * counterparty. The operator is told they added someone; they added a typo.
48
+ *
49
+ * A key is 32 bytes, hex: 64 characters. Anything else is refused, loudly, with the value echoed
50
+ * so the slip is obvious. Returns null when the pubkey is absent — the caller's own missing_params
51
+ * check owns that case and says something more useful.
52
+ */
53
+ export declare function invalidPubkey(pubkey: string | undefined): Refusal | null;
54
+ export declare function registerContactHandlers(deps: ContactHandlerDeps): void;
55
+ export {};
56
+ //# sourceMappingURL=contact-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contact-handlers.d.ts","sourceRoot":"","sources":["../src/contact-handlers.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAUzC,gFAAgF;AAChF,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,kBAAkB,EAAE,kBAAkB,CAAC;IACvC;;;;OAIG;IACH,YAAY,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,CAAC;IAC9D,qFAAqF;IACrF,mBAAmB,EAAE,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACjG;;;;;;;;;OASG;IACH,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC;IACxE,MAAM,EAAE,MAAM,CAAC;IACf,qFAAqF;IACrF,+BAA+B,EAAE,MAAM,IAAI,CAAC;CAC7C;AAED,KAAK,OAAO,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,IAAI,CAQxE;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAsQtE"}
@@ -0,0 +1,303 @@
1
+ /**
2
+ * The address book: the contact / tier / moniker / settings / telegram-token IPC handlers.
3
+ *
4
+ * These ten handlers lived inside startDaemon's body, where they reached the daemon's state by
5
+ * closing over it. Here they must NAME what they need — that is the whole point of the move, and
6
+ * the list turns out to be short: the session store, the per-connection agent selection, a logger,
7
+ * and one callback to restart the Telegram poller. Nothing about sessions, seals, transport or
8
+ * ceremonies. The address book never needed any of it; you just couldn't tell from inside the
9
+ * closure.
10
+ *
11
+ * Behavior is preserved exactly. The only type that changed is `connState`, widened to include
12
+ * `clearedAgent` — it was always there at runtime (TS types are erased, and resolveCurrentAgent
13
+ * reads it), so the old narrower type was a fiction, not a constraint.
14
+ */
15
+ import { MONIKER_RE, validateMoniker } from "@cello-protocol/protocol-types";
16
+ import { whoLabel } from "./who-label.js";
17
+ import { isKnownTierValue, TIER } from "./contacts-tier-migration.js";
18
+ import { isValidSettingKey, allSettingKeys, validateSettingValue, AWAY_MESSAGE_MAX_LEN, } from "./agent-settings-keys.js";
19
+ /**
20
+ * Review finding 7 — a contact pubkey must LOOK like a pubkey, or the row can never work.
21
+ *
22
+ * The address-book handlers took `params.pubkey` as any string and stored it. So
23
+ * `cello contact tier add` — a plausible slip under the `contact <pubkey> <op>` shape, where the
24
+ * FIRST positional is the pubkey — persisted a contact whose pubkey is the literal text "tier",
25
+ * and answered ok:true. Nothing would ever match it: it is not a key, so it can never be a
26
+ * counterparty. The operator is told they added someone; they added a typo.
27
+ *
28
+ * A key is 32 bytes, hex: 64 characters. Anything else is refused, loudly, with the value echoed
29
+ * so the slip is obvious. Returns null when the pubkey is absent — the caller's own missing_params
30
+ * check owns that case and says something more useful.
31
+ */
32
+ export function invalidPubkey(pubkey) {
33
+ if (pubkey === undefined)
34
+ return null; // absent → the caller's missing_params check owns it
35
+ if (/^[0-9a-fA-F]{64}$/.test(pubkey))
36
+ return null;
37
+ return {
38
+ ok: false,
39
+ reason: "invalid_pubkey",
40
+ guidance: `'${pubkey}' is not a public key. A CELLO public key is 64 hex characters (32 bytes). Nothing was changed — storing it would create an address-book entry that can never match anyone. Note the argument order is 'cello contact <pubkey> <operation>'.`,
41
+ };
42
+ }
43
+ export function registerContactHandlers(deps) {
44
+ const { handlers, sessionNodeManager, getConnState, resolveCurrentAgent, setAgentMoniker, logger, startTelegramPollerIfConfigured, } = deps;
45
+ // M8C-CONTACT-1: every address-book handler resolves the target agent the SAME way — an explicit
46
+ // params.agent, else this connection's current/sole-online agent (F18) — so a CLI or AI operator
47
+ // gets the same no_current_agent guidance INBOX already uses.
48
+ function resolveContactAgent(connState, params) {
49
+ const explicit = typeof params?.agent === "string" ? params.agent : undefined;
50
+ if (explicit)
51
+ return { ok: true, agent: explicit };
52
+ const current = resolveCurrentAgent(connState);
53
+ if (!current) {
54
+ return {
55
+ ok: false,
56
+ reason: "no_current_agent",
57
+ guidance: "No current agent for this connection. Pass --agent <name>, or call cello_use_agent to select one first.",
58
+ };
59
+ }
60
+ return { ok: true, agent: current };
61
+ }
62
+ handlers.set("cello_contact_add", async (params, connectionId) => {
63
+ const pubkey = typeof params?.pubkey === "string" ? params.pubkey : undefined;
64
+ const badPubkey = invalidPubkey(pubkey);
65
+ if (badPubkey)
66
+ return badPubkey;
67
+ if (!pubkey) {
68
+ return { ok: false, reason: "missing_params", guidance: "Provide 'pubkey' (hex) — the contact to add." };
69
+ }
70
+ const resolved = resolveContactAgent(getConnState(connectionId), params);
71
+ if (!resolved.ok)
72
+ return resolved;
73
+ // MONIKER-3 AC3: optional pet name. Invalid → reject the request WHOLE (no contact row
74
+ // either) — a half-applied add would store trust without the name the operator asked for.
75
+ let moniker;
76
+ if (params && "moniker" in params && params.moniker !== undefined && params.moniker !== null) {
77
+ moniker = validateMoniker(params.moniker);
78
+ if (moniker === null) {
79
+ return {
80
+ ok: false,
81
+ reason: "invalid_moniker",
82
+ guidance: `A moniker is 1-64 chars: letters, digits, '-' or '_' (regex ${MONIKER_RE.source}).`,
83
+ };
84
+ }
85
+ }
86
+ // DOD-TIER-4 / DEC-AB-1: an explicit cello_contact_add is a deliberate operator vouch → KNOWN
87
+ // (still not auto-accept; that is a separate cello_contact_set_tier to whitelisted). provenance
88
+ // stays null — this relationship formed by neither initiating nor accepting a session (AC5).
89
+ sessionNodeManager.addContact(resolved.agent, pubkey, moniker, null, TIER.KNOWN);
90
+ logger.info("contact.added", { agent: resolved.agent, pubkey });
91
+ if (moniker !== undefined) {
92
+ logger.info("contact.moniker.set", { agentName: resolved.agent, pubkey });
93
+ }
94
+ // Review F3: echo the moniker ONLY when one rode this request — a re-add without a moniker
95
+ // must not report null while an earlier pet name is still stored.
96
+ return moniker !== undefined
97
+ ? { ok: true, agent: resolved.agent, pubkey, moniker }
98
+ : { ok: true, agent: resolved.agent, pubkey };
99
+ });
100
+ // MONIKER-3 AC3: rename (string) or clear (null) an existing contact's pet name. Absence of the
101
+ // key is NOT a clear (Entry-66-F3): a request that omits it is malformed and rejected.
102
+ handlers.set("cello_contact_set_moniker", async (params, connectionId) => {
103
+ const pubkey = typeof params?.pubkey === "string" ? params.pubkey : undefined;
104
+ const badPubkey = invalidPubkey(pubkey);
105
+ if (badPubkey)
106
+ return badPubkey;
107
+ if (!pubkey || !params || !("moniker" in params)) {
108
+ return { ok: false, reason: "missing_params", guidance: "Provide 'pubkey' (hex) and 'moniker' — a string to set the pet name, or null to clear it." };
109
+ }
110
+ const resolved = resolveContactAgent(getConnState(connectionId), params);
111
+ if (!resolved.ok)
112
+ return resolved;
113
+ const raw = params.moniker ?? null;
114
+ const moniker = raw === null ? null : validateMoniker(raw);
115
+ if (raw !== null && moniker === null) {
116
+ return {
117
+ ok: false,
118
+ reason: "invalid_moniker",
119
+ guidance: `A moniker is 1-64 chars: letters, digits, '-' or '_' (regex ${MONIKER_RE.source}). Pass null to clear.`,
120
+ };
121
+ }
122
+ if (!sessionNodeManager.setContactMoniker(resolved.agent, pubkey, moniker)) {
123
+ return { ok: false, reason: "contact_not_found", guidance: `No contact ${pubkey.slice(0, 16)}… for agent '${resolved.agent}'. Add it first with cello_contact_add.` };
124
+ }
125
+ logger.info("contact.moniker.set", { agentName: resolved.agent, pubkey, cleared: moniker === null });
126
+ return { ok: true, agent: resolved.agent, pubkey, moniker };
127
+ });
128
+ // DOD-CONTACT-VIEW-1 AC1: set a contact's reachability tier. Validates the tier is a known constant
129
+ // (0..4) — an unknown value is REFUSED, never coerced. Emits contact.tier.changed (old→new).
130
+ handlers.set("cello_contact_set_tier", async (params, connectionId) => {
131
+ const pubkey = typeof params?.pubkey === "string" ? params.pubkey : undefined;
132
+ const badPubkey = invalidPubkey(pubkey);
133
+ if (badPubkey)
134
+ return badPubkey;
135
+ const tier = typeof params?.tier === "number" ? params.tier : undefined;
136
+ if (!pubkey || tier === undefined) {
137
+ return { ok: false, reason: "missing_params", guidance: "Provide 'pubkey' (hex) and 'tier' (0=blocked, 1=unknown, 2=known, 3=whitelisted, 4=vip)." };
138
+ }
139
+ if (!isKnownTierValue(tier)) {
140
+ return { ok: false, reason: "invalid_tier", guidance: "tier must be one of 0 (blocked), 1 (unknown), 2 (known), 3 (whitelisted), 4 (vip)." };
141
+ }
142
+ const resolved = resolveContactAgent(getConnState(connectionId), params);
143
+ if (!resolved.ok)
144
+ return resolved;
145
+ const oldTier = sessionNodeManager.getTier(resolved.agent, pubkey);
146
+ if (!sessionNodeManager.setContactTier(resolved.agent, pubkey, tier)) {
147
+ return { ok: false, reason: "contact_not_found", guidance: `No contact ${pubkey.slice(0, 16)}… for agent '${resolved.agent}'. Add it first with cello_contact_add.` };
148
+ }
149
+ // Only an actual change is an audit event — a no-op re-set must not pollute the trail (review F4).
150
+ if (oldTier !== tier) {
151
+ logger.info("contact.tier.changed", { agentName: resolved.agent, pubkey, oldTier, newTier: tier });
152
+ }
153
+ return { ok: true, agent: resolved.agent, pubkey, tier };
154
+ });
155
+ // DOD-AWAY-TIER-1 AC2: set (or clear, with null) a contact's per-contact away message — the most
156
+ // specific level of the away-text resolution. Validated as a string-or-null; the text is screened
157
+ // on the outbound path at send time (SI), never here.
158
+ handlers.set("cello_contact_set_away", async (params, connectionId) => {
159
+ const pubkey = typeof params?.pubkey === "string" ? params.pubkey : undefined;
160
+ const badPubkey = invalidPubkey(pubkey);
161
+ if (badPubkey)
162
+ return badPubkey;
163
+ if (!pubkey || !params || !("message" in params)) {
164
+ return { ok: false, reason: "missing_params", guidance: "Provide 'pubkey' (hex) and 'message' — a string away text, or null to clear it." };
165
+ }
166
+ const rawMessage = params.message === null ? null : typeof params.message === "string" ? params.message : undefined;
167
+ if (rawMessage === undefined) {
168
+ return { ok: false, reason: "invalid_message", guidance: "'message' must be a string (the away text) or null (to clear)." };
169
+ }
170
+ // Review F2/F3: an empty / whitespace-only message CLEARS (consistent with the CLI + null), never
171
+ // stores a blank away reply; a valid message is length-bounded.
172
+ const message = rawMessage !== null && rawMessage.trim().length === 0 ? null : rawMessage;
173
+ if (message !== null && message.length > AWAY_MESSAGE_MAX_LEN) {
174
+ return { ok: false, reason: "invalid_message", guidance: `The away message must be <= ${AWAY_MESSAGE_MAX_LEN} characters.` };
175
+ }
176
+ const resolved = resolveContactAgent(getConnState(connectionId), params);
177
+ if (!resolved.ok)
178
+ return resolved;
179
+ if (!sessionNodeManager.setContactAwayMessage(resolved.agent, pubkey, message)) {
180
+ return { ok: false, reason: "contact_not_found", guidance: `No contact ${pubkey.slice(0, 16)}… for agent '${resolved.agent}'. Add it first with cello_contact_add.` };
181
+ }
182
+ logger.info("contact.away.set", { agentName: resolved.agent, pubkey, cleared: message === null });
183
+ return { ok: true, agent: resolved.agent, pubkey };
184
+ });
185
+ handlers.set("cello_contact_remove", async (params, connectionId) => {
186
+ // Deliberately NOT shape-gated. `remove` is the ESCAPE HATCH, and gating it would trap the very
187
+ // rows the gate exists to prevent: a junk contact written by the older, unvalidated code (pubkey
188
+ // = the literal text "tier") could never be deleted, because deleting it requires naming it.
189
+ // Validation belongs on the paths that CREATE or MUTATE a row, never on the one that removes it.
190
+ // Removing a key that was never stored is a harmless not_found.
191
+ const pubkey = typeof params?.pubkey === "string" ? params.pubkey : undefined;
192
+ if (!pubkey) {
193
+ return { ok: false, reason: "missing_params", guidance: "Provide 'pubkey' (hex) — the contact to remove." };
194
+ }
195
+ const resolved = resolveContactAgent(getConnState(connectionId), params);
196
+ if (!resolved.ok)
197
+ return resolved;
198
+ const removed = sessionNodeManager.removeContact(resolved.agent, pubkey);
199
+ logger.info("contact.removed", { agent: resolved.agent, pubkey, removed });
200
+ return { ok: true, agent: resolved.agent, pubkey, removed };
201
+ });
202
+ handlers.set("cello_contact_list", async (params, connectionId) => {
203
+ const resolved = resolveContactAgent(getConnState(connectionId), params);
204
+ if (!resolved.ok)
205
+ return resolved;
206
+ // MONIKER-5 AC1: each row shows the resolved who (a contact has no session, so the offered
207
+ // tier doesn't apply — pet name ?? fingerprint).
208
+ const contacts = sessionNodeManager.listContacts(resolved.agent).map((c) => ({
209
+ ...c,
210
+ ...whoLabel({ localMoniker: c.moniker, offeredMoniker: null, pubkeyHex: c.pubkey }),
211
+ }));
212
+ return { ok: true, agent: resolved.agent, contacts };
213
+ });
214
+ // DOD-SETTINGS-1 AC2: read a per-agent reachability-policy setting (or all set ones). An unset key
215
+ // returns value:null — the CONSUMER applies the hardcoded default (the daemon runs on defaults alone).
216
+ handlers.set("cello_settings_get", async (params, connectionId) => {
217
+ const resolved = resolveContactAgent(getConnState(connectionId), params);
218
+ if (!resolved.ok)
219
+ return resolved;
220
+ // A key was PROVIDED (present and non-null) → it must be a valid string key. Distinguish "key
221
+ // absent" (list all) from "key present but malformed/unknown" (review F1/F3) — a typo'd read must
222
+ // NOT masquerade as "unset", the exact invisibility this store exists to prevent.
223
+ if (params && "key" in params && params.key !== undefined && params.key !== null) {
224
+ if (typeof params.key !== "string") {
225
+ return { ok: false, reason: "missing_params", guidance: "'key' must be a string setting key, or omit it to list every set value." };
226
+ }
227
+ if (!isValidSettingKey(params.key)) {
228
+ return { ok: false, reason: "invalid_key", guidance: `Unknown setting key '${params.key}'. Valid keys: ${allSettingKeys().join(", ")}` };
229
+ }
230
+ return { ok: true, agent: resolved.agent, key: params.key, value: sessionNodeManager.getSetting(resolved.agent, params.key) };
231
+ }
232
+ return { ok: true, agent: resolved.agent, settings: sessionNodeManager.getAllSettings(resolved.agent) };
233
+ });
234
+ // DOD-SETTINGS-1 AC2: write a per-agent setting. The KEY is validated against the known namespace —
235
+ // an unknown key is REFUSED (a typo'd key that persisted would be a setting that never takes effect,
236
+ // invisible to the operator). Per-key VALUE validation (finite bounds, etc.) lives with the consumer.
237
+ handlers.set("cello_settings_set", async (params, connectionId) => {
238
+ const key = typeof params?.key === "string" ? params.key : undefined;
239
+ const rawValue = params?.value;
240
+ const value = typeof rawValue === "string" ? rawValue : typeof rawValue === "number" ? String(rawValue) : undefined;
241
+ if (!key || value === undefined) {
242
+ return { ok: false, reason: "missing_params", guidance: `Provide 'key' and 'value' (string or number). Valid keys: ${allSettingKeys().join(", ")}` };
243
+ }
244
+ if (!isValidSettingKey(key)) {
245
+ return { ok: false, reason: "invalid_key", guidance: `Unknown setting key '${key}'. Valid keys: ${allSettingKeys().join(", ")}` };
246
+ }
247
+ // DOD-TIER-BOUNDS-SETTINGS AC2: a bound value must be a finite positive integer (INV-TIER-BOUND —
248
+ // a setting cannot REMOVE a bound). Away-text values are free-form.
249
+ const valueCheck = validateSettingValue(key, value);
250
+ if (!valueCheck.ok) {
251
+ return { ok: false, reason: "invalid_value", guidance: valueCheck.reason };
252
+ }
253
+ const resolved = resolveContactAgent(getConnState(connectionId), params);
254
+ if (!resolved.ok)
255
+ return resolved;
256
+ sessionNodeManager.setSetting(resolved.agent, key, value);
257
+ logger.info("setting.changed", { agentName: resolved.agent, key });
258
+ return { ok: true, agent: resolved.agent, key, value };
259
+ });
260
+ // MONIKER-1 AC2/AC3: cello_set_moniker — set (or clear, via explicit null) an agent's outbound-name
261
+ // override on the agents table. Validated at set-time with the shared MONIKER-0 rule; an invalid
262
+ // value is rejected here AND at the store (backstop) — it can never be stored. Local-only: the
263
+ // name is never sent to the directory (AC4).
264
+ handlers.set("cello_set_moniker", async (params, connectionId) => {
265
+ const resolved = resolveContactAgent(getConnState(connectionId), params);
266
+ if (!resolved.ok)
267
+ return resolved;
268
+ // Absence is NOT a clear (review Finding 3): JSON preserves explicit null, so a request
269
+ // that omits the key is malformed — rejecting it keeps a dropped field from silently
270
+ // deleting a stored override while reporting success.
271
+ if (!params || !("moniker" in params)) {
272
+ return { ok: false, reason: "missing_params", guidance: "Provide 'moniker' — a string to set the outbound name, or null to clear the override." };
273
+ }
274
+ const raw = params.moniker ?? null;
275
+ const moniker = raw === null ? null : validateMoniker(raw);
276
+ if (raw !== null && moniker === null) {
277
+ return {
278
+ ok: false,
279
+ reason: "invalid_moniker",
280
+ guidance: `A moniker is 1-64 chars: letters, digits, '-' or '_' (regex ${MONIKER_RE.source}). Pass null to clear the override.`,
281
+ };
282
+ }
283
+ if (!setAgentMoniker(resolved.agent, moniker)) {
284
+ return { ok: false, reason: "agent_not_found", guidance: `No active agent named '${resolved.agent}'. See cello_agents.` };
285
+ }
286
+ logger.info("agent.moniker.set", { agentName: resolved.agent, cleared: moniker === null });
287
+ return { ok: true, agent: resolved.agent, moniker };
288
+ });
289
+ // M8C-TGDOOR-1: cello_telegram_set_token — persist the daemon-wide bot token + allowlisted
290
+ // operator chat ID, then start the poller immediately (no restart needed).
291
+ handlers.set("cello_telegram_set_token", async (params, _connectionId) => {
292
+ const botToken = typeof params?.bot_token === "string" ? params.bot_token : undefined;
293
+ const chatId = typeof params?.allowlisted_chat_id === "string" ? params.allowlisted_chat_id : undefined;
294
+ if (!botToken || !chatId) {
295
+ return { ok: false, reason: "missing_params", guidance: "Provide 'bot_token' and 'allowlisted_chat_id'." };
296
+ }
297
+ sessionNodeManager.setTelegramSettings(botToken, chatId);
298
+ startTelegramPollerIfConfigured(); // always bumps the generation — restarts even if already running
299
+ logger.info("telegram.settings.updated", {});
300
+ return { ok: true };
301
+ });
302
+ }
303
+ //# sourceMappingURL=contact-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contact-handlers.js","sourceRoot":"","sources":["../src/contact-handlers.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"content-park-client.d.ts","sourceRoot":"","sources":["../src/content-park-client.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAkBzC,gDAAgD;AAChD,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB;IACvC,sFAAsF;IACtF,WAAW,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,iBAAiB;;gBAKhB,IAAI,EAAE,wBAAwB;IAM1C;;;;OAIG;IACG,OAAO,CACX,IAAI,EAAE,SAAS,EACf,IAAI,EAAE;QAAE,eAAe,EAAE,UAAU,CAAC;QAAC,WAAW,EAAE,UAAU,CAAC;QAAC,SAAS,EAAE,UAAU,CAAC;QAAC,UAAU,EAAE,UAAU,CAAA;KAAE,GAC5G,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA+B5C;;;;OAIG;IACG,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAoDrG;;;;;;OAMG;IACG,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;CAwD5H"}
1
+ {"version":3,"file":"content-park-client.d.ts","sourceRoot":"","sources":["../src/content-park-client.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAiBzC,gDAAgD;AAChD,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB;IACvC,sFAAsF;IACtF,WAAW,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,iBAAiB;;gBAKhB,IAAI,EAAE,wBAAwB;IAM1C;;;;OAIG;IACG,OAAO,CACX,IAAI,EAAE,SAAS,EACf,IAAI,EAAE;QAAE,eAAe,EAAE,UAAU,CAAC;QAAC,WAAW,EAAE,UAAU,CAAC;QAAC,SAAS,EAAE,UAAU,CAAC;QAAC,UAAU,EAAE,UAAU,CAAA;KAAE,GAC5G,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA+B5C;;;;OAIG;IACG,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAoDrG;;;;;;OAMG;IACG,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;CAwD5H"}