@moxxy/plugin-channel-signal 0.27.0

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 (69) hide show
  1. package/LICENSE +21 -0
  2. package/dist/channel/chunker.d.ts +69 -0
  3. package/dist/channel/chunker.d.ts.map +1 -0
  4. package/dist/channel/chunker.js +133 -0
  5. package/dist/channel/chunker.js.map +1 -0
  6. package/dist/channel/turn-runner.d.ts +33 -0
  7. package/dist/channel/turn-runner.d.ts.map +1 -0
  8. package/dist/channel/turn-runner.js +70 -0
  9. package/dist/channel/turn-runner.js.map +1 -0
  10. package/dist/channel/voice.d.ts +37 -0
  11. package/dist/channel/voice.d.ts.map +1 -0
  12. package/dist/channel/voice.js +88 -0
  13. package/dist/channel/voice.js.map +1 -0
  14. package/dist/channel.d.ts +154 -0
  15. package/dist/channel.d.ts.map +1 -0
  16. package/dist/channel.js +468 -0
  17. package/dist/channel.js.map +1 -0
  18. package/dist/index.d.ts +28 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +215 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/jsonrpc.d.ts +53 -0
  23. package/dist/jsonrpc.d.ts.map +1 -0
  24. package/dist/jsonrpc.js +167 -0
  25. package/dist/jsonrpc.js.map +1 -0
  26. package/dist/keys.d.ts +37 -0
  27. package/dist/keys.d.ts.map +1 -0
  28. package/dist/keys.js +55 -0
  29. package/dist/keys.js.map +1 -0
  30. package/dist/pair-flow.d.ts +21 -0
  31. package/dist/pair-flow.d.ts.map +1 -0
  32. package/dist/pair-flow.js +136 -0
  33. package/dist/pair-flow.js.map +1 -0
  34. package/dist/permission.d.ts +21 -0
  35. package/dist/permission.d.ts.map +1 -0
  36. package/dist/permission.js +27 -0
  37. package/dist/permission.js.map +1 -0
  38. package/dist/schema.d.ts +4295 -0
  39. package/dist/schema.d.ts.map +1 -0
  40. package/dist/schema.js +84 -0
  41. package/dist/schema.js.map +1 -0
  42. package/dist/setup-wizard.d.ts +14 -0
  43. package/dist/setup-wizard.d.ts.map +1 -0
  44. package/dist/setup-wizard.js +85 -0
  45. package/dist/setup-wizard.js.map +1 -0
  46. package/dist/sidecar.d.ts +137 -0
  47. package/dist/sidecar.d.ts.map +1 -0
  48. package/dist/sidecar.js +421 -0
  49. package/dist/sidecar.js.map +1 -0
  50. package/package.json +89 -0
  51. package/src/channel/chunker.test.ts +135 -0
  52. package/src/channel/chunker.ts +147 -0
  53. package/src/channel/turn-runner.ts +97 -0
  54. package/src/channel/voice.test.ts +136 -0
  55. package/src/channel/voice.ts +118 -0
  56. package/src/channel.test.ts +364 -0
  57. package/src/channel.ts +607 -0
  58. package/src/index.ts +289 -0
  59. package/src/jsonrpc.test.ts +128 -0
  60. package/src/jsonrpc.ts +198 -0
  61. package/src/keys.test.ts +45 -0
  62. package/src/keys.ts +56 -0
  63. package/src/pair-flow.ts +161 -0
  64. package/src/permission.ts +36 -0
  65. package/src/schema.ts +98 -0
  66. package/src/setup-wizard.ts +98 -0
  67. package/src/sidecar.test.ts +276 -0
  68. package/src/sidecar.ts +511 -0
  69. package/src/subcommands.test.ts +206 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,468 @@
1
+ import { newTurnId } from '@moxxy/core';
2
+ import { TurnCoordinator, resolveSecret } from '@moxxy/channel-kit';
3
+ import { SIGNAL_ACCOUNT_ENV, SIGNAL_ACCOUNT_KEY, SIGNAL_ALLOWED_SENDERS_KEY, normalizeSender, parseAllowedSenders, } from './keys.js';
4
+ import { receiveParamsSchema, } from './schema.js';
5
+ import { SIGNAL_CLI_INSTALL_HINT, SignalSidecar, findSignalCliOnPath, listSignalAccounts, signalCliAttachmentsDir, startLinkProcess, } from './sidecar.js';
6
+ import { buildSignalPermissionResolver } from './permission.js';
7
+ import { runSignalTurn } from './channel/turn-runner.js';
8
+ import { splitForSignal } from './channel/chunker.js';
9
+ import { pickAudioAttachment, transcribeVoiceAttachment } from './channel/voice.js';
10
+ /** Device name shown in the phone's "Linked Devices" list. */
11
+ const LINK_DEVICE_NAME = 'moxxy';
12
+ /** Bound on remembered own-send timestamps for the sync-echo drop. */
13
+ const MAX_SENT_TIMESTAMPS = 256;
14
+ /** Rate limit for "dropped invalid/unauthorized envelope" warnings. */
15
+ const DROP_WARN_INTERVAL_MS = 5_000;
16
+ export class SignalChannel {
17
+ name = 'signal';
18
+ /**
19
+ * Installed on the session by the CLI dispatcher. Replaced in `start()` once
20
+ * the live tool registry is available for `['*']` expansion; until then it
21
+ * denies everything (safe default before start).
22
+ */
23
+ permissionResolver;
24
+ opts;
25
+ session = null;
26
+ model;
27
+ account = null;
28
+ allowedSenders = new Set();
29
+ sidecar = null;
30
+ rpc = null;
31
+ link = null;
32
+ handle = null;
33
+ runningSettled = false;
34
+ resolveRunning = null;
35
+ rejectRunning = null;
36
+ stopping = false;
37
+ // Single-flight turn state + the bounded own-turn-id set the foreign-turn
38
+ // mirror gate filters on (invariant #8).
39
+ turns = new TurnCoordinator();
40
+ lastTarget = null;
41
+ logUnsub = null;
42
+ /**
43
+ * Timestamps of messages WE sent through the daemon (signal-cli's `send`
44
+ * result). A linked device sees the account's sends come back as
45
+ * `syncMessage.sentMessage` envelopes — including its own — so any sync'd
46
+ * sent-message whose timestamp is in this set is an echo of ourselves and
47
+ * must be dropped (loop protection).
48
+ */
49
+ sentTimestamps = new Set();
50
+ // Link-window connect state, published via requestUrl/connected + the
51
+ // dedicated-runner status file (the desktop panel renders the QR from it).
52
+ linkUri = null;
53
+ linked = false;
54
+ connectListeners = new Set();
55
+ linkedListeners = new Set();
56
+ lastDropWarnAt = 0;
57
+ constructor(opts) {
58
+ this.opts = opts;
59
+ // Pre-start: deny-all (replaced with the real allow-list resolver in start()).
60
+ this.permissionResolver = buildSignalPermissionResolver({
61
+ allowedTools: [],
62
+ allToolNames: [],
63
+ ...(opts.logger ? { logger: opts.logger } : {}),
64
+ });
65
+ }
66
+ /** The `sgnl://linkdevice…` URI while a linking window is open; null otherwise. */
67
+ get requestUrl() {
68
+ return this.linkUri;
69
+ }
70
+ /** Whether the account is linked (the "connect the other side" step). */
71
+ get connected() {
72
+ return this.linked;
73
+ }
74
+ /** Fires when linking completes (the pair flow prints success off this). */
75
+ onLinked(listener) {
76
+ this.linkedListeners.add(listener);
77
+ return () => this.linkedListeners.delete(listener);
78
+ }
79
+ async start(startOpts) {
80
+ if (this.handle)
81
+ return this.handle;
82
+ this.session = startOpts.session;
83
+ this.model = startOpts.model;
84
+ const findBinary = this.opts.findBinaryFn ?? (() => findSignalCliOnPath());
85
+ const binary = this.opts.binary ?? findBinary();
86
+ if (!binary)
87
+ throw new Error(SIGNAL_CLI_INSTALL_HINT);
88
+ // Account: explicit option → env → vault (shared channel-kit precedence).
89
+ this.account =
90
+ this.opts.account ??
91
+ (await resolveSecret(this.opts.vault, {
92
+ envVar: SIGNAL_ACCOUNT_ENV,
93
+ vaultKey: SIGNAL_ACCOUNT_KEY,
94
+ }));
95
+ // Sender allow-list: vault + option extras. The owner's own Note-to-Self is
96
+ // allowed implicitly (see handleSyncSent) and needs no entry.
97
+ this.allowedSenders = new Set([
98
+ ...parseAllowedSenders(await this.opts.vault.get(SIGNAL_ALLOWED_SENDERS_KEY)),
99
+ ...(this.opts.allowedSenders ?? []).map(normalizeSender),
100
+ ].filter(Boolean));
101
+ // Linked yet? (One-shot `listAccounts` spawn — NOT in isAvailable, JVM
102
+ // spawns are too slow for discovery.) A probe failure is treated as
103
+ // "assume linked" when an account is configured: the daemon boot below
104
+ // surfaces the real error with signal-cli's own stderr, which beats
105
+ // guessing wrong and opening a spurious link window.
106
+ let isLinked = false;
107
+ if (this.account) {
108
+ try {
109
+ const listAccounts = this.opts.listAccountsFn ?? ((o) => listSignalAccounts(o));
110
+ const accounts = await listAccounts({ binary });
111
+ isLinked = accounts.includes(this.account);
112
+ }
113
+ catch (err) {
114
+ this.opts.logger?.warn?.('signal: listAccounts probe failed; assuming linked', {
115
+ err: err instanceof Error ? err.message : String(err),
116
+ });
117
+ isLinked = true;
118
+ }
119
+ }
120
+ // Swap in the real autonomous allow-list resolver now that the tool
121
+ // registry is live (mirrors the Slack channel; `['*']` expands here).
122
+ const allowedTools = startOpts.allowedTools ?? this.opts.allowedTools ?? [];
123
+ const allToolNames = this.session.tools.list().map((t) => t.name);
124
+ this.permissionResolver = buildSignalPermissionResolver({
125
+ allowedTools,
126
+ allToolNames,
127
+ ...(this.opts.logger ? { logger: this.opts.logger } : {}),
128
+ });
129
+ this.session.setPermissionResolver(this.permissionResolver);
130
+ // Mirror-to-last-target: post assistant prose for turns this channel did
131
+ // NOT initiate (a co-attached surface ran one) into the last thread served.
132
+ this.logUnsub = this.session.log.subscribe((event) => this.mirrorForeignTurn(event));
133
+ const running = new Promise((resolve, reject) => {
134
+ this.resolveRunning = resolve;
135
+ this.rejectRunning = reject;
136
+ });
137
+ const dedicated = startOpts.dedicated === true || process.env.MOXXY_DEDICATED_RUNNER === '1';
138
+ if (isLinked) {
139
+ this.linked = true;
140
+ await this.bootDaemon(binary, this.account);
141
+ }
142
+ else if (startOpts.pair || dedicated) {
143
+ await this.openLinkWindow(binary);
144
+ }
145
+ else {
146
+ this.logUnsub?.();
147
+ this.logUnsub = null;
148
+ throw new Error('This machine is not linked to a Signal account yet. Run `moxxy channels signal pair` ' +
149
+ '(scan the QR with your phone: Signal → Settings → Linked Devices), or start it from the desktop Channels panel.');
150
+ }
151
+ this.handle = {
152
+ running,
153
+ onConnectChange: (listener) => {
154
+ this.connectListeners.add(listener);
155
+ return () => this.connectListeners.delete(listener);
156
+ },
157
+ stop: async (reason = 'shutdown') => {
158
+ this.stopping = true;
159
+ // Abort the in-flight turn FIRST so the model loop stops the moment the
160
+ // operator asks to shut down (shared/remote Session: spend continues
161
+ // otherwise and only its output is discarded).
162
+ this.turns.abort(reason);
163
+ this.link?.cancel();
164
+ this.link = null;
165
+ this.logUnsub?.();
166
+ this.logUnsub = null;
167
+ const sidecar = this.sidecar;
168
+ this.sidecar = null;
169
+ this.rpc = null;
170
+ if (sidecar)
171
+ await sidecar.stop();
172
+ this.settleRunning();
173
+ },
174
+ };
175
+ this.opts.logger?.info?.('signal: channel started', {
176
+ linked: this.linked,
177
+ account: this.account,
178
+ allowedSenders: this.allowedSenders.size,
179
+ });
180
+ return this.handle;
181
+ }
182
+ // -------------------------------------------------------------------------
183
+ // Linking (secondary-device pairing)
184
+ // -------------------------------------------------------------------------
185
+ async openLinkWindow(binary) {
186
+ const makeLink = this.opts.linkFactory ??
187
+ ((o) => startLinkProcess({
188
+ deviceName: o.deviceName,
189
+ binary: o.binary,
190
+ ...(this.opts.spawnFn ? { spawnFn: this.opts.spawnFn } : {}),
191
+ ...(this.opts.logger ? { logger: this.opts.logger } : {}),
192
+ }));
193
+ const link = makeLink({ deviceName: LINK_DEVICE_NAME, binary });
194
+ this.link = link;
195
+ this.linkUri = await link.uri; // throws when signal-cli can't start linking
196
+ this.notifyConnectChange();
197
+ this.opts.logger?.info?.('signal: linking window open');
198
+ // Completion is async (the user scans on their phone). Boot the daemon the
199
+ // moment linking lands; a failure at any point is fatal for the handle so
200
+ // a supervisor restarts us (and the pair flow surfaces the error).
201
+ void link.completed
202
+ .then(async ({ account }) => {
203
+ if (this.stopping)
204
+ return;
205
+ const acct = account ?? this.account;
206
+ if (!acct) {
207
+ throw new Error('linking completed but signal-cli did not report the account number — ' +
208
+ `store it via \`moxxy channels signal setup\` (vault key ${SIGNAL_ACCOUNT_KEY}) and restart`);
209
+ }
210
+ this.account = acct;
211
+ await this.opts.vault.set(SIGNAL_ACCOUNT_KEY, acct, ['signal']);
212
+ this.link = null;
213
+ this.linkUri = null;
214
+ this.linked = true;
215
+ await this.bootDaemon(binary, acct);
216
+ this.notifyConnectChange();
217
+ for (const listener of this.linkedListeners) {
218
+ try {
219
+ listener(acct);
220
+ }
221
+ catch {
222
+ /* listener errors are not ours */
223
+ }
224
+ }
225
+ this.opts.logger?.info?.('signal: linked', { account: acct });
226
+ })
227
+ .catch((err) => {
228
+ if (this.stopping)
229
+ return;
230
+ this.fatal(new Error(`Signal linking failed: ${err instanceof Error ? err.message : String(err)}`));
231
+ });
232
+ }
233
+ // -------------------------------------------------------------------------
234
+ // Daemon + inbound envelopes
235
+ // -------------------------------------------------------------------------
236
+ async bootDaemon(binary, account) {
237
+ const makeSidecar = this.opts.sidecarFactory ??
238
+ ((o) => new SignalSidecar({
239
+ account: o.account,
240
+ binary: o.binary,
241
+ ...(this.opts.spawnFn ? { spawnFn: this.opts.spawnFn } : {}),
242
+ ...(this.opts.logger ? { logger: this.opts.logger } : {}),
243
+ }));
244
+ const sidecar = makeSidecar({ account, binary });
245
+ this.sidecar = sidecar;
246
+ const rpc = await sidecar.start();
247
+ this.rpc = rpc;
248
+ rpc.onNotification('receive', (params) => this.handleReceive(params));
249
+ // An unexpected daemon death is fatal: reject `running` so the process
250
+ // exits non-zero and a supervisor (desktop panel / systemd) restarts it.
251
+ sidecar.onExit((code) => {
252
+ if (this.stopping)
253
+ return;
254
+ this.fatal(new Error(`signal-cli daemon exited unexpectedly (code=${code ?? 'null'})`));
255
+ });
256
+ }
257
+ /** Every inbound notification funnels through here — zod-validate FIRST. */
258
+ handleReceive(params) {
259
+ const parsed = receiveParamsSchema.safeParse(params);
260
+ if (!parsed.success) {
261
+ this.warnDrop('invalid receive payload (schema mismatch)');
262
+ return;
263
+ }
264
+ const envelope = parsed.data.envelope;
265
+ if (envelope.dataMessage) {
266
+ this.handleDataMessage(envelope);
267
+ return;
268
+ }
269
+ const sent = envelope.syncMessage?.sentMessage;
270
+ if (sent) {
271
+ this.handleSyncSent(sent);
272
+ return;
273
+ }
274
+ // Typing / receipt / group-update envelopes: nothing to do.
275
+ }
276
+ /** A message from ANOTHER account — gate on the sender allow-list. */
277
+ handleDataMessage(envelope) {
278
+ const data = envelope.dataMessage;
279
+ const number = envelope.sourceNumber ?? null;
280
+ const uuid = envelope.sourceUuid ?? null;
281
+ const senderIds = [number, uuid, envelope.source ?? null]
282
+ .filter((x) => typeof x === 'string' && x.length > 0)
283
+ .map(normalizeSender);
284
+ if (senderIds.length === 0) {
285
+ this.warnDrop('data message without a sender identity');
286
+ return;
287
+ }
288
+ // v1: direct messages only. Group fan-in needs its own trust story.
289
+ if (data.groupInfo) {
290
+ this.opts.logger?.debug?.('signal: ignoring group message');
291
+ return;
292
+ }
293
+ // Our own account as a dataMessage source is an echo path (legit owner
294
+ // prompts arrive as syncMessage.sentMessage) — never respond to ourselves.
295
+ if (this.account && senderIds.includes(normalizeSender(this.account))) {
296
+ this.opts.logger?.debug?.('signal: ignoring data message from own account');
297
+ return;
298
+ }
299
+ // THE allow-list gate: every session-reaching path passes through here or
300
+ // through handleSyncSent's owner check. Unknown senders are dropped
301
+ // silently (no reply) — answering would leak the bot's existence.
302
+ if (!senderIds.some((id) => this.allowedSenders.has(id))) {
303
+ this.warnDrop(`unauthorized sender (${senderIds[0] ?? 'unknown'})`);
304
+ return;
305
+ }
306
+ const target = { recipient: number ?? uuid ?? senderIds[0] };
307
+ this.dispatchInBackground(this.processMessage(target, data.message ?? null, data.attachments), 'data-message');
308
+ }
309
+ /**
310
+ * A sync'd copy of a message the ACCOUNT OWNER sent from another device.
311
+ * Two jobs: (1) drop echoes of OUR OWN sends (linked devices receive the
312
+ * account's sends back — loop protection), (2) accept the owner's
313
+ * Note-to-Self prompts, which are allowed by default after linking.
314
+ */
315
+ handleSyncSent(sent) {
316
+ if (typeof sent.timestamp === 'number' && this.sentTimestamps.has(sent.timestamp)) {
317
+ this.opts.logger?.debug?.('signal: dropping sync echo of own send');
318
+ return;
319
+ }
320
+ if (sent.groupInfo)
321
+ return;
322
+ // Only the owner's own Note-to-Self drives the session. Their outbound
323
+ // messages to OTHER people are private conversation traffic — never react.
324
+ const dest = sent.destinationNumber ?? sent.destination ?? null;
325
+ const isNoteToSelf = this.account != null && dest != null && dest === this.account;
326
+ if (!isNoteToSelf)
327
+ return;
328
+ this.dispatchInBackground(this.processMessage({ noteToSelf: true }, sent.message ?? null, sent.attachments), 'note-to-self');
329
+ }
330
+ /** Voice → transcript, busy gate, then one coordinated turn. */
331
+ async processMessage(target, text, attachments) {
332
+ if (!this.session)
333
+ return;
334
+ let prompt = text?.trim() ?? '';
335
+ if (!prompt) {
336
+ const audio = pickAudioAttachment(attachments);
337
+ if (!audio)
338
+ return; // stickers/images/reactions — nothing to run
339
+ const transcript = await transcribeVoiceAttachment({
340
+ session: this.session,
341
+ attachmentsDir: this.opts.attachmentsDir ?? signalCliAttachmentsDir(),
342
+ reply: (t) => this.sendText(target, t),
343
+ ...(this.opts.logger ? { logger: this.opts.logger } : {}),
344
+ }, audio);
345
+ if (!transcript)
346
+ return;
347
+ prompt = transcript;
348
+ }
349
+ // Atomic single-flight guard (the coordinator claims the slot BEFORE any
350
+ // await); the turnId minted here is recorded as an own-turn id — that's
351
+ // what mirrorForeignTurn filters on (invariant #8).
352
+ const lease = this.turns.begin(newTurnId());
353
+ if (!lease) {
354
+ await this.sendText(target, 'I am still working on the previous prompt. One moment…');
355
+ return;
356
+ }
357
+ this.lastTarget = target;
358
+ try {
359
+ await runSignalTurn({
360
+ session: this.session,
361
+ send: (t) => this.sendText(target, t),
362
+ sendTyping: (stop) => this.sendTyping(target, stop),
363
+ ...(this.opts.logger ? { logger: this.opts.logger } : {}),
364
+ }, {
365
+ text: prompt,
366
+ ...(this.model ? { model: this.model } : {}),
367
+ controller: lease.controller,
368
+ turnId: lease.turnId,
369
+ });
370
+ }
371
+ finally {
372
+ lease.end();
373
+ }
374
+ }
375
+ // -------------------------------------------------------------------------
376
+ // Outbound
377
+ // -------------------------------------------------------------------------
378
+ /** Send one message and record its timestamp for the sync-echo drop. */
379
+ async sendText(target, text) {
380
+ const rpc = this.rpc;
381
+ if (!rpc)
382
+ throw new Error('signal daemon is not running');
383
+ const params = 'noteToSelf' in target ? { noteToSelf: true, message: text } : { recipient: [target.recipient], message: text };
384
+ const result = (await rpc.request('send', params));
385
+ const ts = result && typeof result === 'object' ? result.timestamp : undefined;
386
+ if (typeof ts === 'number') {
387
+ this.sentTimestamps.add(ts);
388
+ if (this.sentTimestamps.size > MAX_SENT_TIMESTAMPS) {
389
+ const oldest = this.sentTimestamps.values().next().value;
390
+ if (oldest !== undefined)
391
+ this.sentTimestamps.delete(oldest);
392
+ }
393
+ }
394
+ }
395
+ async sendTyping(target, stop) {
396
+ const rpc = this.rpc;
397
+ if (!rpc)
398
+ return;
399
+ const recipient = 'noteToSelf' in target ? this.account : target.recipient;
400
+ if (!recipient)
401
+ return;
402
+ await rpc.request('sendTyping', { recipient: [recipient], ...(stop ? { stop: true } : {}) });
403
+ }
404
+ /**
405
+ * Post the assistant's prose for a turn this channel did not initiate.
406
+ * Skipped for our own turnIds (robust to async ordering / replay, invariant
407
+ * #8) and while a turn of ours is streaming via the chunked sender.
408
+ */
409
+ mirrorForeignTurn(event) {
410
+ const text = this.turns.mirrorText(event);
411
+ if (text == null)
412
+ return;
413
+ const target = this.lastTarget;
414
+ if (!target || !this.rpc)
415
+ return;
416
+ void (async () => {
417
+ for (const part of splitForSignal(text)) {
418
+ await this.sendText(target, part);
419
+ }
420
+ })().catch((err) => {
421
+ this.opts.logger?.warn?.('signal: mirror failed', { err: String(err) });
422
+ });
423
+ }
424
+ // -------------------------------------------------------------------------
425
+ // Plumbing
426
+ // -------------------------------------------------------------------------
427
+ /**
428
+ * Run a handler detached from the socket read loop (an envelope handler that
429
+ * awaited a whole turn would park notification delivery for its duration).
430
+ * Errors are logged here — nothing upstream awaits this promise.
431
+ */
432
+ dispatchInBackground(work, kind) {
433
+ void work.catch((err) => {
434
+ this.opts.logger?.warn?.('signal: handler failed', { kind, err: String(err) });
435
+ });
436
+ }
437
+ warnDrop(reason) {
438
+ const now = Date.now();
439
+ if (now - this.lastDropWarnAt < DROP_WARN_INTERVAL_MS)
440
+ return;
441
+ this.lastDropWarnAt = now;
442
+ this.opts.logger?.warn?.(`signal: dropped inbound envelope — ${reason}`);
443
+ }
444
+ notifyConnectChange() {
445
+ for (const listener of this.connectListeners) {
446
+ try {
447
+ listener();
448
+ }
449
+ catch (err) {
450
+ this.opts.logger?.warn?.('signal: connect-change listener threw', { err: String(err) });
451
+ }
452
+ }
453
+ }
454
+ settleRunning() {
455
+ if (this.runningSettled)
456
+ return;
457
+ this.runningSettled = true;
458
+ this.resolveRunning?.();
459
+ }
460
+ fatal(err) {
461
+ this.opts.logger?.error?.('signal: fatal channel error', { err: err.message });
462
+ if (this.runningSettled)
463
+ return;
464
+ this.runningSettled = true;
465
+ this.rejectRunning?.(err);
466
+ }
467
+ }
468
+ //# sourceMappingURL=channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type Plugin } from '@moxxy/sdk';
2
+ import type { VaultStore } from '@moxxy/plugin-vault';
3
+ export { SignalChannel, type SignalChannelOptions, type SignalStartOpts, type SendTarget, type SignalRpcLike, type SignalSidecarLike, } from './channel.js';
4
+ export { buildSignalPermissionResolver } from './permission.js';
5
+ export { SignalRpcClient, type RpcStream } from './jsonrpc.js';
6
+ export { SignalSidecar, startLinkProcess, listSignalAccounts, findSignalCliOnPath, signalCliDataDir, signalCliAttachmentsDir, SIGNAL_CLI_INSTALL_HINT, type LinkProcessHandle, type SpawnFn, type SpawnedProcess, } from './sidecar.js';
7
+ export { receiveParamsSchema, envelopeSchema, attachmentSchema, MAX_INBOUND_TEXT_CHARS, type SignalEnvelope, type SignalAttachment, } from './schema.js';
8
+ export { ChunkedSender, takeChunk, splitForSignal, SIGNAL_CHUNK_SOFT_LIMIT, SIGNAL_CHUNK_HARD_LIMIT, } from './channel/chunker.js';
9
+ export { SIGNAL_ACCOUNT_KEY, SIGNAL_ACCOUNT_ENV, SIGNAL_ALLOWED_SENDERS_KEY, parseAllowedSenders, normalizeSender, E164_RE, } from './keys.js';
10
+ export interface BuildSignalPluginOptions {
11
+ /** Host-injected encrypted secret store (available immediately). */
12
+ readonly vault: VaultStore;
13
+ }
14
+ /**
15
+ * Build the Signal channel plugin with a host-injected vault (mirrors the
16
+ * Telegram/Slack plugins' vault injection).
17
+ */
18
+ export declare function buildSignalPlugin(opts: BuildSignalPluginOptions): Plugin;
19
+ /**
20
+ * Discovery-loadable default export: resolves the vault from the inter-plugin
21
+ * service registry in `onInit` (the vault plugin publishes `'vault'`). Requires
22
+ * `@moxxy/plugin-vault` to load first (declared in `package.json`
23
+ * `moxxy.requirements`). The channel + subcommands read the vault via
24
+ * `getVault()`, so resolution is deferred to call time — after `onInit` wired it.
25
+ */
26
+ export declare const signalPlugin: Plugin;
27
+ export default signalPlugin;
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoD,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAiBtD,OAAO,EACL,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,iBAAiB,GACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,EACvB,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,KAAK,OAAO,EACZ,KAAK,cAAc,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,aAAa,EACb,SAAS,EACT,cAAc,EACd,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,0BAA0B,EAC1B,mBAAmB,EACnB,eAAe,EACf,OAAO,GACR,MAAM,WAAW,CAAC;AAEnB,MAAM,WAAW,wBAAwB;IACvC,oEAAoE;IACpE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,wBAAwB,GAAG,MAAM,CAExE;AAED;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,EAAE,MAgBvB,CAAC;AAEL,eAAe,YAAY,CAAC"}