instar 1.3.1612 → 1.3.1613

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 (120) hide show
  1. package/dashboard/console/console.js +14 -2
  2. package/dist/commands/server.d.ts.map +1 -1
  3. package/dist/commands/server.js +31 -7
  4. package/dist/commands/server.js.map +1 -1
  5. package/dist/core/AppConversationStore.d.ts +2 -0
  6. package/dist/core/AppConversationStore.d.ts.map +1 -1
  7. package/dist/core/AppConversationStore.js +8 -1
  8. package/dist/core/AppConversationStore.js.map +1 -1
  9. package/dist/core/AppRecordSignatures.d.ts +23 -2
  10. package/dist/core/AppRecordSignatures.d.ts.map +1 -1
  11. package/dist/core/AppRecordSignatures.js +32 -5
  12. package/dist/core/AppRecordSignatures.js.map +1 -1
  13. package/dist/core/LocalAttentionItems.d.ts +49 -0
  14. package/dist/core/LocalAttentionItems.d.ts.map +1 -0
  15. package/dist/core/LocalAttentionItems.js +107 -0
  16. package/dist/core/LocalAttentionItems.js.map +1 -0
  17. package/dist/core/MacDesktopHost.d.ts +3 -0
  18. package/dist/core/MacDesktopHost.d.ts.map +1 -1
  19. package/dist/core/MacDesktopHost.js +10 -0
  20. package/dist/core/MacDesktopHost.js.map +1 -1
  21. package/dist/core/MachineLockStateReader.d.ts.map +1 -1
  22. package/dist/core/MachineLockStateReader.js +6 -1
  23. package/dist/core/MachineLockStateReader.js.map +1 -1
  24. package/dist/core/PostUpdateMigrator.d.ts +6 -0
  25. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  26. package/dist/core/PostUpdateMigrator.js +33 -0
  27. package/dist/core/PostUpdateMigrator.js.map +1 -1
  28. package/dist/core/types.d.ts +12 -0
  29. package/dist/core/types.d.ts.map +1 -1
  30. package/dist/core/types.js.map +1 -1
  31. package/dist/data/standards-guard-index.json +1 -1
  32. package/dist/data/standards-guard-index.meta.json +2 -2
  33. package/dist/data/standards-registry.meta.json +1 -1
  34. package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
  35. package/dist/messaging/TelegramAdapter.js +7 -8
  36. package/dist/messaging/TelegramAdapter.js.map +1 -1
  37. package/dist/messaging/shared/MessageLogger.d.ts +2 -0
  38. package/dist/messaging/shared/MessageLogger.d.ts.map +1 -1
  39. package/dist/messaging/shared/MessageLogger.js.map +1 -1
  40. package/dist/messaging/slack/SlackAdapter.d.ts +19 -0
  41. package/dist/messaging/slack/SlackAdapter.d.ts.map +1 -1
  42. package/dist/messaging/slack/SlackAdapter.js +21 -0
  43. package/dist/messaging/slack/SlackAdapter.js.map +1 -1
  44. package/dist/messaging/telegram-origin/OriginForwardToHolder.d.ts +13 -0
  45. package/dist/messaging/telegram-origin/OriginForwardToHolder.d.ts.map +1 -1
  46. package/dist/messaging/telegram-origin/OriginForwardToHolder.js +16 -0
  47. package/dist/messaging/telegram-origin/OriginForwardToHolder.js.map +1 -1
  48. package/dist/messaging/telegram-origin/OriginLegacy.d.ts +8 -0
  49. package/dist/messaging/telegram-origin/OriginLegacy.d.ts.map +1 -1
  50. package/dist/messaging/telegram-origin/OriginLegacy.js +34 -6
  51. package/dist/messaging/telegram-origin/OriginLegacy.js.map +1 -1
  52. package/dist/messaging/telegram-origin/TelegramOriginBoot.d.ts +3 -0
  53. package/dist/messaging/telegram-origin/TelegramOriginBoot.d.ts.map +1 -1
  54. package/dist/messaging/telegram-origin/TelegramOriginBoot.js +54 -10
  55. package/dist/messaging/telegram-origin/TelegramOriginBoot.js.map +1 -1
  56. package/dist/messaging/telegram-origin/types.d.ts +11 -0
  57. package/dist/messaging/telegram-origin/types.d.ts.map +1 -1
  58. package/dist/messaging/telegram-origin/types.js +15 -0
  59. package/dist/messaging/telegram-origin/types.js.map +1 -1
  60. package/dist/monitoring/promptRelaySettle.d.ts +35 -0
  61. package/dist/monitoring/promptRelaySettle.d.ts.map +1 -0
  62. package/dist/monitoring/promptRelaySettle.js +58 -0
  63. package/dist/monitoring/promptRelaySettle.js.map +1 -0
  64. package/dist/native/instar-desktop-host +0 -0
  65. package/dist/scaffold/templates.d.ts.map +1 -1
  66. package/dist/scaffold/templates.js +3 -1
  67. package/dist/scaffold/templates.js.map +1 -1
  68. package/dist/server/AgentServer.d.ts +15 -0
  69. package/dist/server/AgentServer.d.ts.map +1 -1
  70. package/dist/server/AgentServer.js +78 -20
  71. package/dist/server/AgentServer.js.map +1 -1
  72. package/dist/server/CapabilityIndex.js +2 -2
  73. package/dist/server/CapabilityIndex.js.map +1 -1
  74. package/dist/server/mobileConversationRoutes.d.ts +16 -3
  75. package/dist/server/mobileConversationRoutes.d.ts.map +1 -1
  76. package/dist/server/mobileConversationRoutes.js +36 -8
  77. package/dist/server/mobileConversationRoutes.js.map +1 -1
  78. package/dist/server/mobilePairingRoutes.d.ts +1 -1
  79. package/dist/server/mobilePairingRoutes.d.ts.map +1 -1
  80. package/dist/server/mobilePairingRoutes.js +5 -2
  81. package/dist/server/mobilePairingRoutes.js.map +1 -1
  82. package/dist/server/mobileSlackRoutes.d.ts +162 -0
  83. package/dist/server/mobileSlackRoutes.d.ts.map +1 -0
  84. package/dist/server/mobileSlackRoutes.js +552 -0
  85. package/dist/server/mobileSlackRoutes.js.map +1 -0
  86. package/dist/server/routes.d.ts +2 -0
  87. package/dist/server/routes.d.ts.map +1 -1
  88. package/dist/server/routes.js +59 -3
  89. package/dist/server/routes.js.map +1 -1
  90. package/package.json +1 -1
  91. package/scripts/build-locked-proof.mjs +125 -0
  92. package/scripts/lib/locked-proof-build.mjs +71 -0
  93. package/scripts/locked-proof/configure-proof-agent.mjs +68 -0
  94. package/scripts/locked-proof/create-proof-user.sh +89 -0
  95. package/scripts/locked-proof/driver.mjs +457 -0
  96. package/scripts/locked-proof/lib.mjs +267 -0
  97. package/scripts/locked-proof/pty-feed.py +59 -0
  98. package/scripts/locked-proof/remove-proof-user.sh +18 -0
  99. package/scripts/locked-proof/reset-attempts.py +52 -0
  100. package/scripts/locked-proof/stage-proof-agents.sh +68 -0
  101. package/src/data/builtin-manifest.json +64 -64
  102. package/src/data/standards-guard-index.json +1 -1
  103. package/src/data/standards-guard-index.meta.json +2 -2
  104. package/src/data/standards-registry.meta.json +1 -1
  105. package/src/scaffold/templates.ts +3 -1
  106. package/upgrades/1.3.1613.md +108 -0
  107. package/upgrades/side-effects/console-partial-survives-reload.eli16.md +5 -0
  108. package/upgrades/side-effects/console-partial-survives-reload.md +34 -0
  109. package/upgrades/side-effects/desktop-tests-stop-touching-tcc.eli16.md +13 -0
  110. package/upgrades/side-effects/desktop-tests-stop-touching-tcc.md +65 -0
  111. package/upgrades/side-effects/held-expiry-one-row-per-topic.eli16.md +5 -0
  112. package/upgrades/side-effects/held-expiry-one-row-per-topic.md +37 -0
  113. package/upgrades/side-effects/locked-proof-driver.md +72 -0
  114. package/upgrades/side-effects/locked-proof-test-build.md +64 -0
  115. package/upgrades/side-effects/locked-security-item-no-telegram.md +78 -0
  116. package/upgrades/side-effects/mobile-native-conversations-inc4.md +115 -0
  117. package/upgrades/side-effects/origin-config-unknown-not-missing.eli16.md +16 -0
  118. package/upgrades/side-effects/origin-config-unknown-not-missing.md +38 -0
  119. package/upgrades/side-effects/prompt-gate-settle-before-relay.eli16.md +11 -0
  120. package/upgrades/side-effects/prompt-gate-settle-before-relay.md +57 -0
@@ -0,0 +1,552 @@
1
+ /**
2
+ * Slack conversations from the Instar app (docs/specs/mobile-native-conversations.md §4.9,
3
+ * increment 4). Device-signed (the read also accepts the agent's Bearer token):
4
+ *
5
+ * GET /mobile/chat/slack/:conversationId/messages?machine=&before=&limit= history (backwards)
6
+ * POST /mobile/chat/slack/:conversationId send {text, requestId, machine}
7
+ *
8
+ * `machine` is the `machine` field of the conversation's list row. Slack ids are local to the
9
+ * machine that minted them, so a request naming another machine is refused (409 wrong-machine)
10
+ * and a request naming none is refused (400 machine-required).
11
+ *
12
+ * `:conversationId` is the machine-local negative durable id the conversation registry minted
13
+ * for the Slack channel or thread ("Durable Conversation Identity"). It is translated on this
14
+ * machine to the registry's canonical key (`slack:<team>:<channel>[:<thread>]`); the message is
15
+ * stored under that key in the app conversation store with its signed origin, and this machine's
16
+ * receipt is a v2 receipt that signs the canonical key, because the alias in the signed path
17
+ * means nothing on another machine.
18
+ *
19
+ * The send keeps the order of §4.2: authenticate → look up → emergency stop → preflight →
20
+ * reserve → persist (fsync, plus a copy in slack-messages.jsonl) → intercepts → dispatch through
21
+ * the same Slack inbound dispatch a Slack message takes, with the operator as sender → delivery
22
+ * event → mirror "📱 <owner> (from the app): …" into the Slack channel → done. A failed mirror
23
+ * never fails or repeats the dispatch (`mirror: "failed"`).
24
+ *
25
+ * Behind `mobilePairing.native.enabled` (the app conversation service): off ⇒ 503. No Slack on
26
+ * this agent ⇒ 503 `slack-not-configured`. `mobilePairing.slackOwnerUserId` unset ⇒ 503
27
+ * `slack-owner-unset` (the owner's Slack identity is a config field, never inferred).
28
+ */
29
+ import crypto from 'node:crypto';
30
+ import { Router } from 'express';
31
+ import { deviceAdmittedAt, isMobileChatEnabled } from './mobilePairingRoutes.js';
32
+ import { requestIdAgeOk, requestIdTime } from '../core/MobileChatRequests.js';
33
+ import { derivedEventId, hideCredentialSpans, removeAuthorityTokens } from '../core/appConversationText.js';
34
+ import { detectOutboundCredential } from '../messaging/outbound-credential-guard.js';
35
+ import { isExactStopMessage } from '../core/MessageSentinel.js';
36
+ import { appOwnerName, buildSignedOrigin, historyRow } from './mobileConversationRoutes.js';
37
+ import { readJsonlTailLastLines } from '../utils/jsonl-tail.js';
38
+ /** The operator's Slack user id (`mobilePairing.slackOwnerUserId`), or null when unset or malformed. */
39
+ export function slackOwnerUserId(config) {
40
+ const v = config.mobilePairing?.slackOwnerUserId;
41
+ return typeof v === 'string' && /^[UW][A-Z0-9]{2,20}$/.test(v) ? v : null;
42
+ }
43
+ /** A strict negative id from the path segment (`-12`, never `-012` or `-0`), else null. */
44
+ export function parseSlackConversationId(raw) {
45
+ if (!/^-[1-9][0-9]{0,17}$/.test(raw))
46
+ return null;
47
+ const n = Number(raw);
48
+ return Number.isSafeInteger(n) ? n : null;
49
+ }
50
+ /** The title the app shows for a Slack conversation: its label, else `#<channel>` (a thread says so). */
51
+ export function slackConversationTitle(c) {
52
+ const base = c.label ? c.label.replace(/[\x00-\x1f\x7f]/g, '').trim().slice(0, 80) : '';
53
+ const name = base || `#${c.channelId}`;
54
+ return c.threadTs ? `${name} (thread)` : name;
55
+ }
56
+ const SEND_RATE_PER_MIN = 20;
57
+ const hashOf = (...parts) => crypto.createHash('sha256').update(parts.join('\n')).digest('hex');
58
+ export function createMobileSlackRouter(deps) {
59
+ const router = Router();
60
+ const now = deps.now ?? Date.now;
61
+ const sendRate = new Map();
62
+ const svc = deps.service;
63
+ const principalDevice = (req) => {
64
+ const p = req.instarPrincipal;
65
+ return p?.kind === 'device' && typeof p.deviceId === 'string' ? p.deviceId : null;
66
+ };
67
+ /**
68
+ * A Slack conversation id is local to the machine that minted it, so every Slack request must
69
+ * name the machine its row came from (`machine` from the list row: a query parameter on the read,
70
+ * a body field on the send, both covered by the device signature). A missing or different
71
+ * machine is refused before anything is read or written: this machine never reads or sends to
72
+ * a conversation that merely shares the number.
73
+ */
74
+ const rightMachine = (res, named) => {
75
+ const self = deps.machineId();
76
+ if (typeof named !== 'string' || !named) {
77
+ res.status(400).json({ error: 'machine-required', detail: 'Name the machine this Slack conversation was listed from.' });
78
+ return false;
79
+ }
80
+ if (named !== self) {
81
+ res.status(409).json({ error: 'wrong-machine', servedBy: self, detail: 'This Slack conversation belongs to another machine. Open it through that machine.' });
82
+ return false;
83
+ }
84
+ return true;
85
+ };
86
+ /** Slack on this agent and the owner's Slack id set, else answered. */
87
+ const slackReady = (res) => {
88
+ const bridge = deps.slack?.() ?? null;
89
+ if (!bridge) {
90
+ res.status(503).json({ error: 'slack-not-configured', detail: 'Slack is not set up on this agent.' });
91
+ return null;
92
+ }
93
+ const owner = slackOwnerUserId(deps.config);
94
+ if (!owner) {
95
+ res.status(503).json({ error: 'slack-owner-unset', detail: 'Your Slack account is not linked to the app yet. Ask the agent to set your Slack user id, then try again.' });
96
+ return null;
97
+ }
98
+ return { bridge, owner };
99
+ };
100
+ // ── History ──
101
+ router.get('/mobile/chat/slack/:conversationId/messages', (req, res) => {
102
+ res.setHeader('Cache-Control', 'no-store');
103
+ if (!deps.pairing.enabled() || !svc) {
104
+ res.status(503).json({ error: 'native-conversations-off', detail: 'App conversations are turned off on this agent.' });
105
+ return;
106
+ }
107
+ const id = parseSlackConversationId(String(req.params.conversationId));
108
+ if (id === null) {
109
+ res.status(400).json({ error: 'bad-conversation' });
110
+ return;
111
+ }
112
+ if (!rightMachine(res, req.query.machine))
113
+ return;
114
+ const ready = slackReady(res);
115
+ if (!ready)
116
+ return;
117
+ const conv = ready.bridge.resolve(id);
118
+ if (!conv) {
119
+ res.status(404).json({ error: 'unknown-conversation' });
120
+ return;
121
+ }
122
+ const limit = Math.max(1, Math.min(100, Number(req.query.limit) || 100));
123
+ const before = typeof req.query.before === 'string' ? req.query.before.split(',') : null;
124
+ const isBefore = (at, eventId) => !before || before.length !== 2 || at < before[0] || (at === before[0] && eventId < before[1]);
125
+ const byId = new Map();
126
+ // App-sent messages from the store, with their verdict (the store is the evidence, never rotated).
127
+ let stored = [];
128
+ try {
129
+ stored = svc.store.browseMessages(conv.key, before ? before.join(',') : null, limit).messages;
130
+ }
131
+ catch {
132
+ stored = [];
133
+ } // @silent-fallback-ok — the Slack rows are still returned
134
+ for (const m of stored) {
135
+ byId.set(m.eventId, { ...historyRow(m, (x) => svc.verify({ ...x, conversationKey: conv.key }), svc), fromUser: m.role === 'operator', senderName: m.role === 'operator' ? appOwnerName(deps.config) : null, via: 'mobile-device' });
136
+ }
137
+ // Slack rows: a row carrying an app eventId is the copy of a stored message (already above);
138
+ // everything else was typed in Slack itself (`none`) or is the agent's reply.
139
+ let rows = [];
140
+ try {
141
+ rows = ready.bridge.history(conv, 1000);
142
+ }
143
+ catch {
144
+ rows = [];
145
+ } // @silent-fallback-ok — the stored rows are still returned
146
+ for (const r of rows) {
147
+ if (r.eventId) {
148
+ if (byId.has(r.eventId))
149
+ continue;
150
+ // Its store event is not on this machine (not yet replicated, or rotated store evidence): "couldn't check".
151
+ const eventId = r.eventId;
152
+ if (!isBefore(r.at, eventId))
153
+ continue;
154
+ byId.set(eventId, { eventId, messageId: r.ts, role: 'operator', fromUser: true, senderName: r.senderName, text: r.text, at: r.at, deliveryState: 'unknown', originVerified: 'unknown', via: 'mobile-device' });
155
+ continue;
156
+ }
157
+ const eventId = `slack:${r.ts}`;
158
+ if (!isBefore(r.at, eventId) || byId.has(eventId))
159
+ continue;
160
+ byId.set(eventId, { eventId, messageId: r.ts, role: r.fromUser ? 'participant' : 'agent', fromUser: r.fromUser, senderName: r.senderName, text: r.text, at: r.at, originVerified: 'none' });
161
+ }
162
+ const cmp = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
163
+ const desc = [...byId.values()].sort((x, y) => cmp(String(y.at), String(x.at)) || cmp(String(y.eventId), String(x.eventId)));
164
+ const page = desc.slice(0, limit);
165
+ const oldest = page[page.length - 1];
166
+ res.json({
167
+ conversationId: id, title: slackConversationTitle(conv), messages: page.reverse(),
168
+ nextBefore: desc.length > limit && oldest ? `${String(oldest.at)},${String(oldest.eventId)}` : null,
169
+ });
170
+ });
171
+ // ── Send ──
172
+ router.post('/mobile/chat/slack/:conversationId', async (req, res) => {
173
+ res.setHeader('Cache-Control', 'no-store');
174
+ if (!deps.pairing.enabled() || !svc) {
175
+ res.status(503).json({ error: 'native-conversations-off', detail: 'App conversations are turned off on this agent.' });
176
+ return;
177
+ }
178
+ const deviceId = principalDevice(req);
179
+ if (!deviceId) {
180
+ res.status(403).json({ error: 'operator-device-required' });
181
+ return;
182
+ }
183
+ const s = svc;
184
+ const requests = s.deps.requests;
185
+ const raw = String(req.params.conversationId);
186
+ const id = parseSlackConversationId(raw);
187
+ if (id === null) {
188
+ res.status(400).json({ error: 'bad-conversation' });
189
+ return;
190
+ }
191
+ const body = (req.body ?? {});
192
+ if (!rightMachine(res, body.machine))
193
+ return;
194
+ if (body.attachments !== undefined) {
195
+ res.status(400).json({ error: 'media-target-unsupported', detail: 'Files can be sent in app conversations. Sending them into Slack is not available yet.' });
196
+ return;
197
+ }
198
+ const text = typeof body.text === 'string' ? body.text.trim() : '';
199
+ if (text.length < 1 || text.length > 4000) {
200
+ res.status(400).json({ error: 'text must be 1-4000 characters' });
201
+ return;
202
+ }
203
+ const requestId = body.requestId;
204
+ if (typeof requestId !== 'string' || requestIdTime(requestId) === null) {
205
+ res.status(400).json({ error: 'bad-request-id' });
206
+ return;
207
+ }
208
+ const hash = hashOf('slack-send', raw, text);
209
+ // The payload hash is part of the seed: an early refusal releases the request id, and a retry
210
+ // with the same id but different text must be a different stored message.
211
+ const seed = `${deviceId}\u0000${requestId}\u0000${hash}`;
212
+ const messageId = derivedEventId('msg', seed);
213
+ const eventId = derivedEventId('op', seed);
214
+ // Step 2 — look up; a done/unknown request answers from the CURRENT delivery state.
215
+ const prior = requests.lookup(deviceId, requestId, hash);
216
+ if (prior.kind === 'done' || prior.kind === 'outcome-unknown') {
217
+ const state = s.store.deliveryState(messageId);
218
+ if (state === 'delivered' || state === 'refused' || state === 'intercepted') {
219
+ const recorded = prior.kind === 'done' ? prior.body : {};
220
+ res.json({ ...recorded, ok: true, conversationId: id, eventId, messageId, deliveryState: state });
221
+ return;
222
+ }
223
+ }
224
+ if (prior.kind === 'done') {
225
+ res.status(prior.status).json(prior.body);
226
+ return;
227
+ }
228
+ if (prior.kind === 'in-progress') {
229
+ res.status(202).json({ state: 'in-progress' });
230
+ return;
231
+ }
232
+ if (prior.kind === 'outcome-unknown') {
233
+ res.status(409).json({ error: 'outcome-unknown', eventId, messageId, detail: 'This message may or may not have reached the agent. Check the conversation.' });
234
+ return;
235
+ }
236
+ if (prior.kind === 'request-id-reused') {
237
+ res.status(409).json({ error: 'payload-conflict', detail: 'This request id was already used for something else.' });
238
+ return;
239
+ }
240
+ const ready = slackReady(res);
241
+ if (!ready)
242
+ return;
243
+ const { bridge, owner } = ready;
244
+ const conv = bridge.resolve(id);
245
+ if (!conv) {
246
+ res.status(404).json({ error: 'unknown-conversation' });
247
+ return;
248
+ }
249
+ if (!bridge.isAuthorized(owner)) {
250
+ res.status(503).json({ error: 'slack-owner-not-authorized', detail: 'The Slack account linked to the app is not one this agent accepts messages from.' });
251
+ return;
252
+ }
253
+ // Step 2a — an exact emergency stop skips the feature setting and the rate limit.
254
+ const exactStop = isExactStopMessage(text);
255
+ if (!exactStop) {
256
+ // Step 3 — preflight (its one effect: scanInbound may decline a leaked pending pairing).
257
+ if (!isMobileChatEnabled(deps.config)) {
258
+ res.status(503).json({ error: 'Chat from the app is turned off on this agent.' });
259
+ return;
260
+ }
261
+ const t = now();
262
+ const recent = (sendRate.get(deviceId) ?? []).filter((x) => t - x < 60_000);
263
+ if (recent.length >= SEND_RATE_PER_MIN) {
264
+ sendRate.set(deviceId, recent);
265
+ res.status(429).json({ error: 'too-many-requests' });
266
+ return;
267
+ }
268
+ recent.push(t);
269
+ sendRate.set(deviceId, recent);
270
+ if (!requestIdAgeOk(requestId, t)) {
271
+ res.status(400).json({ error: 'request-id-too-old' });
272
+ return;
273
+ }
274
+ deps.pairing.scanInbound(text);
275
+ }
276
+ // Slack is dispatched on the serving machine. Refused BEFORE anything is saved, so the app
277
+ // keeps the text and nothing is stored twice (the Telegram chat route's rule).
278
+ if (!bridge.holdsLease()) {
279
+ res.status(409).json({ error: 'not-serving', detail: 'This machine is not receiving messages right now. Try again shortly.' });
280
+ return;
281
+ }
282
+ const removed = removeAuthorityTokens(text);
283
+ const delivered = removed.text;
284
+ const credentialShaped = detectOutboundCredential(text).detected;
285
+ const extras = {
286
+ ...(removed.kinds.length > 0 ? { redacted: true, removed: removed.kinds } : {}),
287
+ ...(credentialShaped ? { credentialShaped: true } : {}),
288
+ };
289
+ const receivedAt = new Date(deviceAdmittedAt(req) ?? now()).toISOString();
290
+ const signed = buildSignedOrigin(req, deps.pairing, deviceId, delivered, removed.kinds, s.deps.signer ?? null, receivedAt, (detail) => s.deps.reportDegradation?.('MobileSlack.sign', detail), undefined, conv.key);
291
+ const msg = {
292
+ eventId, kind: 'message', conversationKey: conv.key, messageId, role: 'operator', text: delivered,
293
+ at: receivedAt, machineId: s.deps.machineId(), receivedAt,
294
+ ...(signed.origin ? { origin: signed.origin } : {}), ...(signed.receipt ? { receipt: signed.receipt } : {}),
295
+ };
296
+ // Step 4 — reserve, then persist (fsync) BEFORE dispatch.
297
+ let r;
298
+ try {
299
+ r = requests.reserve(deviceId, requestId, hash, 0, { op: 'send', conversationKey: conv.key, messageId });
300
+ }
301
+ catch {
302
+ res.status(503).json({ error: 'chat-unavailable', detail: 'The message could not be recorded, so it was not sent. Try again.' });
303
+ return;
304
+ }
305
+ if (r.kind === 'full') {
306
+ res.status(429).json({ error: 'too-many-requests' });
307
+ return;
308
+ }
309
+ if (r.kind !== 'reserved') {
310
+ if (r.kind === 'in-progress')
311
+ res.status(202).json({ state: 'in-progress' });
312
+ else if (r.kind === 'done')
313
+ res.status(r.status).json(r.body);
314
+ else
315
+ res.status(409).json({ error: r.kind === 'request-id-reused' ? 'payload-conflict' : 'outcome-unknown' });
316
+ return;
317
+ }
318
+ try {
319
+ s.store.append(msg);
320
+ }
321
+ catch (err) {
322
+ requests.release(deviceId, requestId);
323
+ s.deps.reportDegradation?.('MobileSlack.persist', err instanceof Error ? err.message : String(err));
324
+ res.status(503).json({ error: 'chat-unavailable', detail: 'The message could not be saved, so it was not sent. Try again.' });
325
+ return;
326
+ }
327
+ const ownerName = appOwnerName(deps.config);
328
+ // The copy for the Slack history view (best-effort: the store above is the evidence).
329
+ try {
330
+ bridge.logAppMessage(conv, { messageId: `app-${messageId}`, text: delivered, senderName: ownerName, ownerUserId: owner, eventId, deviceId });
331
+ }
332
+ catch (err) {
333
+ s.deps.reportDegradation?.('MobileSlack.log', err instanceof Error ? err.message : String(err));
334
+ }
335
+ const delivery = (state) => {
336
+ try {
337
+ s.appendDelivery(conv.key, messageId, state, seed);
338
+ }
339
+ catch (err) {
340
+ s.deps.reportDegradation?.('MobileSlack.delivery', err instanceof Error ? err.message : String(err));
341
+ }
342
+ };
343
+ const finish = (status, b) => {
344
+ if (!requests.finish(deviceId, requestId, { status, body: b }))
345
+ s.deps.reportDegradation?.('MobileSlack.requestStore', 'could not record a finished request');
346
+ res.status(status).json(b);
347
+ };
348
+ const mirror = async () => {
349
+ try {
350
+ // A copy for people reading the channel: credential-shaped spans always hidden (§4.9).
351
+ await bridge.post(conv, `📱 ${ownerName} (from the app): ${hideCredentialSpans(delivered)}`);
352
+ return 'sent';
353
+ }
354
+ catch (err) {
355
+ s.deps.reportDegradation?.('MobileSlack.mirror', err instanceof Error ? err.message : String(err));
356
+ return 'failed';
357
+ }
358
+ };
359
+ if (exactStop) {
360
+ const stop = bridge.emergencyStop();
361
+ delivery('intercepted');
362
+ finish(200, { ok: true, outcome: 'sentinel-kill', stopped: stop.stopped, conversationId: id, eventId, messageId, deliveryState: 'intercepted', ...extras });
363
+ return;
364
+ }
365
+ if (deps.sentinel && delivered) {
366
+ try {
367
+ const d = await deps.sentinel.decideInboundDisposition(delivered, id);
368
+ if (d.disposition === 'kill' || d.disposition === 'pause') {
369
+ const out = d.disposition === 'kill' ? { outcome: 'sentinel-kill', stopped: bridge.emergencyStop().stopped } : { outcome: 'sentinel-pause', paused: bridge.pause(conv) };
370
+ delivery('intercepted');
371
+ finish(200, { ok: true, ...out, conversationId: id, eventId, messageId, deliveryState: 'intercepted', ...extras });
372
+ return;
373
+ }
374
+ }
375
+ catch { /* @silent-fallback-ok — FAIL-OPEN: a classifier error routes the message normally, as on the Slack path */ }
376
+ }
377
+ let outcome;
378
+ try {
379
+ outcome = await bridge.dispatch({ conv, text: delivered, ownerName, ownerUserId: owner, messageId, originVerdict: s.verify(msg) });
380
+ }
381
+ catch (err) {
382
+ delivery('unknown');
383
+ requests.markUnknown(deviceId, requestId);
384
+ s.deps.reportDegradation?.('MobileSlack.dispatch', err instanceof Error ? err.message : String(err));
385
+ res.status(409).json({ error: 'outcome-unknown', eventId, messageId, detail: 'This message may or may not have reached the agent. Check the conversation.' });
386
+ return;
387
+ }
388
+ if (outcome === 'refused') {
389
+ // Nothing was handed to a session: an honest refusal, not an unknown outcome. No mirror.
390
+ delivery('refused');
391
+ finish(503, { error: 'chat-unavailable', detail: 'Your message is saved, but this machine cannot start a session for it right now.', conversationId: id, eventId, messageId, deliveryState: 'refused', ...extras });
392
+ return;
393
+ }
394
+ // A queued message (durable inbound custody) has no delivery event yet: it reads `pending`.
395
+ if (outcome === 'delivered')
396
+ delivery('delivered');
397
+ const mirrored = await mirror();
398
+ finish(200, { ok: true, outcome, conversationId: id, eventId, messageId, deliveryState: outcome === 'delivered' ? 'delivered' : 'pending', mirror: mirrored, ...extras });
399
+ });
400
+ return router;
401
+ }
402
+ /** Rows of slack-messages.jsonl read from its tail (bounded: the newest 5000 lines within 8 MiB). */
403
+ const LOG_TAIL_LINES = 5000;
404
+ const LOG_TAIL_BYTES = 8 * 1024 * 1024;
405
+ function routingKeyOf(channelId, threadTs) { return threadTs ? `${channelId}:${threadTs}` : channelId; }
406
+ /** Whether a Slack row (its own ts and thread ts) belongs to this conversation. */
407
+ function inConversation(conv, ts, threadTs) {
408
+ if (conv.threadTs)
409
+ return threadTs === conv.threadTs || ts === conv.threadTs;
410
+ return !threadTs || threadTs === ts;
411
+ }
412
+ export function buildMobileSlackBridge(d) {
413
+ const now = d.now ?? Date.now;
414
+ const tail = () => {
415
+ let lines = [];
416
+ try {
417
+ lines = readTail(d.adapter.getLogPath());
418
+ }
419
+ catch {
420
+ lines = [];
421
+ } // @silent-fallback-ok — a missing or unreadable log means no Slack rows; the store's rows remain
422
+ const out = [];
423
+ for (const l of lines) {
424
+ try {
425
+ out.push(JSON.parse(l));
426
+ }
427
+ catch { /* @silent-fallback-ok — a torn line is skipped */ }
428
+ }
429
+ return out;
430
+ };
431
+ const toConv = (key, e) => ({
432
+ id: e.id, key, channelId: e.channelId, threadTs: e.threadTs, label: e.label ?? null, mintedAt: e.mintedAt ?? null,
433
+ });
434
+ let activityCache = null;
435
+ return {
436
+ resolve(id) {
437
+ const r = d.registry.resolve(id);
438
+ if (!r || r.platform !== 'slack' || r.origin === 'replicated' || typeof r.key !== 'string' || typeof r.channelId !== 'string' || typeof r.id !== 'number')
439
+ return null;
440
+ // An alias resolves to its target; the app keeps using the id it was given.
441
+ const listed = d.registry.list({ platform: 'slack', limit: 5000 }).find((x) => x.entry.id === r.id);
442
+ return { id, key: r.key, channelId: r.channelId, threadTs: r.threadTs ?? null, label: r.label ?? null, mintedAt: listed?.entry.mintedAt ?? null };
443
+ },
444
+ conversations() {
445
+ return d.registry.list({ platform: 'slack', limit: 500 })
446
+ .filter((x) => x.entry.origin !== 'replicated')
447
+ .map((x) => toConv(x.key, x.entry));
448
+ },
449
+ history(conv, limit) {
450
+ const out = new Map();
451
+ for (const row of tail()) {
452
+ if (row.channelId !== conv.channelId)
453
+ continue;
454
+ const ts = String(row.messageId ?? '');
455
+ if (!ts)
456
+ continue;
457
+ const threadTs = typeof row.threadTs === 'string' ? row.threadTs : null;
458
+ // An app copy names its thread on the row; Slack rows written before increment 4 have no
459
+ // thread field, so a thread conversation shows only rows that say they belong to it.
460
+ if (!inConversation(conv, ts, threadTs))
461
+ continue;
462
+ if (typeof row.text !== 'string' || typeof row.timestamp !== 'string')
463
+ continue;
464
+ out.set(ts, {
465
+ ts, text: row.text, fromUser: row.fromUser === true, at: row.timestamp,
466
+ senderName: typeof row.senderName === 'string' ? row.senderName : null,
467
+ ...(typeof row.eventId === 'string' && row.eventId ? { eventId: row.eventId } : {}),
468
+ });
469
+ }
470
+ // The in-memory ring adds what the API fetched after a restart (it includes the bot's own messages).
471
+ const bot = d.adapter.getBotUserId?.() ?? null;
472
+ try {
473
+ for (const m of d.adapter.getChannelMessages(conv.channelId, 200)) {
474
+ if (out.has(m.ts) || !inConversation(conv, m.ts, m.thread_ts ?? null))
475
+ continue;
476
+ const secs = Number(m.ts);
477
+ if (!Number.isFinite(secs))
478
+ continue;
479
+ out.set(m.ts, { ts: m.ts, text: m.text, fromUser: !(bot && m.user === bot), at: new Date(secs * 1000).toISOString(), senderName: null });
480
+ }
481
+ }
482
+ catch { /* @silent-fallback-ok — the log rows remain */ }
483
+ return [...out.values()].sort((a, b) => (a.at < b.at ? -1 : a.at > b.at ? 1 : 0)).slice(-limit);
484
+ },
485
+ lastActivity() {
486
+ if (activityCache && now() - activityCache.at < 10_000)
487
+ return activityCache.map;
488
+ const map = new Map();
489
+ for (const row of tail()) {
490
+ if (typeof row.channelId !== 'string' || typeof row.timestamp !== 'string' || typeof row.text !== 'string')
491
+ continue;
492
+ const ts = String(row.messageId ?? '');
493
+ const threadTs = typeof row.threadTs === 'string' && row.threadTs !== ts ? row.threadTs : null;
494
+ const k = routingKeyOf(row.channelId, threadTs);
495
+ const cur = map.get(k);
496
+ if (!cur || row.timestamp >= cur.at)
497
+ map.set(k, { at: row.timestamp, preview: row.text.slice(0, 140) });
498
+ }
499
+ activityCache = { at: now(), map };
500
+ return map;
501
+ },
502
+ async dispatch(input) {
503
+ const fn = d.dispatch();
504
+ if (!fn)
505
+ return 'refused';
506
+ const ts = `app-${input.messageId}`;
507
+ const r = await fn({
508
+ id: ts, userId: input.ownerUserId, content: input.text,
509
+ channel: { type: 'slack', identifier: input.conv.channelId },
510
+ receivedAt: new Date(now()).toISOString(),
511
+ metadata: {
512
+ slackUserId: input.ownerUserId, senderName: input.ownerName, ts, channelId: input.conv.channelId,
513
+ ...(input.conv.threadTs ? { threadTs: input.conv.threadTs } : {}),
514
+ isDM: input.conv.channelId.startsWith('D'), appOrigin: input.originVerdict,
515
+ },
516
+ });
517
+ return r ?? 'delivered';
518
+ },
519
+ async post(conv, text) {
520
+ await d.adapter.sendToChannel(conv.channelId, text, conv.threadTs ? { thread_ts: conv.threadTs } : undefined);
521
+ },
522
+ logAppMessage(conv, row) {
523
+ d.adapter.logMessage({ messageId: row.messageId, channelId: conv.channelId, threadTs: conv.threadTs, text: row.text, fromUser: true, senderName: row.senderName, platformUserId: row.ownerUserId, eventId: row.eventId, deviceId: row.deviceId });
524
+ activityCache = null;
525
+ },
526
+ emergencyStop() { return { stopped: d.killAllSessions() }; },
527
+ pause(conv) {
528
+ const session = d.adapter.getSessionForChannel(routingKeyOf(conv.channelId, conv.threadTs));
529
+ if (!session)
530
+ return false;
531
+ try {
532
+ d.sendEscape(session);
533
+ return true;
534
+ }
535
+ catch {
536
+ return false;
537
+ } // @silent-fallback-ok — reported as paused:false
538
+ },
539
+ isAuthorized(userId) { return d.adapter.isAuthorized(userId); },
540
+ holdsLease() { return d.holdsLease(); },
541
+ };
542
+ }
543
+ function readTail(p) { return readJsonlTailLastLines(p, LOG_TAIL_LINES, LOG_TAIL_BYTES); }
544
+ /** The unified-list rows for every local Slack conversation (§4.9). */
545
+ export function slackListRows(bridge) {
546
+ const act = bridge.lastActivity();
547
+ return bridge.conversations().map((c) => {
548
+ const a = act.get(routingKeyOf(c.channelId, c.threadTs));
549
+ return { id: c.id, title: slackConversationTitle(c), lastActivity: a?.at ?? c.mintedAt, lastPreview: a?.preview ?? null };
550
+ });
551
+ }
552
+ //# sourceMappingURL=mobileSlackRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobileSlackRoutes.js","sourceRoot":"","sources":["../../src/server/mobileSlackRoutes.ts"],"names":[],"mappings":"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"}
@@ -273,6 +273,8 @@ export interface RouteContext {
273
273
  * the route 503s (governor not initialized on this build). */
274
274
  selfActionGovernor?: import('../monitoring/selfaction/governor.js').SelfActionGovernorCore | null;
275
275
  telegram: TelegramAdapter | null;
276
+ /** Attention list kept when there is no Telegram adapter (LocalAttentionItems). */
277
+ localAttention?: import('../core/LocalAttentionItems.js').LocalAttentionItems | null;
276
278
  relationships: RelationshipManager | null;
277
279
  feedback: FeedbackManager | null;
278
280
  dispatches: DispatchManager | null;