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.
- package/README.md +5 -2
- package/dist/bin/cli-jaw.js +6 -1
- package/dist/bin/cli-jaw.js.map +1 -1
- package/dist/bin/commands/doctor.js +39 -18
- package/dist/bin/commands/doctor.js.map +1 -1
- package/dist/bin/commands/init.js +82 -23
- package/dist/bin/commands/init.js.map +1 -1
- package/dist/bin/commands/messaging.js +262 -0
- package/dist/bin/commands/messaging.js.map +1 -0
- package/dist/server.js +30 -6
- package/dist/server.js.map +1 -1
- package/dist/src/cli/commands.js +6 -2
- package/dist/src/cli/commands.js.map +1 -1
- package/dist/src/cli/handlers/remote-session-commands.js +94 -0
- package/dist/src/cli/handlers/remote-session-commands.js.map +1 -0
- package/dist/src/command-contract/catalog.js +1 -1
- package/dist/src/command-contract/catalog.js.map +1 -1
- package/dist/src/core/chat-sessions.js +4 -0
- package/dist/src/core/chat-sessions.js.map +1 -1
- package/dist/src/core/config.js +63 -22
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/db.js +6 -0
- package/dist/src/core/db.js.map +1 -1
- package/dist/src/core/dispatch-approval-ingress.js +45 -3
- package/dist/src/core/dispatch-approval-ingress.js.map +1 -1
- package/dist/src/core/dispatch-approval.js +46 -0
- package/dist/src/core/dispatch-approval.js.map +1 -1
- package/dist/src/core/logger.js +67 -0
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/session-generation.js +74 -0
- package/dist/src/core/session-generation.js.map +1 -0
- package/dist/src/discord/bot.js +91 -5
- package/dist/src/discord/bot.js.map +1 -1
- package/dist/src/discord/commands.js +34 -1
- package/dist/src/discord/commands.js.map +1 -1
- package/dist/src/discord/forwarder.js +4 -1
- package/dist/src/discord/forwarder.js.map +1 -1
- package/dist/src/discord/send-only-client.js +14 -7
- package/dist/src/discord/send-only-client.js.map +1 -1
- package/dist/src/messaging/access-policy.js +26 -0
- package/dist/src/messaging/access-policy.js.map +1 -0
- package/dist/src/messaging/approval-presentation.js +89 -0
- package/dist/src/messaging/approval-presentation.js.map +1 -0
- package/dist/src/messaging/channel-adapter.js +47 -0
- package/dist/src/messaging/channel-adapter.js.map +1 -0
- package/dist/src/messaging/channel-capabilities.js +47 -15
- package/dist/src/messaging/channel-capabilities.js.map +1 -1
- package/dist/src/messaging/channel-health.js +23 -3
- package/dist/src/messaging/channel-health.js.map +1 -1
- package/dist/src/messaging/delivery-outcome.js +12 -0
- package/dist/src/messaging/delivery-outcome.js.map +1 -1
- package/dist/src/messaging/durable-ingress.js +458 -0
- package/dist/src/messaging/durable-ingress.js.map +1 -0
- package/dist/src/messaging/effect-once.js +204 -0
- package/dist/src/messaging/effect-once.js.map +1 -0
- package/dist/src/messaging/inbound-envelope.js +168 -0
- package/dist/src/messaging/inbound-envelope.js.map +1 -0
- package/dist/src/messaging/ingress-audit.js +41 -0
- package/dist/src/messaging/ingress-audit.js.map +1 -0
- package/dist/src/messaging/ingress-generation.js +22 -0
- package/dist/src/messaging/ingress-generation.js.map +1 -0
- package/dist/src/messaging/metrics.js +69 -0
- package/dist/src/messaging/metrics.js.map +1 -0
- package/dist/src/messaging/outbound-outbox.js +184 -0
- package/dist/src/messaging/outbound-outbox.js.map +1 -0
- package/dist/src/messaging/remote-command-context.js +30 -0
- package/dist/src/messaging/remote-command-context.js.map +1 -0
- package/dist/src/messaging/retry.js +11 -2
- package/dist/src/messaging/retry.js.map +1 -1
- package/dist/src/messaging/runtime.js +129 -30
- package/dist/src/messaging/runtime.js.map +1 -1
- package/dist/src/messaging/send.js +31 -6
- package/dist/src/messaging/send.js.map +1 -1
- package/dist/src/messaging/trace-context.js +56 -0
- package/dist/src/messaging/trace-context.js.map +1 -0
- package/dist/src/messaging/types.js +39 -1
- package/dist/src/messaging/types.js.map +1 -1
- package/dist/src/routes/orchestrate.js +10 -3
- package/dist/src/routes/orchestrate.js.map +1 -1
- package/dist/src/routes/settings.js +26 -1
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/slack/bot.js +182 -70
- package/dist/src/slack/bot.js.map +1 -1
- package/dist/src/slack/commands.js +16 -1
- package/dist/src/slack/commands.js.map +1 -1
- package/dist/src/slack/format.js +4 -1
- package/dist/src/slack/format.js.map +1 -1
- package/dist/src/slack/manifest.js +5 -0
- package/dist/src/slack/manifest.js.map +1 -1
- package/dist/src/slack/send-handler.js +26 -4
- package/dist/src/slack/send-handler.js.map +1 -1
- package/dist/src/slack/send-only-client.js +26 -2
- package/dist/src/slack/send-only-client.js.map +1 -1
- package/dist/src/slack/socket.js +36 -13
- package/dist/src/slack/socket.js.map +1 -1
- package/dist/src/telegram/bot.js +122 -14
- package/dist/src/telegram/bot.js.map +1 -1
- package/package.json +4 -1
- package/public/dist/assets/ChannelEnablementControl-Da_t_jq6.js +1 -0
- package/public/dist/assets/ChannelsDiscord-kNjCCJcA.js +1 -0
- package/public/dist/assets/ChannelsSlack-BOuoCfeN.js +1 -0
- package/public/dist/assets/ChannelsTelegram-DBIFDz4R.js +1 -0
- package/public/dist/assets/{app-DUbf-v7B.js → app-TWwXw3iD.js} +4 -4
- package/public/dist/assets/bgtask-badge-BhzSqQHG.js +1 -0
- package/public/dist/assets/{bgtask-badge-jIH69Dp3.js → bgtask-badge-DaAUnoKD.js} +1 -1
- package/public/dist/assets/{employees-BNy8a6XX.js → employees-BFKkaVAe.js} +1 -1
- package/public/dist/assets/iframe-renderer-BxEzdKIA.js +1 -0
- package/public/dist/assets/{iframe-renderer-C6Zwg9w4.js → iframe-renderer-CvnKi77F.js} +2 -2
- package/public/dist/assets/{manager-DzCR6Pam.js → manager-BTpvAFwX.js} +1 -1
- package/public/dist/assets/memory-DHOtCiw5.js +1 -0
- package/public/dist/assets/{memory-C4O44HMr.js → memory-db_s-38T.js} +1 -1
- package/public/dist/assets/{message-history-DCxD21J1.js → message-history-BX9shNKA.js} +1 -1
- package/public/dist/assets/message-history-DaSxkyy0.js +1 -0
- package/public/dist/assets/{render-A--hkukv.js → render-DZnFK8Kv.js} +1 -1
- package/public/dist/assets/{settings-3ZdoKHIf.js → settings-BuFMKcQ-.js} +1 -1
- package/public/dist/assets/settings-DotRDITm.js +1 -0
- package/public/dist/assets/{settings-core-CQe1uP6x.js → settings-core-3fj0DVoa.js} +17 -17
- package/public/dist/assets/settings-core-DohSnMad.js +1 -0
- package/public/dist/assets/{sidebar-DxFp_449.js → sidebar-D5TP7TCO.js} +3 -3
- package/public/dist/assets/{skills-BU4q8Q8n.js → skills-CQzHFYJS.js} +1 -1
- package/public/dist/assets/skills-DZHEvl1x.js +1 -0
- package/public/dist/assets/{slash-commands-BiXOgZ5B.js → slash-commands-BWEWWf-c.js} +1 -1
- package/public/dist/assets/slash-commands-CuJdloNC.js +1 -0
- package/public/dist/assets/{trace-drawer-2BTQCor6.js → trace-drawer-CBR-PZB4.js} +1 -1
- package/public/dist/assets/ui-CWl27eMl.js +1 -0
- package/public/dist/assets/{ui-Csy42uNW.js → ui-Ca1Q-VFQ.js} +1 -1
- package/public/dist/index.html +1 -1
- package/public/dist/manager/index.html +1 -1
- package/public/js/features/settings-channel.ts +35 -5
- package/public/js/features/settings-types.ts +7 -0
- package/public/js/features/transport-status-row.ts +23 -4
- package/public/manager/src/settings/pages/ChannelsDiscord.tsx +39 -11
- package/public/manager/src/settings/pages/ChannelsSlack.tsx +24 -7
- package/public/manager/src/settings/pages/ChannelsTelegram.tsx +38 -10
- package/public/manager/src/settings/pages/components/ChannelEnablementControl.tsx +98 -0
- package/public/manager/src/settings/pages/components/TransportStatusChips.tsx +23 -2
- package/scripts/docs/extract-commands.mts +3 -0
- package/scripts/generate-channel-capability-table.mts +161 -0
- package/scripts/promote-to-main.sh +175 -0
- package/scripts/release-gates.mjs +57 -3
- package/scripts/release-preview.sh +19 -0
- package/scripts/require-release-evidence.mjs +35 -1
- package/scripts/validate-messaging-certification.mts +83 -0
- package/scripts/write-messaging-certification.mts +65 -0
- package/public/dist/assets/ChannelsDiscord-D4fD-9hP.js +0 -1
- package/public/dist/assets/ChannelsSlack-_KBwRonM.js +0 -1
- package/public/dist/assets/ChannelsTelegram-tihzSWVE.js +0 -1
- package/public/dist/assets/TransportStatusChips-B0NR0ljO.js +0 -1
- package/public/dist/assets/bgtask-badge-B8KhuBa7.js +0 -1
- package/public/dist/assets/iframe-renderer-DBmV8gCQ.js +0 -1
- package/public/dist/assets/memory-Dt_Ji6aP.js +0 -1
- package/public/dist/assets/message-history-DyISauiv.js +0 -1
- package/public/dist/assets/settings-C6Pku2GC.js +0 -1
- package/public/dist/assets/settings-core-DqwLJkgP.js +0 -1
- package/public/dist/assets/skills-x2gH-1Ry.js +0 -1
- package/public/dist/assets/slash-commands-s8eR7Kd1.js +0 -1
- package/public/dist/assets/ui-CB0L33o0.js +0 -1
- package/scripts/release.sh +0 -224
- /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
|
-
|
|
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
|
-
|
|
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;
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
|
87
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
93
|
-
|
|
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
|
|
98
|
-
|
|
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
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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":"AAAA,wDAAwD;AACxD,6DAA6D;AAC7D,wFAAwF;AAExF,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAA4C,MAAM,YAAY,CAAC;AACtF,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
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
|
|
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
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
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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"}
|