@intentface/latch-channels 0.9.1

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 (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +27 -0
  3. package/dist/ask.d.ts +69 -0
  4. package/dist/ask.d.ts.map +1 -0
  5. package/dist/ask.js +94 -0
  6. package/dist/ask.js.map +1 -0
  7. package/dist/commands.d.ts +41 -0
  8. package/dist/commands.d.ts.map +1 -0
  9. package/dist/commands.js +54 -0
  10. package/dist/commands.js.map +1 -0
  11. package/dist/index.d.ts +19 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +19 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/kernel.d.ts +207 -0
  16. package/dist/kernel.d.ts.map +1 -0
  17. package/dist/kernel.js +883 -0
  18. package/dist/kernel.js.map +1 -0
  19. package/dist/render.d.ts +43 -0
  20. package/dist/render.d.ts.map +1 -0
  21. package/dist/render.js +192 -0
  22. package/dist/render.js.map +1 -0
  23. package/dist/slack/api.d.ts +207 -0
  24. package/dist/slack/api.d.ts.map +1 -0
  25. package/dist/slack/api.js +249 -0
  26. package/dist/slack/api.js.map +1 -0
  27. package/dist/slack/blocks.d.ts +36 -0
  28. package/dist/slack/blocks.d.ts.map +1 -0
  29. package/dist/slack/blocks.js +161 -0
  30. package/dist/slack/blocks.js.map +1 -0
  31. package/dist/slack/ids.d.ts +40 -0
  32. package/dist/slack/ids.d.ts.map +1 -0
  33. package/dist/slack/ids.js +47 -0
  34. package/dist/slack/ids.js.map +1 -0
  35. package/dist/slack/index.d.ts +24 -0
  36. package/dist/slack/index.d.ts.map +1 -0
  37. package/dist/slack/index.js +18 -0
  38. package/dist/slack/index.js.map +1 -0
  39. package/dist/slack/manifest.d.ts +23 -0
  40. package/dist/slack/manifest.d.ts.map +1 -0
  41. package/dist/slack/manifest.js +102 -0
  42. package/dist/slack/manifest.js.map +1 -0
  43. package/dist/slack/normalize.d.ts +35 -0
  44. package/dist/slack/normalize.d.ts.map +1 -0
  45. package/dist/slack/normalize.js +63 -0
  46. package/dist/slack/normalize.js.map +1 -0
  47. package/dist/slack/payloads.d.ts +36 -0
  48. package/dist/slack/payloads.d.ts.map +1 -0
  49. package/dist/slack/payloads.js +80 -0
  50. package/dist/slack/payloads.js.map +1 -0
  51. package/dist/slack/slackChannel.d.ts +152 -0
  52. package/dist/slack/slackChannel.d.ts.map +1 -0
  53. package/dist/slack/slackChannel.js +650 -0
  54. package/dist/slack/slackChannel.js.map +1 -0
  55. package/dist/slack/stream.d.ts +88 -0
  56. package/dist/slack/stream.d.ts.map +1 -0
  57. package/dist/slack/stream.js +418 -0
  58. package/dist/slack/stream.js.map +1 -0
  59. package/dist/slack/verify.d.ts +20 -0
  60. package/dist/slack/verify.d.ts.map +1 -0
  61. package/dist/slack/verify.js +32 -0
  62. package/dist/slack/verify.js.map +1 -0
  63. package/dist/telegram/api.d.ts +110 -0
  64. package/dist/telegram/api.d.ts.map +1 -0
  65. package/dist/telegram/api.js +170 -0
  66. package/dist/telegram/api.js.map +1 -0
  67. package/dist/telegram/format.d.ts +26 -0
  68. package/dist/telegram/format.d.ts.map +1 -0
  69. package/dist/telegram/format.js +56 -0
  70. package/dist/telegram/format.js.map +1 -0
  71. package/dist/telegram/html.d.ts +11 -0
  72. package/dist/telegram/html.d.ts.map +1 -0
  73. package/dist/telegram/html.js +35 -0
  74. package/dist/telegram/html.js.map +1 -0
  75. package/dist/telegram/index.d.ts +15 -0
  76. package/dist/telegram/index.d.ts.map +1 -0
  77. package/dist/telegram/index.js +15 -0
  78. package/dist/telegram/index.js.map +1 -0
  79. package/dist/telegram/stream.d.ts +59 -0
  80. package/dist/telegram/stream.d.ts.map +1 -0
  81. package/dist/telegram/stream.js +185 -0
  82. package/dist/telegram/stream.js.map +1 -0
  83. package/dist/telegram/telegramChannel.d.ts +136 -0
  84. package/dist/telegram/telegramChannel.d.ts.map +1 -0
  85. package/dist/telegram/telegramChannel.js +277 -0
  86. package/dist/telegram/telegramChannel.js.map +1 -0
  87. package/dist/telegram/verify.d.ts +7 -0
  88. package/dist/telegram/verify.d.ts.map +1 -0
  89. package/dist/telegram/verify.js +14 -0
  90. package/dist/telegram/verify.js.map +1 -0
  91. package/dist/types.d.ts +240 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +12 -0
  94. package/dist/types.js.map +1 -0
  95. package/dist/whatsapp/api.d.ts +59 -0
  96. package/dist/whatsapp/api.d.ts.map +1 -0
  97. package/dist/whatsapp/api.js +154 -0
  98. package/dist/whatsapp/api.js.map +1 -0
  99. package/dist/whatsapp/index.d.ts +13 -0
  100. package/dist/whatsapp/index.d.ts.map +1 -0
  101. package/dist/whatsapp/index.js +13 -0
  102. package/dist/whatsapp/index.js.map +1 -0
  103. package/dist/whatsapp/verify.d.ts +17 -0
  104. package/dist/whatsapp/verify.d.ts.map +1 -0
  105. package/dist/whatsapp/verify.js +32 -0
  106. package/dist/whatsapp/verify.js.map +1 -0
  107. package/dist/whatsapp/whatsappChannel.d.ts +104 -0
  108. package/dist/whatsapp/whatsappChannel.d.ts.map +1 -0
  109. package/dist/whatsapp/whatsappChannel.js +217 -0
  110. package/dist/whatsapp/whatsappChannel.js.map +1 -0
  111. package/package.json +68 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slackChannel.js","sourceRoot":"","sources":["../../src/slack/slackChannel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * The streaming renderer: fold a run's `RenderEvent`s into ONE live Slack
3
+ * message via the native streaming API, with tool calls as task cards.
4
+ *
5
+ * First renderable event → `chat.startStream` (channels need
6
+ * `recipient_team_id`); text buffers and flushes as `appendStream` every
7
+ * ~500ms; tool-start/end and reasoning become `task_update` chunks (reasoning
8
+ * is ONE collapsed "Thinking" task — never streamed as raw text);
9
+ * finish → `stopStream` with any trailing text and an error section if the
10
+ * run failed.
11
+ *
12
+ * Stop is two signals, either wins: `appendStream` throwing `stopped_by_user`
13
+ * (the viewer pressed Slack's native Stop button on THIS message) and the
14
+ * host-backed `shouldStop` poll (a stop that landed on another instance).
15
+ * Stopping cancels the event iterator — the adapter's run keeps completing
16
+ * server-side; we just stop rendering it.
17
+ *
18
+ * If `startStream` itself fails (surface doesn't support it, missing recipient,
19
+ * restricted workspace) or the stream dies mid-turn, the turn degrades to the
20
+ * FALLBACK engine: buffer everything and post the finished answer ONCE at the
21
+ * end. Never edit-to-mimic — a message that looks like it's streaming must BE
22
+ * streaming. A stream that died mid-turn is deleted (its stranded task cards
23
+ * would otherwise render as ⚠️ forever) and the full text arrives in the
24
+ * final post instead.
25
+ *
26
+ * The streamed message holds up to `maxStreamedChars`; anything past it lands
27
+ * in a follow-up message of native `markdown` blocks, so a long answer is
28
+ * never silently truncated.
29
+ */
30
+ import type { RenderEvent } from "../types.js";
31
+ import { type SlackClient } from "./api.js";
32
+ export interface SlackStreamOptions {
33
+ api: Pick<SlackClient, "startStream" | "appendStream" | "stopStream" | "postMessage" | "deleteMessage">;
34
+ channel: string;
35
+ /** Thread to render into; omit for an un-threaded DM reply. */
36
+ threadTs?: string;
37
+ /** REQUIRED by Slack to stream in a channel; harmless in a DM. */
38
+ recipientTeamId?: string;
39
+ recipientUserId?: string;
40
+ /** Cross-instance stop flag (host-backed); polled once per flush tick. */
41
+ shouldStop?: () => Promise<boolean>;
42
+ /**
43
+ * Called when the engine is decided — `stream`, or `fallback` with Slack's
44
+ * refusal code/detail — and AGAIN if a live stream dies mid-turn (the turn
45
+ * then finishes as `fallback`). Hosts surface the last value (binding
46
+ * health) so a degraded bot is diagnosable without log spelunking.
47
+ */
48
+ onStreamMode?: (info: {
49
+ mode: "stream" | "fallback";
50
+ code?: string;
51
+ detail?: string;
52
+ }) => void | Promise<void>;
53
+ /**
54
+ * Title for tool events whose stream carries no name — an approval RESUME
55
+ * only replays the tool's output event (the call happened in the parked
56
+ * turn), so the name lookup comes back empty and the task card would read
57
+ * "Using ". Callers that know the resumed tool pass it here.
58
+ */
59
+ resumedToolName?: string;
60
+ /**
61
+ * Best-effort free-text status next to the bot's name ("is thinking…",
62
+ * "is using web_search…"). Renders in assistant/DM surfaces only; the host
63
+ * wires it to the LEGACY assistant.threads.setStatus (free text has no
64
+ * agents.sessions equivalent) — revisit before Slack's Feb 2027 sunset.
65
+ */
66
+ setStatus?: (text: string) => void | Promise<void>;
67
+ flushIntervalMs?: number;
68
+ /** Text budget of the streamed message itself; the rest overflows. */
69
+ maxStreamedChars?: number;
70
+ /** Injectable clock/sleep for tests. */
71
+ now?: () => number;
72
+ sleep?: (ms: number) => Promise<void>;
73
+ }
74
+ export interface SlackStreamResult {
75
+ /** The full accumulated answer text (pre-overflow-split). */
76
+ text: string;
77
+ errorMessage?: string;
78
+ /** ts of the streamed (or fallback) message, once one exists. */
79
+ ts?: string;
80
+ /** The viewer stopped the response. */
81
+ stopped?: boolean;
82
+ /** Which engine rendered the turn. `none` = nothing was ever posted. */
83
+ mode: "stream" | "fallback" | "none";
84
+ /** Follow-up messages posted for text past the streamed budget. */
85
+ overflowTs?: string[];
86
+ }
87
+ export declare function renderSlackStream(events: AsyncIterable<RenderEvent>, opts: SlackStreamOptions): Promise<SlackStreamResult>;
88
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/slack/stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAiB,KAAK,WAAW,EAAoB,MAAM,UAAU,CAAC;AAG7E,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,IAAI,CACP,WAAW,EACX,aAAa,GAAG,cAAc,GAAG,YAAY,GAAG,aAAa,GAAG,eAAe,CAChF,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QACpB,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAC;QAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wCAAwC;IACxC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wEAAwE;IACxE,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;IACrC,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAgCD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,EAClC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,iBAAiB,CAAC,CA8W5B"}
@@ -0,0 +1,418 @@
1
+ /**
2
+ * The streaming renderer: fold a run's `RenderEvent`s into ONE live Slack
3
+ * message via the native streaming API, with tool calls as task cards.
4
+ *
5
+ * First renderable event → `chat.startStream` (channels need
6
+ * `recipient_team_id`); text buffers and flushes as `appendStream` every
7
+ * ~500ms; tool-start/end and reasoning become `task_update` chunks (reasoning
8
+ * is ONE collapsed "Thinking" task — never streamed as raw text);
9
+ * finish → `stopStream` with any trailing text and an error section if the
10
+ * run failed.
11
+ *
12
+ * Stop is two signals, either wins: `appendStream` throwing `stopped_by_user`
13
+ * (the viewer pressed Slack's native Stop button on THIS message) and the
14
+ * host-backed `shouldStop` poll (a stop that landed on another instance).
15
+ * Stopping cancels the event iterator — the adapter's run keeps completing
16
+ * server-side; we just stop rendering it.
17
+ *
18
+ * If `startStream` itself fails (surface doesn't support it, missing recipient,
19
+ * restricted workspace) or the stream dies mid-turn, the turn degrades to the
20
+ * FALLBACK engine: buffer everything and post the finished answer ONCE at the
21
+ * end. Never edit-to-mimic — a message that looks like it's streaming must BE
22
+ * streaming. A stream that died mid-turn is deleted (its stranded task cards
23
+ * would otherwise render as ⚠️ forever) and the full text arrives in the
24
+ * final post instead.
25
+ *
26
+ * The streamed message holds up to `maxStreamedChars`; anything past it lands
27
+ * in a follow-up message of native `markdown` blocks, so a long answer is
28
+ * never silently truncated.
29
+ */
30
+ import { SlackApiError } from "./api.js";
31
+ import { errorBlocks, markdownBlocks, notificationText } from "./blocks.js";
32
+ const MAX_APPEND_CHARS = 12_000; // per-call markdown_text cap
33
+ const TASK_TITLE_LIMIT = 250; // Slack caps task chunks at 256 chars
34
+ const REASONING_TASK_ID = "reasoning";
35
+ const STOPPED_NOTICE = "\n\n_Stopped._";
36
+ const defaultSleep = (ms) => new Promise((r) => setTimeout(r, ms));
37
+ const clip = (s, n) => (s.length > n ? `${s.slice(0, n - 1)}…` : s);
38
+ function taskChunk(id, title, status) {
39
+ return { type: "task_update", id, title: clip(title, TASK_TITLE_LIMIT), status };
40
+ }
41
+ /** True when this error means "the viewer pressed Stop", not "the call failed". */
42
+ function isStoppedByUser(e) {
43
+ return e instanceof SlackApiError && e.code === "stopped_by_user";
44
+ }
45
+ /** The streamed message is gone or already finalized — appends can never land. */
46
+ function isDeadStream(e) {
47
+ return (e instanceof SlackApiError &&
48
+ (e.code === "message_not_in_streaming_state" || e.code === "message_not_found"));
49
+ }
50
+ export async function renderSlackStream(events, opts) {
51
+ const now = opts.now ?? Date.now;
52
+ const sleep = opts.sleep ?? defaultSleep;
53
+ const maxStreamed = opts.maxStreamedChars ?? MAX_APPEND_CHARS;
54
+ let flushInterval = opts.flushIntervalMs ?? 500;
55
+ let mode = "none";
56
+ let text = ""; // everything the model said
57
+ let streamedChars = 0; // how much of it the streamed message holds
58
+ let pendingText = ""; // accumulated, not yet flushed
59
+ let pendingChunks = [];
60
+ let ts;
61
+ let errorMessage;
62
+ let stopped = false;
63
+ let reasoningOpen = false;
64
+ let lastFlushAt = 0;
65
+ let flushDue = false; // tool/reasoning transitions force the next flush
66
+ // Tasks still in_progress. A stream closed with open tasks renders them as
67
+ // warnings (⚠️) — a parked approval must settle its card instead.
68
+ const openTasks = new Map();
69
+ const threadArgs = opts.threadTs ? { thread_ts: opts.threadTs } : {};
70
+ function queueTask(id, title, st) {
71
+ pendingChunks.push(taskChunk(id, title, st));
72
+ if (st === "in_progress")
73
+ openTasks.set(id, title);
74
+ else
75
+ openTasks.delete(id);
76
+ }
77
+ /** Settle whatever is still open (approval-parked turns end mid-task). */
78
+ function settleOpenTasks() {
79
+ for (const [id, title] of openTasks)
80
+ pendingChunks.push(taskChunk(id, title, "complete"));
81
+ openTasks.clear();
82
+ }
83
+ /** Close the collapsed "Thinking" task the moment something visible happens. */
84
+ function closeReasoning() {
85
+ if (!reasoningOpen)
86
+ return;
87
+ reasoningOpen = false;
88
+ queueTask(REASONING_TASK_ID, "Thinking", "complete");
89
+ }
90
+ // AWAITED, not fire-and-forget: on serverless the platform's waitUntil
91
+ // tracks the turn promise — a detached telemetry write can lose the race
92
+ // with function freeze on a short turn.
93
+ const reportMode = async (info) => {
94
+ try {
95
+ await opts.onStreamMode?.(info);
96
+ }
97
+ catch (e) {
98
+ console.error("[slack] stream-mode telemetry failed:", e);
99
+ }
100
+ };
101
+ const status = (text) => {
102
+ void Promise.resolve(opts.setStatus?.(text)).catch(() => { });
103
+ };
104
+ async function start() {
105
+ try {
106
+ const r = await opts.api.startStream({
107
+ channel: opts.channel,
108
+ ...threadArgs,
109
+ ...(opts.recipientTeamId ? { recipient_team_id: opts.recipientTeamId } : {}),
110
+ ...(opts.recipientUserId ? { recipient_user_id: opts.recipientUserId } : {}),
111
+ });
112
+ ts = r.ts;
113
+ mode = "stream";
114
+ await reportMode({ mode: "stream" });
115
+ }
116
+ catch (e) {
117
+ if (isStoppedByUser(e)) {
118
+ stopped = true;
119
+ return;
120
+ }
121
+ console.error("[slack] startStream unavailable — will post the answer at finish:", e);
122
+ mode = "fallback";
123
+ const err = e instanceof SlackApiError ? e : undefined;
124
+ await reportMode({
125
+ mode: "fallback",
126
+ ...(err?.code ? { code: err.code } : {}),
127
+ ...(err?.detail ? { detail: err.detail } : {}),
128
+ });
129
+ }
130
+ }
131
+ /** Streamed-mode flush: send pending text (within budget) + queued chunks. */
132
+ async function flushStream() {
133
+ if (!ts)
134
+ return;
135
+ // Respect the streamed-message budget; the remainder overflows at finish.
136
+ const room = Math.max(0, maxStreamed - streamedChars);
137
+ const sendText = pendingText.slice(0, Math.min(room, MAX_APPEND_CHARS));
138
+ const chunks = pendingChunks;
139
+ if (!sendText && !chunks.length)
140
+ return;
141
+ try {
142
+ await opts.api.appendStream({
143
+ channel: opts.channel,
144
+ ts,
145
+ ...(sendText ? { markdown_text: sendText } : {}),
146
+ ...(chunks.length ? { chunks } : {}),
147
+ });
148
+ streamedChars += sendText.length;
149
+ // Drop exactly what went out; anything the budget refused stays pending
150
+ // so the finish-time overflow message still carries it.
151
+ pendingText = pendingText.slice(sendText.length);
152
+ pendingChunks = [];
153
+ lastFlushAt = now();
154
+ }
155
+ catch (e) {
156
+ if (isStoppedByUser(e)) {
157
+ stopped = true;
158
+ return;
159
+ }
160
+ if (isDeadStream(e)) {
161
+ // Slack expires an idle stream (e.g. while the model thinks after a
162
+ // tool result). Retrying into a corpse loses the whole answer — flip
163
+ // to the fallback engine, which posts the FULL text once at finish.
164
+ // The corpse is deleted: it can never be finalized, so its open task
165
+ // cards would render as ⚠️ forever, and its partial text would
166
+ // duplicate the final post's.
167
+ console.error("[slack] stream expired mid-turn — will post the answer at finish:", e);
168
+ const corpse = ts;
169
+ mode = "fallback";
170
+ ts = undefined;
171
+ await reportMode({ mode: "fallback", code: e.code ?? "dead_stream" });
172
+ if (corpse) {
173
+ await opts.api
174
+ .deleteMessage({ channel: opts.channel, ts: corpse })
175
+ .catch((e2) => console.error("[slack] dead-stream cleanup failed:", e2));
176
+ }
177
+ return;
178
+ }
179
+ if (e instanceof SlackApiError && e.status === 429) {
180
+ // The client already honored one Retry-After; be gentler for the rest
181
+ // of the turn. Nothing is lost — the buffer coalesces.
182
+ flushInterval = Math.min(flushInterval * 2, 8000);
183
+ console.error("[slack] appendStream rate-limited; slowing to", flushInterval, "ms");
184
+ return;
185
+ }
186
+ console.error("[slack] appendStream failed (will retry on next flush):", e);
187
+ }
188
+ }
189
+ /**
190
+ * Fallback engine: nothing renders mid-turn — the finished answer posts
191
+ * ONCE here. No chat.update, ever: a message that looks like it's
192
+ * streaming must BE streaming.
193
+ */
194
+ async function postFallbackFinal() {
195
+ if (!text.trim() && !errorMessage)
196
+ return;
197
+ const all = markdownBlocks(text);
198
+ const blocks = all.slice(0, 8);
199
+ if (all.length > blocks.length) {
200
+ blocks.push({
201
+ type: "markdown",
202
+ text: "_Answer truncated for Slack — the full turn is available in Latch._",
203
+ });
204
+ }
205
+ if (errorMessage)
206
+ blocks.push(...errorBlocks(errorMessage));
207
+ const r = await opts.api.postMessage({
208
+ channel: opts.channel,
209
+ ...threadArgs,
210
+ blocks,
211
+ text: notificationText(text || errorMessage || "Answer"),
212
+ });
213
+ ts = r.ts;
214
+ }
215
+ async function maybeFlush() {
216
+ const due = flushDue || now() - lastFlushAt >= flushInterval;
217
+ const hasWork = pendingText.length > 0 || pendingChunks.length > 0;
218
+ if (!hasWork || (!due && mode !== "none"))
219
+ return;
220
+ if (mode === "none") {
221
+ // Create the message promptly on first content; then throttle.
222
+ await start();
223
+ if (stopped)
224
+ return;
225
+ }
226
+ flushDue = false;
227
+ if (opts.shouldStop && (await opts.shouldStop())) {
228
+ stopped = true;
229
+ return;
230
+ }
231
+ if (mode === "stream") {
232
+ await flushStream();
233
+ }
234
+ else {
235
+ // Fallback: nothing renders mid-turn. Mark the tick so the stop poll
236
+ // above keeps its cadence instead of running on every event.
237
+ lastFlushAt = now();
238
+ }
239
+ }
240
+ for await (const ev of events) {
241
+ switch (ev.type) {
242
+ case "text-delta":
243
+ closeReasoning();
244
+ text += ev.text;
245
+ pendingText += ev.text;
246
+ break;
247
+ case "reasoning-delta":
248
+ // Never render reasoning text — one collapsed task tells the story.
249
+ if (!reasoningOpen) {
250
+ reasoningOpen = true;
251
+ queueTask(REASONING_TASK_ID, "Thinking", "in_progress");
252
+ status("is thinking…");
253
+ flushDue = true;
254
+ }
255
+ break;
256
+ case "tool-start": {
257
+ closeReasoning();
258
+ const name = ev.toolName || opts.resumedToolName || "tool";
259
+ queueTask(ev.toolCallId, `Using ${name}`, "in_progress");
260
+ status(`is using ${name}…`);
261
+ flushDue = true;
262
+ break;
263
+ }
264
+ case "tool-end": {
265
+ const name = ev.toolName || opts.resumedToolName || "tool";
266
+ queueTask(ev.toolCallId, `Using ${name}`, ev.error ? "error" : "complete");
267
+ status("");
268
+ flushDue = true;
269
+ break;
270
+ }
271
+ case "error":
272
+ errorMessage = ev.message;
273
+ continue;
274
+ default:
275
+ continue;
276
+ }
277
+ await maybeFlush();
278
+ if (stopped)
279
+ break;
280
+ }
281
+ // ── Finalize ───────────────────────────────────────────────────────────────
282
+ closeReasoning();
283
+ settleOpenTasks();
284
+ status("");
285
+ // `mode` is only ever assigned inside the closures above; read it through a
286
+ // function so control-flow narrowing doesn't freeze it at the initial "none".
287
+ const modeNow = () => mode;
288
+ if (stopped) {
289
+ if (modeNow() === "stream" && ts) {
290
+ await opts.api
291
+ .stopStream({ channel: opts.channel, ts, markdown_text: STOPPED_NOTICE })
292
+ .catch(() => {
293
+ /* the stop already landed user-side; closing is best-effort */
294
+ });
295
+ }
296
+ const res = { text, mode, stopped: true };
297
+ if (ts !== undefined)
298
+ res.ts = ts;
299
+ if (errorMessage !== undefined)
300
+ res.errorMessage = errorMessage;
301
+ return res;
302
+ }
303
+ // A run that produced neither text nor tool activity (approval-parked runs
304
+ // do this) never opened a message — only surface a hard error.
305
+ if (modeNow() === "none") {
306
+ if (pendingText || pendingChunks.length)
307
+ await start();
308
+ if (modeNow() === "none") {
309
+ if (errorMessage) {
310
+ const r = await opts.api.postMessage({
311
+ channel: opts.channel,
312
+ ...threadArgs,
313
+ blocks: errorBlocks(errorMessage),
314
+ text: notificationText(errorMessage),
315
+ });
316
+ return { text, errorMessage, ts: r.ts, mode: "none" };
317
+ }
318
+ const res = { text, mode: "none" };
319
+ if (errorMessage !== undefined)
320
+ res.errorMessage = errorMessage;
321
+ return res;
322
+ }
323
+ }
324
+ if (modeNow() === "fallback") {
325
+ // Honor a stop that landed while nothing was rendering.
326
+ if (opts.shouldStop && (await opts.shouldStop())) {
327
+ const res = { text, mode, stopped: true };
328
+ if (errorMessage !== undefined)
329
+ res.errorMessage = errorMessage;
330
+ return res;
331
+ }
332
+ await postFallbackFinal();
333
+ const res = { text, mode };
334
+ if (ts !== undefined)
335
+ res.ts = ts;
336
+ if (errorMessage !== undefined)
337
+ res.errorMessage = errorMessage;
338
+ return res;
339
+ }
340
+ // Streamed mode: close with trailing text (within budget) and error.
341
+ const room = Math.max(0, maxStreamed - streamedChars);
342
+ const tail = pendingText.slice(0, Math.min(room, MAX_APPEND_CHARS));
343
+ const overflow = pendingText.slice(tail.length);
344
+ const finalBlocks = [];
345
+ if (errorMessage)
346
+ finalBlocks.push(...errorBlocks(errorMessage));
347
+ const stopArgs = {
348
+ channel: opts.channel,
349
+ ts: ts,
350
+ ...(tail ? { markdown_text: tail } : {}),
351
+ ...(pendingChunks.length ? { chunks: pendingChunks } : {}),
352
+ ...(finalBlocks.length ? { blocks: finalBlocks } : {}),
353
+ };
354
+ let tailDelivered = false;
355
+ try {
356
+ await opts.api.stopStream(stopArgs);
357
+ tailDelivered = true;
358
+ }
359
+ catch (e) {
360
+ if (isStoppedByUser(e)) {
361
+ tailDelivered = true; // the viewer cut it off — nothing owed
362
+ }
363
+ else if (!isDeadStream(e)) {
364
+ // One more try after a beat for transient failures.
365
+ await sleep(1000);
366
+ tailDelivered = await opts.api.stopStream(stopArgs).then(() => true, (e2) => {
367
+ // The viewer stopping between the two attempts is a delivery
368
+ // verdict, not a failure — never post the tail they refused.
369
+ if (isStoppedByUser(e2))
370
+ return true;
371
+ console.error("[slack] stopStream failed twice:", e2);
372
+ return false;
373
+ });
374
+ }
375
+ else {
376
+ console.error("[slack] stream already expired at close:", e);
377
+ }
378
+ }
379
+ // The tail (text the stream never delivered) must NEVER vanish: if the
380
+ // close failed, post it as a regular message. Degraded, but it arrives.
381
+ if (!tailDelivered && (tail || finalBlocks.length)) {
382
+ await opts.api
383
+ .postMessage({
384
+ channel: opts.channel,
385
+ ...threadArgs,
386
+ blocks: [...(tail ? markdownBlocks(tail) : []), ...finalBlocks],
387
+ text: notificationText(tail || errorMessage || "Answer"),
388
+ })
389
+ .catch((e) => console.error("[slack] tail recovery post failed:", e));
390
+ }
391
+ const overflowTs = [];
392
+ if (overflow) {
393
+ const blocks = markdownBlocks(overflow);
394
+ const capped = blocks.slice(0, 8);
395
+ if (blocks.length > capped.length) {
396
+ capped.push({
397
+ type: "markdown",
398
+ text: "_Answer truncated for Slack — the full turn is available in Latch._",
399
+ });
400
+ }
401
+ const r = await opts.api.postMessage({
402
+ channel: opts.channel,
403
+ ...threadArgs,
404
+ blocks: capped,
405
+ text: notificationText(overflow),
406
+ });
407
+ overflowTs.push(r.ts);
408
+ }
409
+ const res = { text, mode };
410
+ if (ts !== undefined)
411
+ res.ts = ts;
412
+ if (errorMessage !== undefined)
413
+ res.errorMessage = errorMessage;
414
+ if (overflowTs.length)
415
+ res.overflowTs = overflowTs;
416
+ return res;
417
+ }
418
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/slack/stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Verify a Slack request signature (the standard signing-secret scheme).
3
+ *
4
+ * basestring = `v0:{timestamp}:{rawBody}`
5
+ * expected = `v0=` + hex(HMAC_SHA256(signingSecret, basestring))
6
+ * compare constant-time against the `x-slack-signature` header
7
+ *
8
+ * Also rejects stale timestamps (replay) outside `maxSkewSeconds` (default 5m,
9
+ * Slack's recommendation). `rawBody` MUST be the exact bytes Slack sent — read
10
+ * the request body as text once and pass it here (and reuse it for parsing).
11
+ */
12
+ export declare function verifySlackSignature(opts: {
13
+ signingSecret: string;
14
+ rawBody: string;
15
+ signature: string | null;
16
+ timestamp: string | null;
17
+ now?: number;
18
+ maxSkewSeconds?: number;
19
+ }): boolean;
20
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/slack/verify.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAkBV"}
@@ -0,0 +1,32 @@
1
+ import { createHmac, timingSafeEqual } from "node:crypto";
2
+ /**
3
+ * Verify a Slack request signature (the standard signing-secret scheme).
4
+ *
5
+ * basestring = `v0:{timestamp}:{rawBody}`
6
+ * expected = `v0=` + hex(HMAC_SHA256(signingSecret, basestring))
7
+ * compare constant-time against the `x-slack-signature` header
8
+ *
9
+ * Also rejects stale timestamps (replay) outside `maxSkewSeconds` (default 5m,
10
+ * Slack's recommendation). `rawBody` MUST be the exact bytes Slack sent — read
11
+ * the request body as text once and pass it here (and reuse it for parsing).
12
+ */
13
+ export function verifySlackSignature(opts) {
14
+ const { signingSecret, rawBody, signature, timestamp } = opts;
15
+ if (!signature || !timestamp)
16
+ return false;
17
+ const ts = Number(timestamp);
18
+ if (!Number.isFinite(ts))
19
+ return false;
20
+ const nowSec = Math.floor((opts.now ?? Date.now()) / 1000);
21
+ const skew = opts.maxSkewSeconds ?? 300;
22
+ if (Math.abs(nowSec - ts) > skew)
23
+ return false;
24
+ const expected = `v0=${createHmac("sha256", signingSecret)
25
+ .update(`v0:${timestamp}:${rawBody}`)
26
+ .digest("hex")}`;
27
+ // Constant-time compare; lengths must match for timingSafeEqual.
28
+ const a = Buffer.from(expected);
29
+ const b = Buffer.from(signature);
30
+ return a.length === b.length && timingSafeEqual(a, b);
31
+ }
32
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/slack/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAOpC;IACC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAC9D,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAE3C,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,IAAI,GAAG,CAAC;IACxC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,IAAI;QAAE,OAAO,KAAK,CAAC;IAE/C,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,aAAa,CAAC;SACvD,MAAM,CAAC,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;SACpC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAEnB,iEAAiE;IACjE,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxD,CAAC"}