@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.
- package/LICENSE +21 -0
- package/README.md +27 -0
- package/dist/ask.d.ts +69 -0
- package/dist/ask.d.ts.map +1 -0
- package/dist/ask.js +94 -0
- package/dist/ask.js.map +1 -0
- package/dist/commands.d.ts +41 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +54 -0
- package/dist/commands.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel.d.ts +207 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +883 -0
- package/dist/kernel.js.map +1 -0
- package/dist/render.d.ts +43 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +192 -0
- package/dist/render.js.map +1 -0
- package/dist/slack/api.d.ts +207 -0
- package/dist/slack/api.d.ts.map +1 -0
- package/dist/slack/api.js +249 -0
- package/dist/slack/api.js.map +1 -0
- package/dist/slack/blocks.d.ts +36 -0
- package/dist/slack/blocks.d.ts.map +1 -0
- package/dist/slack/blocks.js +161 -0
- package/dist/slack/blocks.js.map +1 -0
- package/dist/slack/ids.d.ts +40 -0
- package/dist/slack/ids.d.ts.map +1 -0
- package/dist/slack/ids.js +47 -0
- package/dist/slack/ids.js.map +1 -0
- package/dist/slack/index.d.ts +24 -0
- package/dist/slack/index.d.ts.map +1 -0
- package/dist/slack/index.js +18 -0
- package/dist/slack/index.js.map +1 -0
- package/dist/slack/manifest.d.ts +23 -0
- package/dist/slack/manifest.d.ts.map +1 -0
- package/dist/slack/manifest.js +102 -0
- package/dist/slack/manifest.js.map +1 -0
- package/dist/slack/normalize.d.ts +35 -0
- package/dist/slack/normalize.d.ts.map +1 -0
- package/dist/slack/normalize.js +63 -0
- package/dist/slack/normalize.js.map +1 -0
- package/dist/slack/payloads.d.ts +36 -0
- package/dist/slack/payloads.d.ts.map +1 -0
- package/dist/slack/payloads.js +80 -0
- package/dist/slack/payloads.js.map +1 -0
- package/dist/slack/slackChannel.d.ts +152 -0
- package/dist/slack/slackChannel.d.ts.map +1 -0
- package/dist/slack/slackChannel.js +650 -0
- package/dist/slack/slackChannel.js.map +1 -0
- package/dist/slack/stream.d.ts +88 -0
- package/dist/slack/stream.d.ts.map +1 -0
- package/dist/slack/stream.js +418 -0
- package/dist/slack/stream.js.map +1 -0
- package/dist/slack/verify.d.ts +20 -0
- package/dist/slack/verify.d.ts.map +1 -0
- package/dist/slack/verify.js +32 -0
- package/dist/slack/verify.js.map +1 -0
- package/dist/telegram/api.d.ts +110 -0
- package/dist/telegram/api.d.ts.map +1 -0
- package/dist/telegram/api.js +170 -0
- package/dist/telegram/api.js.map +1 -0
- package/dist/telegram/format.d.ts +26 -0
- package/dist/telegram/format.d.ts.map +1 -0
- package/dist/telegram/format.js +56 -0
- package/dist/telegram/format.js.map +1 -0
- package/dist/telegram/html.d.ts +11 -0
- package/dist/telegram/html.d.ts.map +1 -0
- package/dist/telegram/html.js +35 -0
- package/dist/telegram/html.js.map +1 -0
- package/dist/telegram/index.d.ts +15 -0
- package/dist/telegram/index.d.ts.map +1 -0
- package/dist/telegram/index.js +15 -0
- package/dist/telegram/index.js.map +1 -0
- package/dist/telegram/stream.d.ts +59 -0
- package/dist/telegram/stream.d.ts.map +1 -0
- package/dist/telegram/stream.js +185 -0
- package/dist/telegram/stream.js.map +1 -0
- package/dist/telegram/telegramChannel.d.ts +136 -0
- package/dist/telegram/telegramChannel.d.ts.map +1 -0
- package/dist/telegram/telegramChannel.js +277 -0
- package/dist/telegram/telegramChannel.js.map +1 -0
- package/dist/telegram/verify.d.ts +7 -0
- package/dist/telegram/verify.d.ts.map +1 -0
- package/dist/telegram/verify.js +14 -0
- package/dist/telegram/verify.js.map +1 -0
- package/dist/types.d.ts +240 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/dist/whatsapp/api.d.ts +59 -0
- package/dist/whatsapp/api.d.ts.map +1 -0
- package/dist/whatsapp/api.js +154 -0
- package/dist/whatsapp/api.js.map +1 -0
- package/dist/whatsapp/index.d.ts +13 -0
- package/dist/whatsapp/index.d.ts.map +1 -0
- package/dist/whatsapp/index.js +13 -0
- package/dist/whatsapp/index.js.map +1 -0
- package/dist/whatsapp/verify.d.ts +17 -0
- package/dist/whatsapp/verify.d.ts.map +1 -0
- package/dist/whatsapp/verify.js +32 -0
- package/dist/whatsapp/verify.js.map +1 -0
- package/dist/whatsapp/whatsappChannel.d.ts +104 -0
- package/dist/whatsapp/whatsappChannel.d.ts.map +1 -0
- package/dist/whatsapp/whatsappChannel.js +217 -0
- package/dist/whatsapp/whatsappChannel.js.map +1 -0
- 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"}
|