cli-jaw 2.2.25 → 2.3.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 (159) hide show
  1. package/README.md +5 -2
  2. package/dist/bin/cli-jaw.js +6 -1
  3. package/dist/bin/cli-jaw.js.map +1 -1
  4. package/dist/bin/commands/doctor.js +39 -18
  5. package/dist/bin/commands/doctor.js.map +1 -1
  6. package/dist/bin/commands/init.js +82 -23
  7. package/dist/bin/commands/init.js.map +1 -1
  8. package/dist/bin/commands/messaging.js +262 -0
  9. package/dist/bin/commands/messaging.js.map +1 -0
  10. package/dist/server.js +30 -6
  11. package/dist/server.js.map +1 -1
  12. package/dist/src/cli/commands.js +6 -2
  13. package/dist/src/cli/commands.js.map +1 -1
  14. package/dist/src/cli/handlers/remote-session-commands.js +94 -0
  15. package/dist/src/cli/handlers/remote-session-commands.js.map +1 -0
  16. package/dist/src/command-contract/catalog.js +1 -1
  17. package/dist/src/command-contract/catalog.js.map +1 -1
  18. package/dist/src/core/chat-sessions.js +4 -0
  19. package/dist/src/core/chat-sessions.js.map +1 -1
  20. package/dist/src/core/config.js +63 -22
  21. package/dist/src/core/config.js.map +1 -1
  22. package/dist/src/core/db.js +6 -0
  23. package/dist/src/core/db.js.map +1 -1
  24. package/dist/src/core/dispatch-approval-ingress.js +45 -3
  25. package/dist/src/core/dispatch-approval-ingress.js.map +1 -1
  26. package/dist/src/core/dispatch-approval.js +46 -0
  27. package/dist/src/core/dispatch-approval.js.map +1 -1
  28. package/dist/src/core/logger.js +67 -0
  29. package/dist/src/core/logger.js.map +1 -1
  30. package/dist/src/core/session-generation.js +74 -0
  31. package/dist/src/core/session-generation.js.map +1 -0
  32. package/dist/src/discord/bot.js +91 -5
  33. package/dist/src/discord/bot.js.map +1 -1
  34. package/dist/src/discord/commands.js +34 -1
  35. package/dist/src/discord/commands.js.map +1 -1
  36. package/dist/src/discord/forwarder.js +4 -1
  37. package/dist/src/discord/forwarder.js.map +1 -1
  38. package/dist/src/discord/send-only-client.js +14 -7
  39. package/dist/src/discord/send-only-client.js.map +1 -1
  40. package/dist/src/messaging/access-policy.js +26 -0
  41. package/dist/src/messaging/access-policy.js.map +1 -0
  42. package/dist/src/messaging/approval-presentation.js +89 -0
  43. package/dist/src/messaging/approval-presentation.js.map +1 -0
  44. package/dist/src/messaging/channel-adapter.js +47 -0
  45. package/dist/src/messaging/channel-adapter.js.map +1 -0
  46. package/dist/src/messaging/channel-capabilities.js +47 -15
  47. package/dist/src/messaging/channel-capabilities.js.map +1 -1
  48. package/dist/src/messaging/channel-health.js +23 -3
  49. package/dist/src/messaging/channel-health.js.map +1 -1
  50. package/dist/src/messaging/delivery-outcome.js +12 -0
  51. package/dist/src/messaging/delivery-outcome.js.map +1 -1
  52. package/dist/src/messaging/durable-ingress.js +458 -0
  53. package/dist/src/messaging/durable-ingress.js.map +1 -0
  54. package/dist/src/messaging/effect-once.js +204 -0
  55. package/dist/src/messaging/effect-once.js.map +1 -0
  56. package/dist/src/messaging/inbound-envelope.js +168 -0
  57. package/dist/src/messaging/inbound-envelope.js.map +1 -0
  58. package/dist/src/messaging/ingress-audit.js +41 -0
  59. package/dist/src/messaging/ingress-audit.js.map +1 -0
  60. package/dist/src/messaging/ingress-generation.js +22 -0
  61. package/dist/src/messaging/ingress-generation.js.map +1 -0
  62. package/dist/src/messaging/metrics.js +69 -0
  63. package/dist/src/messaging/metrics.js.map +1 -0
  64. package/dist/src/messaging/outbound-outbox.js +184 -0
  65. package/dist/src/messaging/outbound-outbox.js.map +1 -0
  66. package/dist/src/messaging/remote-command-context.js +30 -0
  67. package/dist/src/messaging/remote-command-context.js.map +1 -0
  68. package/dist/src/messaging/retry.js +11 -2
  69. package/dist/src/messaging/retry.js.map +1 -1
  70. package/dist/src/messaging/runtime.js +129 -30
  71. package/dist/src/messaging/runtime.js.map +1 -1
  72. package/dist/src/messaging/send.js +31 -6
  73. package/dist/src/messaging/send.js.map +1 -1
  74. package/dist/src/messaging/trace-context.js +56 -0
  75. package/dist/src/messaging/trace-context.js.map +1 -0
  76. package/dist/src/messaging/types.js +39 -1
  77. package/dist/src/messaging/types.js.map +1 -1
  78. package/dist/src/routes/orchestrate.js +10 -3
  79. package/dist/src/routes/orchestrate.js.map +1 -1
  80. package/dist/src/routes/settings.js +26 -1
  81. package/dist/src/routes/settings.js.map +1 -1
  82. package/dist/src/slack/bot.js +182 -70
  83. package/dist/src/slack/bot.js.map +1 -1
  84. package/dist/src/slack/commands.js +16 -1
  85. package/dist/src/slack/commands.js.map +1 -1
  86. package/dist/src/slack/format.js +4 -1
  87. package/dist/src/slack/format.js.map +1 -1
  88. package/dist/src/slack/manifest.js +5 -0
  89. package/dist/src/slack/manifest.js.map +1 -1
  90. package/dist/src/slack/send-handler.js +26 -4
  91. package/dist/src/slack/send-handler.js.map +1 -1
  92. package/dist/src/slack/send-only-client.js +26 -2
  93. package/dist/src/slack/send-only-client.js.map +1 -1
  94. package/dist/src/slack/socket.js +36 -13
  95. package/dist/src/slack/socket.js.map +1 -1
  96. package/dist/src/telegram/bot.js +122 -14
  97. package/dist/src/telegram/bot.js.map +1 -1
  98. package/package.json +4 -1
  99. package/public/dist/assets/ChannelEnablementControl-Da_t_jq6.js +1 -0
  100. package/public/dist/assets/ChannelsDiscord-kNjCCJcA.js +1 -0
  101. package/public/dist/assets/ChannelsSlack-BOuoCfeN.js +1 -0
  102. package/public/dist/assets/ChannelsTelegram-DBIFDz4R.js +1 -0
  103. package/public/dist/assets/{app-DUbf-v7B.js → app-TWwXw3iD.js} +4 -4
  104. package/public/dist/assets/bgtask-badge-BhzSqQHG.js +1 -0
  105. package/public/dist/assets/{bgtask-badge-jIH69Dp3.js → bgtask-badge-DaAUnoKD.js} +1 -1
  106. package/public/dist/assets/{employees-BNy8a6XX.js → employees-BFKkaVAe.js} +1 -1
  107. package/public/dist/assets/iframe-renderer-BxEzdKIA.js +1 -0
  108. package/public/dist/assets/{iframe-renderer-C6Zwg9w4.js → iframe-renderer-CvnKi77F.js} +2 -2
  109. package/public/dist/assets/{manager-DzCR6Pam.js → manager-BTpvAFwX.js} +1 -1
  110. package/public/dist/assets/memory-DHOtCiw5.js +1 -0
  111. package/public/dist/assets/{memory-C4O44HMr.js → memory-db_s-38T.js} +1 -1
  112. package/public/dist/assets/{message-history-DCxD21J1.js → message-history-BX9shNKA.js} +1 -1
  113. package/public/dist/assets/message-history-DaSxkyy0.js +1 -0
  114. package/public/dist/assets/{render-A--hkukv.js → render-DZnFK8Kv.js} +1 -1
  115. package/public/dist/assets/{settings-3ZdoKHIf.js → settings-BuFMKcQ-.js} +1 -1
  116. package/public/dist/assets/settings-DotRDITm.js +1 -0
  117. package/public/dist/assets/{settings-core-CQe1uP6x.js → settings-core-3fj0DVoa.js} +17 -17
  118. package/public/dist/assets/settings-core-DohSnMad.js +1 -0
  119. package/public/dist/assets/{sidebar-DxFp_449.js → sidebar-D5TP7TCO.js} +3 -3
  120. package/public/dist/assets/{skills-BU4q8Q8n.js → skills-CQzHFYJS.js} +1 -1
  121. package/public/dist/assets/skills-DZHEvl1x.js +1 -0
  122. package/public/dist/assets/{slash-commands-BiXOgZ5B.js → slash-commands-BWEWWf-c.js} +1 -1
  123. package/public/dist/assets/slash-commands-CuJdloNC.js +1 -0
  124. package/public/dist/assets/{trace-drawer-2BTQCor6.js → trace-drawer-CBR-PZB4.js} +1 -1
  125. package/public/dist/assets/ui-CWl27eMl.js +1 -0
  126. package/public/dist/assets/{ui-Csy42uNW.js → ui-Ca1Q-VFQ.js} +1 -1
  127. package/public/dist/index.html +1 -1
  128. package/public/dist/manager/index.html +1 -1
  129. package/public/js/features/settings-channel.ts +35 -5
  130. package/public/js/features/settings-types.ts +7 -0
  131. package/public/js/features/transport-status-row.ts +23 -4
  132. package/public/manager/src/settings/pages/ChannelsDiscord.tsx +39 -11
  133. package/public/manager/src/settings/pages/ChannelsSlack.tsx +24 -7
  134. package/public/manager/src/settings/pages/ChannelsTelegram.tsx +38 -10
  135. package/public/manager/src/settings/pages/components/ChannelEnablementControl.tsx +98 -0
  136. package/public/manager/src/settings/pages/components/TransportStatusChips.tsx +23 -2
  137. package/scripts/docs/extract-commands.mts +3 -0
  138. package/scripts/generate-channel-capability-table.mts +161 -0
  139. package/scripts/promote-to-main.sh +175 -0
  140. package/scripts/release-gates.mjs +57 -3
  141. package/scripts/release-preview.sh +19 -0
  142. package/scripts/require-release-evidence.mjs +35 -1
  143. package/scripts/validate-messaging-certification.mts +83 -0
  144. package/scripts/write-messaging-certification.mts +65 -0
  145. package/public/dist/assets/ChannelsDiscord-D4fD-9hP.js +0 -1
  146. package/public/dist/assets/ChannelsSlack-_KBwRonM.js +0 -1
  147. package/public/dist/assets/ChannelsTelegram-tihzSWVE.js +0 -1
  148. package/public/dist/assets/TransportStatusChips-B0NR0ljO.js +0 -1
  149. package/public/dist/assets/bgtask-badge-B8KhuBa7.js +0 -1
  150. package/public/dist/assets/iframe-renderer-DBmV8gCQ.js +0 -1
  151. package/public/dist/assets/memory-Dt_Ji6aP.js +0 -1
  152. package/public/dist/assets/message-history-DyISauiv.js +0 -1
  153. package/public/dist/assets/settings-C6Pku2GC.js +0 -1
  154. package/public/dist/assets/settings-core-DqwLJkgP.js +0 -1
  155. package/public/dist/assets/skills-x2gH-1Ry.js +0 -1
  156. package/public/dist/assets/slash-commands-s8eR7Kd1.js +0 -1
  157. package/public/dist/assets/ui-CB0L33o0.js +0 -1
  158. package/scripts/release.sh +0 -224
  159. /package/public/dist/assets/{HealthBadge-CUaJ1PQH.js → HealthBadge-CiNMS-1k.js} +0 -0
@@ -0,0 +1,184 @@
1
+ // ─── Outbound attempt outbox ──────────────────────────────────
2
+ // Reserve-before-send: the row exists before the vendor call, so a crash between
3
+ // dispatch and receipt leaves a record instead of a gap. "ambiguous" is how we
4
+ // spell "the network timed out and nobody knows whether the user saw it."
5
+ //
6
+ // ambiguous is terminal for the automatic path. Nothing in-process retries an
7
+ // ambiguous attempt — that would be exactly the duplicate the state exists to
8
+ // prevent. An operator or an explicit replay may create a *new* attempt.
9
+ import { randomUUID } from 'node:crypto';
10
+ import { registerChildRetentionPredicate } from './durable-ingress.js';
11
+ export const OUTBOUND_ATTEMPTS_TABLE = 'outbound_attempts';
12
+ export const CREATE_OUTBOUND_ATTEMPTS_SQL = `
13
+ CREATE TABLE IF NOT EXISTS outbound_attempts (
14
+ id TEXT PRIMARY KEY,
15
+ channel TEXT NOT NULL CHECK(channel IN ('telegram', 'slack', 'discord')),
16
+ account_id TEXT NOT NULL,
17
+ event_id TEXT NOT NULL,
18
+ effect_name TEXT NOT NULL,
19
+ target_key TEXT NOT NULL,
20
+ idempotency_key TEXT NOT NULL UNIQUE,
21
+ payload_digest TEXT NOT NULL,
22
+ state TEXT NOT NULL DEFAULT 'pending'
23
+ CHECK(state IN ('pending', 'sending', 'sent', 'definitive_failed', 'ambiguous')),
24
+ attempt_count INTEGER NOT NULL DEFAULT 0 CHECK(attempt_count >= 0),
25
+ platform_receipt TEXT,
26
+ last_error TEXT,
27
+ created_at INTEGER NOT NULL,
28
+ updated_at INTEGER NOT NULL,
29
+ sent_at INTEGER,
30
+ FOREIGN KEY (channel, account_id, event_id)
31
+ REFERENCES ingress_events(channel, account_id, event_id)
32
+ );
33
+ CREATE INDEX IF NOT EXISTS idx_outbound_attempts_state
34
+ ON outbound_attempts (state, updated_at);
35
+ `;
36
+ const STATES = new Set([
37
+ 'pending', 'sending', 'sent', 'definitive_failed', 'ambiguous',
38
+ ]);
39
+ function rowToRecord(row) {
40
+ const state = String(row['state']);
41
+ if (!STATES.has(state)) {
42
+ throw new Error(`outbound outbox: unrecognised state ${JSON.stringify(state)}`);
43
+ }
44
+ return {
45
+ id: String(row['id']),
46
+ channel: String(row['channel']),
47
+ accountId: String(row['account_id']),
48
+ eventId: String(row['event_id']),
49
+ effectName: String(row['effect_name']),
50
+ targetKey: String(row['target_key']),
51
+ idempotencyKey: String(row['idempotency_key']),
52
+ payloadDigest: String(row['payload_digest']),
53
+ state: state,
54
+ attemptCount: Number(row['attempt_count']),
55
+ platformReceipt: row['platform_receipt'] ?? null,
56
+ lastError: row['last_error'] ?? null,
57
+ createdAt: Number(row['created_at']),
58
+ updatedAt: Number(row['updated_at']),
59
+ sentAt: row['sent_at'] ?? null,
60
+ };
61
+ }
62
+ export class OutboundOutbox {
63
+ database;
64
+ now;
65
+ constructor(database, options = {}) {
66
+ this.database = database;
67
+ this.now = options.now ?? (() => Date.now());
68
+ this.database.exec(CREATE_OUTBOUND_ATTEMPTS_SQL);
69
+ registerChildRetentionPredicate({
70
+ table: OUTBOUND_ATTEMPTS_TABLE,
71
+ // A non-terminal or ambiguous attempt is exactly the row an operator still
72
+ // needs. Sweeping its parent would erase the only evidence that a message
73
+ // may have been sent.
74
+ blockingExistsSql: "SELECT 1 FROM outbound_attempts o WHERE o.channel = e.channel "
75
+ + "AND o.account_id = e.account_id AND o.event_id = e.event_id "
76
+ + "AND o.state NOT IN ('sent', 'definitive_failed')",
77
+ deleteTerminalSql: "DELETE FROM outbound_attempts WHERE channel = ? AND account_id = ? "
78
+ + "AND event_id = ? AND state IN ('sent', 'definitive_failed')",
79
+ });
80
+ }
81
+ find(id) {
82
+ const row = this.database.prepare('SELECT * FROM outbound_attempts WHERE id = ?').get(id);
83
+ return row ? rowToRecord(row) : null;
84
+ }
85
+ findByIdempotencyKey(key) {
86
+ const row = this.database.prepare('SELECT * FROM outbound_attempts WHERE idempotency_key = ?').get(key);
87
+ return row ? rowToRecord(row) : null;
88
+ }
89
+ /**
90
+ * Create the row BEFORE the vendor call. A replay that reserves the same
91
+ * idempotency key returns the existing row — that is how "reserve before send"
92
+ * prevents a second attempt for the same logical delivery.
93
+ */
94
+ reserve(fields) {
95
+ const existing = this.findByIdempotencyKey(fields.idempotencyKey);
96
+ if (existing)
97
+ return { reserved: false, reason: 'idempotency_hit', record: existing };
98
+ const id = randomUUID();
99
+ const now = this.now();
100
+ try {
101
+ this.database.prepare(`
102
+ INSERT INTO outbound_attempts (
103
+ id, channel, account_id, event_id, effect_name,
104
+ target_key, idempotency_key, payload_digest,
105
+ state, attempt_count, created_at, updated_at
106
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'pending', 0, ?, ?)
107
+ `).run(id, fields.channel, fields.accountId, fields.eventId, fields.effectName, fields.targetKey, fields.idempotencyKey, fields.payloadDigest, now, now);
108
+ }
109
+ catch (error) {
110
+ // UNIQUE on idempotency_key can race just like journal append.
111
+ const raced = this.findByIdempotencyKey(fields.idempotencyKey);
112
+ if (raced)
113
+ return { reserved: false, reason: 'idempotency_hit', record: raced };
114
+ throw error;
115
+ }
116
+ const record = this.find(id);
117
+ if (!record)
118
+ throw new Error('outbound outbox: reserve did not persist');
119
+ return { reserved: true, record };
120
+ }
121
+ /** Mark that the vendor call is in flight. Only from pending. */
122
+ markSending(id) {
123
+ const now = this.now();
124
+ return this.database.prepare(`
125
+ UPDATE outbound_attempts
126
+ SET state = 'sending', attempt_count = attempt_count + 1, updated_at = ?
127
+ WHERE id = ? AND state = 'pending'
128
+ `).run(now, id).changes === 1;
129
+ }
130
+ /** Platform confirmed receipt. Only from sending. */
131
+ markSent(id, platformReceipt) {
132
+ const now = this.now();
133
+ return this.database.prepare(`
134
+ UPDATE outbound_attempts
135
+ SET state = 'sent', platform_receipt = ?, sent_at = ?, updated_at = ?, last_error = NULL
136
+ WHERE id = ? AND state = 'sending'
137
+ `).run(platformReceipt ?? null, now, now, id).changes === 1;
138
+ }
139
+ /** Known failure before dispatch or a confirmed vendor rejection. From pending or sending. */
140
+ markDefinitiveFailed(id, lastError) {
141
+ const now = this.now();
142
+ return this.database.prepare(`
143
+ UPDATE outbound_attempts
144
+ SET state = 'definitive_failed', last_error = ?, updated_at = ?
145
+ WHERE id = ? AND state IN ('pending', 'sending')
146
+ `).run(lastError, now, id).changes === 1;
147
+ }
148
+ /**
149
+ * The send left the process and nobody can confirm whether it arrived.
150
+ * Only from sending — pending never left, so its outcome is definitive.
151
+ */
152
+ markAmbiguous(id, lastError) {
153
+ const now = this.now();
154
+ return this.database.prepare(`
155
+ UPDATE outbound_attempts
156
+ SET state = 'ambiguous', last_error = ?, updated_at = ?
157
+ WHERE id = ? AND state = 'sending'
158
+ `).run(lastError, now, id).changes === 1;
159
+ }
160
+ list(filter = {}) {
161
+ const where = filter.state ? 'WHERE state = ?' : '';
162
+ const params = filter.state ? [filter.state] : [];
163
+ params.push(filter.limit ?? 50);
164
+ const rows = this.database.prepare(`SELECT * FROM outbound_attempts ${where} ORDER BY created_at DESC LIMIT ?`).all(...params);
165
+ return rows.map(rowToRecord);
166
+ }
167
+ countAmbiguous() {
168
+ const row = this.database.prepare("SELECT COUNT(*) AS n FROM outbound_attempts WHERE state = 'ambiguous'").get();
169
+ return row?.n ?? 0;
170
+ }
171
+ }
172
+ let outbox = null;
173
+ export function initOutboundOutbox(database, options = {}) {
174
+ outbox = new OutboundOutbox(database, options);
175
+ return outbox;
176
+ }
177
+ export function getOutboundOutbox() {
178
+ return outbox;
179
+ }
180
+ /** Test seam. */
181
+ export function __resetOutboundOutboxForTests() {
182
+ outbox = null;
183
+ }
184
+ //# sourceMappingURL=outbound-outbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbound-outbox.js","sourceRoot":"","sources":["../../../src/messaging/outbound-outbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ // Channel-neutral remote command identity (M4-A0).
2
+ //
3
+ // Transports still call `makeCommandCtx` + `executeCommand` this cycle. This
4
+ // module only names the five fields a later handler will need so Discord slash,
5
+ // Slack slash, and Telegram text cannot invent three shapes for the same fact.
6
+ const CHANNELS = new Set(['telegram', 'discord', 'slack']);
7
+ export function resolveRemoteCommandContext(input) {
8
+ if (!CHANNELS.has(input.channel))
9
+ return { ok: false, reason: 'missing_field', field: 'channel' };
10
+ if (!input.actorId)
11
+ return { ok: false, reason: 'missing_field', field: 'actorId' };
12
+ if (!input.conversationKey)
13
+ return { ok: false, reason: 'missing_field', field: 'conversationKey' };
14
+ if (!input.chatSessionId)
15
+ return { ok: false, reason: 'missing_field', field: 'chatSessionId' };
16
+ if (typeof input.generation !== 'number' || !Number.isInteger(input.generation) || input.generation < 0) {
17
+ return { ok: false, reason: 'missing_field', field: 'generation' };
18
+ }
19
+ return {
20
+ ok: true,
21
+ context: {
22
+ channel: input.channel,
23
+ actorId: input.actorId,
24
+ conversationKey: input.conversationKey,
25
+ chatSessionId: input.chatSessionId,
26
+ generation: input.generation,
27
+ },
28
+ };
29
+ }
30
+ //# sourceMappingURL=remote-command-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-command-context.js","sourceRoot":"","sources":["../../../src/messaging/remote-command-context.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,EAAE;AACF,6EAA6E;AAC7E,gFAAgF;AAChF,+EAA+E;AAwB/E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AAE7E,MAAM,UAAU,2BAA2B,CACvC,KAAgC;IAEhC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAClG,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACpF,IAAI,CAAC,KAAK,CAAC,eAAe;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;IACpG,IAAI,CAAC,KAAK,CAAC,aAAa;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;IAChG,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QACtG,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IACvE,CAAC;IACD,OAAO;QACH,EAAE,EAAE,IAAI;QACR,OAAO,EAAE;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,eAAe,EAAE,KAAK,CAAC,eAAe;YACtC,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,UAAU,EAAE,KAAK,CAAC,UAAU;SAC/B;KACJ,CAAC;AACN,CAAC"}
@@ -8,7 +8,12 @@ function asApiError(err) {
8
8
  }
9
9
  export function classifySendFailure(err) {
10
10
  const e = asApiError(err);
11
- if (e.error_code === 429 || e.parameters?.retry_after !== undefined)
11
+ const slackError = typeof e.error === 'string' ? e.error : '';
12
+ if (e.error_code === 429
13
+ || e.statusCode === 429
14
+ || e.status === 429
15
+ || slackError === 'ratelimited'
16
+ || e.parameters?.retry_after !== undefined)
12
17
  return 'rate-limit';
13
18
  // 400 is Telegram's catch-all for a malformed request; only the parse and
14
19
  // entity variants mean "the same content, written differently, would work".
@@ -24,7 +29,11 @@ export function classifySendFailure(err) {
24
29
  }
25
30
  /** Seconds Telegram asked us to wait, in milliseconds. Zero when unstated. */
26
31
  export function retryAfterMs(err) {
27
- return (asApiError(err).parameters?.retry_after ?? 0) * 1000;
32
+ const e = asApiError(err);
33
+ if (typeof e.retryAfterMs === 'number' && Number.isFinite(e.retryAfterMs) && e.retryAfterMs >= 0) {
34
+ return e.retryAfterMs;
35
+ }
36
+ return (e.parameters?.retry_after ?? 0) * 1000;
28
37
  }
29
38
  /**
30
39
  * A rate limit longer than this is not worth blocking a send on.
@@ -1 +1 @@
1
- {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/messaging/retry.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,8EAA8E;AAC9E,+EAA+E;AAC/E,0EAA0E;AAC1E,0EAA0E;AAiB1E,SAAS,UAAU,CAAC,GAAY;IAC5B,OAAO,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAE,GAA4B,CAAC,CAAC,CAAC,EAAE,CAAC;AACjF,CAAC;AAgBD,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC5C,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,CAAC,UAAU,KAAK,GAAG,IAAI,CAAC,CAAC,UAAU,EAAE,WAAW,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC;IAEzF,0EAA0E;IAC1E,4EAA4E;IAC5E,IAAI,CAAC,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACvE,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;eAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;eACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;eAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/B,OAAO,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;IACpD,CAAC;IACD,OAAO,WAAW,CAAC;AACvB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,YAAY,CAAC,GAAY;IACrC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,WAAW,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;AACjE,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACrC,IAA4B,EAC5B,SAAkC;IAElC,IAAI,CAAC;QACD,MAAM,IAAI,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACpB,IAAI,mBAAmB,CAAC,GAAG,CAAC,KAAK,YAAY,EAAE,CAAC;YAC5C,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;YACjB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,wBAAwB,EAAE,CAAC;YAC/C,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;YACjB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC;YACD,MAAM,IAAI,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,OAAO,QAAiB,EAAE,CAAC;YACzB,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC;YACtB,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/messaging/retry.ts"],"names":[],"mappings":"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"}
@@ -5,10 +5,37 @@ import { settings, saveSettings } from '../core/config.js';
5
5
  import { isRemoteTarget } from './types.js';
6
6
  import { log } from '../core/logger.js';
7
7
  import { logErrorText } from './redact.js';
8
+ export const transportStarted = { started: true };
9
+ export function transportNotStarted(reason, detail) {
10
+ return detail === undefined ? { started: false, reason } : { started: false, reason, detail };
11
+ }
8
12
  const transports = new Map();
13
+ const CHANNELS = ['telegram', 'discord', 'slack'];
14
+ const runningTransports = new Set();
15
+ const transportErrors = new Map();
16
+ function isMessengerChannel(value) {
17
+ return CHANNELS.includes(value);
18
+ }
19
+ function isPlainRecord(value) {
20
+ return !!value && typeof value === 'object' && !Array.isArray(value);
21
+ }
9
22
  export function registerTransport(channel, fns) {
10
23
  transports.set(channel, fns);
11
24
  }
25
+ /** Test-only: clear registry and running state between tests. */
26
+ export function __resetTransportRegistryForTests() {
27
+ transports.clear();
28
+ lastActiveTargets.clear();
29
+ latestSeenTargets.clear();
30
+ runningTransports.clear();
31
+ transportErrors.clear();
32
+ }
33
+ /** Test-only: clear target maps between tests. */
34
+ export function __resetTargetStateForTests() {
35
+ lastActiveTargets.clear();
36
+ latestSeenTargets.clear();
37
+ persistTimer = null;
38
+ }
12
39
  // ─── Last Active / Latest Seen Target State ─────────
13
40
  const lastActiveTargets = new Map();
14
41
  const latestSeenTargets = new Map();
@@ -79,46 +106,118 @@ export function hydrateTargetsFromSettings(s) {
79
106
  }
80
107
  }
81
108
  }
82
- // ─── Lifecycle ──────────────────────────────────────
83
- export function getActiveChannel() {
84
- return settings["channel"] || 'telegram';
109
+ export function getEnabledChannels(snapshot = settings) {
110
+ const messaging = snapshot.messaging;
111
+ const raw = isPlainRecord(messaging) ? messaging["enabledChannels"] : undefined;
112
+ return Array.isArray(raw) ? raw.filter(isMessengerChannel) : [];
85
113
  }
86
- export async function initActiveMessagingRuntime() {
87
- const channel = getActiveChannel();
114
+ export function getHomeChannel(snapshot = settings) {
115
+ const messaging = snapshot.messaging;
116
+ const home = isPlainRecord(messaging) ? messaging["homeChannel"] : undefined;
117
+ return isMessengerChannel(home) ? home : 'telegram';
118
+ }
119
+ export function isMessagingTransportRunning(channel) {
120
+ return runningTransports.has(channel);
121
+ }
122
+ export function getRunningMessagingTransports() {
123
+ return [...runningTransports];
124
+ }
125
+ /** The last fault recorded for a channel, or null. Only a genuine failure lands
126
+ * here: a channel that declined to start because it was not configured, not the
127
+ * attach instance, or superseded has nothing wrong with it. */
128
+ export function getMessagingTransportError(channel) {
129
+ return transportErrors.get(channel) ?? null;
130
+ }
131
+ export async function startMessagingTransport(channel) {
88
132
  const transport = transports.get(channel);
89
- if (transport) {
90
- await transport.init();
133
+ if (!transport) {
134
+ transportErrors.set(channel, 'transport_not_registered');
135
+ log.warn(`[messaging] no transport registered for ${channel}`);
136
+ return transportNotStarted('not_registered');
91
137
  }
92
- else {
93
- log.info(`[messaging] no transport registered for ${channel}`);
138
+ try {
139
+ const outcome = await transport.init();
140
+ if (!outcome.started) {
141
+ runningTransports.delete(channel);
142
+ // A channel nobody configured, or one a concurrent init owns, is not a
143
+ // fault. Recording it would surface a permanent error in health for a
144
+ // state the operator chose.
145
+ if (outcome.reason === 'failed') {
146
+ transportErrors.set(channel, outcome.detail ?? 'init_failed');
147
+ }
148
+ else {
149
+ transportErrors.delete(channel);
150
+ }
151
+ return outcome;
152
+ }
153
+ runningTransports.add(channel);
154
+ transportErrors.delete(channel);
155
+ return outcome;
156
+ }
157
+ catch (error) {
158
+ runningTransports.delete(channel);
159
+ transportErrors.set(channel, logErrorText(error));
160
+ log.warn(`[messaging] ${channel} init error:`, logErrorText(error));
161
+ return transportNotStarted('failed', logErrorText(error));
94
162
  }
95
163
  }
164
+ export async function stopMessagingTransport(channel) {
165
+ const transport = transports.get(channel);
166
+ if (!transport)
167
+ return true;
168
+ try {
169
+ await transport.shutdown();
170
+ runningTransports.delete(channel);
171
+ return true;
172
+ }
173
+ catch (error) {
174
+ transportErrors.set(channel, logErrorText(error));
175
+ log.warn(`[messaging] ${channel} shutdown error:`, logErrorText(error));
176
+ return false;
177
+ }
178
+ }
179
+ export async function initEnabledMessagingRuntimes() {
180
+ const result = {
181
+ telegram: transportNotStarted('not_configured'),
182
+ discord: transportNotStarted('not_configured'),
183
+ slack: transportNotStarted('not_configured'),
184
+ };
185
+ for (const channel of getEnabledChannels()) {
186
+ result[channel] = await startMessagingTransport(channel);
187
+ }
188
+ return result;
189
+ }
190
+ /** @deprecated Use initEnabledMessagingRuntimes instead. */
191
+ export async function initActiveMessagingRuntime() {
192
+ return initEnabledMessagingRuntimes();
193
+ }
96
194
  export async function shutdownMessagingRuntime() {
97
- for (const [name, transport] of transports) {
98
- try {
99
- await transport.shutdown();
100
- }
101
- catch (e) {
102
- // A transport shutdown failure comes from the vendor client, whose
103
- // error text has carried a request URL with the bot token in it.
104
- log.warn(`[messaging] ${name} shutdown error:`, logErrorText(e));
105
- }
195
+ for (const channel of CHANNELS) {
196
+ await stopMessagingTransport(channel);
106
197
  }
107
198
  }
108
199
  export { getTransportCapability, buildChannelHealthSnapshot } from './channel-health.js';
109
200
  export async function restartMessagingRuntime(prev, next, patch) {
110
- const prevChannel = prev["channel"] || 'telegram';
111
- const nextChannel = next["channel"] || 'telegram';
112
- // Only restart if active channel changed, or the active channel's config changed
113
- const channelSwitched = prevChannel !== nextChannel;
114
- const activeChannelPatched = !!patch[nextChannel];
115
- const localeSwitched = patch["locale"] !== undefined;
116
- // Inactive channel config change should NOT trigger restart
117
- if (!channelSwitched && !activeChannelPatched && !localeSwitched)
201
+ const prevEnabled = new Set(getEnabledChannels(prev));
202
+ const nextEnabled = new Set(getEnabledChannels(next));
203
+ const affected = new Set();
204
+ for (const channel of CHANNELS) {
205
+ if (prevEnabled.has(channel) !== nextEnabled.has(channel))
206
+ affected.add(channel);
207
+ if (patch[channel] !== undefined && (prevEnabled.has(channel) || nextEnabled.has(channel))) {
208
+ affected.add(channel);
209
+ }
210
+ if (patch["locale"] !== undefined && nextEnabled.has(channel))
211
+ affected.add(channel);
212
+ }
213
+ if (affected.size === 0)
118
214
  return;
119
- // Clear stale targets on restart to prevent routing to previous channel/thread
120
- clearTargetState();
121
- await shutdownMessagingRuntime();
122
- await initActiveMessagingRuntime();
215
+ for (const channel of affected) {
216
+ if (prevEnabled.has(channel))
217
+ await stopMessagingTransport(channel);
218
+ clearTargetState(channel);
219
+ if (nextEnabled.has(channel))
220
+ await startMessagingTransport(channel);
221
+ }
123
222
  }
124
223
  //# sourceMappingURL=runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/messaging/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/messaging/runtime.ts"],"names":[],"mappings":"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"}
@@ -4,10 +4,14 @@ import { settings } from '../core/config.js';
4
4
  import { stripUndefined } from '../core/strip-undefined.js';
5
5
  import { assertSendFilePath } from '../security/path-guards.js';
6
6
  import { isRemoteTarget } from './types.js';
7
- import { getLastActiveTarget, getLatestSeenTarget, clearTargetState } from './runtime.js';
7
+ import { getLastActiveTarget, getLatestSeenTarget, clearTargetState, getHomeChannel } from './runtime.js';
8
8
  import { slackTargetFromId, slackPeerKind } from './slack-target.js';
9
9
  import { applyOutputPolicy } from '../core/policy-hooks.js';
10
10
  import { redactChannelSecrets } from './redact.js';
11
+ import { log } from '../core/logger.js';
12
+ export function stampOutboundSend(channel, ok) {
13
+ log.event('outbound.send', { channel, result: ok ? 'ok' : 'error' });
14
+ }
11
15
  const sendFns = new Map();
12
16
  const OUTBOUND_TYPES = new Set(['text', 'voice', 'photo', 'document', 'keyboard']);
13
17
  const CHANNELS = new Set(['telegram', 'discord', 'slack', 'active']);
@@ -27,6 +31,16 @@ function normalizeOutboundType(value) {
27
31
  }
28
32
  return type;
29
33
  }
34
+ function normalizeInteractiveFallback(value) {
35
+ if (value == null || value === '')
36
+ return undefined;
37
+ const fallback = String(value).trim().toLowerCase();
38
+ // Only one lesser delivery exists today. Accepting anything else would let a
39
+ // typo read as consent to a downgrade the caller did not ask for.
40
+ if (fallback !== 'text')
41
+ throw badRequest('invalid_interactive_fallback');
42
+ return 'text';
43
+ }
30
44
  function normalizeChannel(value) {
31
45
  const channel = value == null || value === ''
32
46
  ? 'active'
@@ -53,13 +67,23 @@ export function normalizeChannelSendRequest(body) {
53
67
  caption: body["caption"],
54
68
  target: body["target"],
55
69
  chatId: body["chat_id"] ?? body["chatId"],
70
+ // This normalizer is an allowlist, so an opt-in the caller sent would be
71
+ // dropped here and every HTTP keyboard send to a channel without
72
+ // interactive support would come back unsupported.
73
+ interactiveFallback: normalizeInteractiveFallback(body["interactive_fallback"] ?? body["interactiveFallback"]),
56
74
  });
57
75
  }
58
76
  // ─── Resolve Target ─────────────────────────────────
59
77
  function resolveChannel(req) {
78
+ if (req.target) {
79
+ if (req.channel && req.channel !== 'active' && req.channel !== req.target.channel) {
80
+ throw badRequest('channel_target_mismatch');
81
+ }
82
+ return req.target.channel;
83
+ }
60
84
  if (req.channel && req.channel !== 'active')
61
85
  return req.channel;
62
- return settings["channel"] || 'telegram';
86
+ return getHomeChannel();
63
87
  }
64
88
  // ─── Send ───────────────────────────────────────────
65
89
  /**
@@ -244,9 +268,10 @@ export async function sendChannelOutput(req) {
244
268
  // straight into HTTP response bodies via res.json(result). Masking at each
245
269
  // call site was tried and missed several; masking here cannot be bypassed.
246
270
  const result = await sendFn(req);
247
- if (result.ok === false && typeof result.error === 'string') {
248
- return { ...result, error: redactChannelSecrets(result.error) };
249
- }
250
- return result;
271
+ const sanitized = result.ok === false && typeof result.error === 'string'
272
+ ? { ...result, error: redactChannelSecrets(result.error) }
273
+ : result;
274
+ stampOutboundSend(channel, sanitized.ok !== false);
275
+ return sanitized;
251
276
  }
252
277
  //# sourceMappingURL=send.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"send.js","sourceRoot":"","sources":["../../../src/messaging/send.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"send.js","sourceRoot":"","sources":["../../../src/messaging/send.ts"],"names":[],"mappings":"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"}