@open-everywhere/provider-slack 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent/access/slack-attachment-fetch.ts +2 -1
- package/agent/app-manifest.ts +15 -1
- package/agent/channels/slack-agent-session.ts +249 -0
- package/agent/channels/slack-attachments.ts +20 -11
- package/agent/channels/slack-bot-ask.ts +101 -0
- package/agent/channels/slack-commands.ts +178 -17
- package/agent/channels/slack-context.ts +0 -5
- package/agent/channels/slack-events.ts +110 -33
- package/agent/channels/slack-follow-ups.ts +148 -0
- package/agent/channels/slack-friendly-names.ts +55 -0
- package/agent/channels/slack-front.ts +262 -27
- package/agent/channels/slack-home.ts +9 -3
- package/agent/channels/slack-identity.ts +9 -1
- package/agent/channels/slack-memory-canvas.ts +197 -54
- package/agent/channels/slack-origin-codec.ts +9 -0
- package/agent/channels/slack-post-arm.ts +68 -11
- package/agent/channels/slack-read.ts +27 -2
- package/agent/channels/slack-reply-blocks.ts +180 -0
- package/agent/channels/slack-reply-feedback.ts +75 -0
- package/agent/channels/slack-shortcut.ts +1 -1
- package/agent/channels/slack-voice-clips.ts +82 -0
- package/agent/channels/slack-wake-backscroll.ts +0 -5
- package/agent/channels/slack-web-api.ts +4 -2
- package/agent/channels/slack.ts +81 -19
- package/agent/docs-generated.ts +1282 -2
- package/agent/ops.ts +14 -21
- package/agent/register.ts +25 -0
- package/agent/setup/credentials.ts +17 -0
- package/agent/setup/page.ts +6 -3
- package/agent/surface-parity.ts +2 -0
- package/dist/agent/access/slack-attachment-fetch.d.ts.map +1 -1
- package/dist/agent/access/slack-attachment-fetch.js.map +1 -1
- package/dist/agent/app-manifest.d.ts.map +1 -1
- package/dist/agent/app-manifest.js +15 -1
- package/dist/agent/app-manifest.js.map +1 -1
- package/dist/agent/channels/slack-agent-session.d.ts +81 -0
- package/dist/agent/channels/slack-agent-session.d.ts.map +1 -0
- package/dist/agent/channels/slack-agent-session.js +198 -0
- package/dist/agent/channels/slack-agent-session.js.map +1 -0
- package/dist/agent/channels/slack-attachments.d.ts +11 -0
- package/dist/agent/channels/slack-attachments.d.ts.map +1 -1
- package/dist/agent/channels/slack-attachments.js +21 -14
- package/dist/agent/channels/slack-attachments.js.map +1 -1
- package/dist/agent/channels/slack-bot-ask.d.ts +30 -0
- package/dist/agent/channels/slack-bot-ask.d.ts.map +1 -0
- package/dist/agent/channels/slack-bot-ask.js +91 -0
- package/dist/agent/channels/slack-bot-ask.js.map +1 -0
- package/dist/agent/channels/slack-commands.d.ts +113 -10
- package/dist/agent/channels/slack-commands.d.ts.map +1 -1
- package/dist/agent/channels/slack-commands.js +151 -18
- package/dist/agent/channels/slack-commands.js.map +1 -1
- package/dist/agent/channels/slack-context.d.ts +1 -2
- package/dist/agent/channels/slack-context.d.ts.map +1 -1
- package/dist/agent/channels/slack-context.js +0 -4
- package/dist/agent/channels/slack-context.js.map +1 -1
- package/dist/agent/channels/slack-events.d.ts +47 -97
- package/dist/agent/channels/slack-events.d.ts.map +1 -1
- package/dist/agent/channels/slack-events.js +90 -22
- package/dist/agent/channels/slack-events.js.map +1 -1
- package/dist/agent/channels/slack-follow-ups.d.ts +44 -0
- package/dist/agent/channels/slack-follow-ups.d.ts.map +1 -0
- package/dist/agent/channels/slack-follow-ups.js +129 -0
- package/dist/agent/channels/slack-follow-ups.js.map +1 -0
- package/dist/agent/channels/slack-friendly-names.d.ts +10 -0
- package/dist/agent/channels/slack-friendly-names.d.ts.map +1 -0
- package/dist/agent/channels/slack-friendly-names.js +45 -0
- package/dist/agent/channels/slack-friendly-names.js.map +1 -0
- package/dist/agent/channels/slack-front.d.ts +38 -46
- package/dist/agent/channels/slack-front.d.ts.map +1 -1
- package/dist/agent/channels/slack-front.js +230 -23
- package/dist/agent/channels/slack-front.js.map +1 -1
- package/dist/agent/channels/slack-home.d.ts.map +1 -1
- package/dist/agent/channels/slack-home.js +10 -3
- package/dist/agent/channels/slack-home.js.map +1 -1
- package/dist/agent/channels/slack-identity.d.ts +7 -21
- package/dist/agent/channels/slack-identity.d.ts.map +1 -1
- package/dist/agent/channels/slack-identity.js +3 -1
- package/dist/agent/channels/slack-identity.js.map +1 -1
- package/dist/agent/channels/slack-memory-canvas.d.ts +21 -5
- package/dist/agent/channels/slack-memory-canvas.d.ts.map +1 -1
- package/dist/agent/channels/slack-memory-canvas.js +166 -55
- package/dist/agent/channels/slack-memory-canvas.js.map +1 -1
- package/dist/agent/channels/slack-origin-codec.d.ts.map +1 -1
- package/dist/agent/channels/slack-origin-codec.js +10 -0
- package/dist/agent/channels/slack-origin-codec.js.map +1 -1
- package/dist/agent/channels/slack-post-arm.d.ts +21 -1
- package/dist/agent/channels/slack-post-arm.d.ts.map +1 -1
- package/dist/agent/channels/slack-post-arm.js +57 -10
- package/dist/agent/channels/slack-post-arm.js.map +1 -1
- package/dist/agent/channels/slack-read.d.ts +11 -1
- package/dist/agent/channels/slack-read.d.ts.map +1 -1
- package/dist/agent/channels/slack-read.js +27 -3
- package/dist/agent/channels/slack-read.js.map +1 -1
- package/dist/agent/channels/slack-reply-blocks.d.ts +29 -0
- package/dist/agent/channels/slack-reply-blocks.d.ts.map +1 -0
- package/dist/agent/channels/slack-reply-blocks.js +172 -0
- package/dist/agent/channels/slack-reply-blocks.js.map +1 -0
- package/dist/agent/channels/slack-reply-feedback.d.ts +23 -0
- package/dist/agent/channels/slack-reply-feedback.d.ts.map +1 -0
- package/dist/agent/channels/slack-reply-feedback.js +63 -0
- package/dist/agent/channels/slack-reply-feedback.js.map +1 -0
- package/dist/agent/channels/slack-shortcut.d.ts +10 -0
- package/dist/agent/channels/slack-shortcut.d.ts.map +1 -1
- package/dist/agent/channels/slack-shortcut.js +1 -1
- package/dist/agent/channels/slack-shortcut.js.map +1 -1
- package/dist/agent/channels/slack-voice-clips.d.ts +16 -0
- package/dist/agent/channels/slack-voice-clips.d.ts.map +1 -0
- package/dist/agent/channels/slack-voice-clips.js +80 -0
- package/dist/agent/channels/slack-voice-clips.js.map +1 -0
- package/dist/agent/channels/slack-wake-backscroll.d.ts +0 -2
- package/dist/agent/channels/slack-wake-backscroll.d.ts.map +1 -1
- package/dist/agent/channels/slack-wake-backscroll.js +0 -4
- package/dist/agent/channels/slack-wake-backscroll.js.map +1 -1
- package/dist/agent/channels/slack-web-api.d.ts.map +1 -1
- package/dist/agent/channels/slack-web-api.js +4 -2
- package/dist/agent/channels/slack-web-api.js.map +1 -1
- package/dist/agent/channels/slack.d.ts +22 -1
- package/dist/agent/channels/slack.d.ts.map +1 -1
- package/dist/agent/channels/slack.js +70 -16
- package/dist/agent/channels/slack.js.map +1 -1
- package/dist/agent/docs-generated.d.ts.map +1 -1
- package/dist/agent/docs-generated.js +1282 -2
- package/dist/agent/docs-generated.js.map +1 -1
- package/dist/agent/ops.d.ts +1 -1
- package/dist/agent/ops.d.ts.map +1 -1
- package/dist/agent/ops.js +15 -21
- package/dist/agent/ops.js.map +1 -1
- package/dist/agent/register.d.ts.map +1 -1
- package/dist/agent/register.js +22 -1
- package/dist/agent/register.js.map +1 -1
- package/dist/agent/setup/credentials.d.ts +12 -0
- package/dist/agent/setup/credentials.d.ts.map +1 -1
- package/dist/agent/setup/credentials.js +17 -0
- package/dist/agent/setup/credentials.js.map +1 -1
- package/dist/agent/setup/page.d.ts.map +1 -1
- package/dist/agent/setup/page.js +6 -3
- package/dist/agent/setup/page.js.map +1 -1
- package/dist/agent/surface-parity.d.ts.map +1 -1
- package/dist/agent/surface-parity.js +2 -0
- package/dist/agent/surface-parity.js.map +1 -1
- package/package.json +40 -3
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// slack-follow-ups — a press on a suggested follow-up under an agent answer (OPE-2516).
|
|
2
|
+
//
|
|
3
|
+
// An answer in a 1:1 DM (the side panel included) can carry up to three follow-up buttons
|
|
4
|
+
// (slack-reply-blocks.ts). Slack sends a press to the interactivity URL as a signed `block_actions`
|
|
5
|
+
// payload whose action id starts `oe_followup:` and whose value is the button's text. The front route
|
|
6
|
+
// classifies it (`slack-front.ts`, FrontDecision `followup-click`), runs the tenant fence, and then:
|
|
7
|
+
// 1. marks the answer as answered: `chat.update` removes the button row and adds one line,
|
|
8
|
+
// "↳ You asked: <text>", so the conversation shows what the person sent and no second press
|
|
9
|
+
// can follow ({@link markFollowUpPressed});
|
|
10
|
+
// 2. wakes the DM seat with the text as the person's next message ({@link followUpMessageEvent}),
|
|
11
|
+
// through the SAME `scheduleDmWake` road a typed DM takes — every gate on that road applies.
|
|
12
|
+
//
|
|
13
|
+
// 🔴 ONLY A 1:1 DM. A press counts only in a `D…` conversation, where the app and ONE person are the
|
|
14
|
+
// only members, so the presser is the person the answer addressed. The choke point shows the buttons
|
|
15
|
+
// nowhere else; this check is the backstop for a payload that names another conversation.
|
|
16
|
+
//
|
|
17
|
+
// 🔴 THE TEXT IS THE BUTTON'S OWN LABEL. Slack signs the payload and sends a `block_actions` only for
|
|
18
|
+
// a block this app posted, so the value is the text this app wrote under the answer and the person
|
|
19
|
+
// saw on the button. Core drops any follow-up too long to show whole, or holding a character that
|
|
20
|
+
// draws nothing (`reply-follow-ups.ts`), and the parse below refuses both again.
|
|
21
|
+
import { slackForm } from "./slack-events.js";
|
|
22
|
+
import { SLACK_FOLLOW_UP_ACTION_PREFIX, SLACK_FOLLOW_UP_BLOCK_ID, SLACK_INVISIBLE_CHARACTER } from "./slack-reply-blocks.js";
|
|
23
|
+
import { slackTsFromMs } from "./slack-shortcut.js";
|
|
24
|
+
import { slackInteractivityTenantIds } from "./slack-tenant-fence.js";
|
|
25
|
+
/** The longest value a press may carry: core's follow-up cap. A longer value is not one of ours. */
|
|
26
|
+
const FOLLOW_UP_VALUE_MAX = 75;
|
|
27
|
+
const obj = (v) => (typeof v === "object" && v !== null ? v : undefined);
|
|
28
|
+
const str = (v) => (typeof v === "string" && v.length > 0 ? v : undefined);
|
|
29
|
+
/**
|
|
30
|
+
* Parse a decoded interactivity payload into a follow-up press, or `undefined` when it is not one: not
|
|
31
|
+
* a `block_actions`, no `oe_followup:` action, an empty or over-long value, a conversation that is not
|
|
32
|
+
* a 1:1 DM, or a missing user, channel or message. Pure and total: it never throws.
|
|
33
|
+
*/
|
|
34
|
+
export function parseSlackFollowUpClick(payload) {
|
|
35
|
+
const p = obj(payload);
|
|
36
|
+
if (p?.type !== "block_actions" || !Array.isArray(p.actions))
|
|
37
|
+
return undefined;
|
|
38
|
+
const action = p.actions.map(obj).find((a) => typeof a?.action_id === "string" && a.action_id.startsWith(SLACK_FOLLOW_UP_ACTION_PREFIX));
|
|
39
|
+
if (action === undefined)
|
|
40
|
+
return undefined;
|
|
41
|
+
const text = str(action.value)?.trim();
|
|
42
|
+
if (text === undefined || text.length === 0 || Array.from(text).length > FOLLOW_UP_VALUE_MAX)
|
|
43
|
+
return undefined;
|
|
44
|
+
// A value with a control or format character holds words no button shows, so it is not one of ours.
|
|
45
|
+
if (SLACK_INVISIBLE_CHARACTER.test(text))
|
|
46
|
+
return undefined;
|
|
47
|
+
const userId = str(obj(p.user)?.id);
|
|
48
|
+
const channelId = str(obj(p.channel)?.id) ?? str(obj(p.container)?.channel_id);
|
|
49
|
+
const message = obj(p.message);
|
|
50
|
+
const messageTs = str(message?.ts) ?? str(obj(p.container)?.message_ts);
|
|
51
|
+
if (userId === undefined || channelId === undefined || messageTs === undefined)
|
|
52
|
+
return undefined;
|
|
53
|
+
if (!channelId.startsWith("D"))
|
|
54
|
+
return undefined;
|
|
55
|
+
const threadTs = str(message?.thread_ts) ?? str(obj(p.container)?.thread_ts);
|
|
56
|
+
const { teamId, enterpriseId } = slackInteractivityTenantIds(p);
|
|
57
|
+
const blocks = Array.isArray(message?.blocks) ? message.blocks : undefined;
|
|
58
|
+
const messageText = str(message?.text);
|
|
59
|
+
return {
|
|
60
|
+
text,
|
|
61
|
+
userId,
|
|
62
|
+
channelId,
|
|
63
|
+
messageTs,
|
|
64
|
+
// A top-level answer names itself as its own thread root on some payloads: that is no thread.
|
|
65
|
+
...(threadTs !== undefined && threadTs !== messageTs ? { threadTs } : {}),
|
|
66
|
+
...(teamId === undefined ? {} : { teamId }),
|
|
67
|
+
...(enterpriseId === undefined ? {} : { enterpriseId }),
|
|
68
|
+
...(blocks === undefined ? {} : { blocks }),
|
|
69
|
+
...(messageText === undefined ? {} : { messageText }),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* The press as the person's next DM message. The ts is minted from the clock, as a global shortcut's
|
|
74
|
+
* is, because no Slack message stands behind the press. The thread is the answer's thread, so the
|
|
75
|
+
* answer to the follow-up lands where the answer it follows sits.
|
|
76
|
+
*/
|
|
77
|
+
export function followUpMessageEvent(click, nowMs = Date.now()) {
|
|
78
|
+
return {
|
|
79
|
+
channelId: click.channelId,
|
|
80
|
+
ts: slackTsFromMs(nowMs),
|
|
81
|
+
...(click.threadTs === undefined ? {} : { threadTs: click.threadTs }),
|
|
82
|
+
...(click.teamId === undefined ? {} : { teamId: click.teamId }),
|
|
83
|
+
...(click.enterpriseId === undefined ? {} : { enterpriseId: click.enterpriseId }),
|
|
84
|
+
userId: click.userId,
|
|
85
|
+
channelType: "im",
|
|
86
|
+
text: click.text,
|
|
87
|
+
// The person chose these words by pressing them, so they are the person's own text.
|
|
88
|
+
authoredText: click.text,
|
|
89
|
+
isAppMention: false,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/** The dedupe key of one press: one answer takes one press, so a double press or a redelivery wakes once. */
|
|
93
|
+
export function followUpPressKey(click) {
|
|
94
|
+
return `slack-followup:${click.channelId}:${click.messageTs}`;
|
|
95
|
+
}
|
|
96
|
+
/** The line that replaces the buttons once the person pressed one. Plain text: it draws no mention. */
|
|
97
|
+
export function followUpPressedLine(text) {
|
|
98
|
+
return `↳ You asked: ${text}`;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* The answer's blocks after a press: the follow-up row removed, and one context line naming what the
|
|
102
|
+
* person sent. `undefined` when the blocks hold no follow-up row — then there is nothing to rewrite.
|
|
103
|
+
*/
|
|
104
|
+
export function blocksAfterFollowUp(blocks, text) {
|
|
105
|
+
const kept = blocks.filter((b) => obj(b)?.block_id !== SLACK_FOLLOW_UP_BLOCK_ID);
|
|
106
|
+
if (kept.length === blocks.length)
|
|
107
|
+
return undefined;
|
|
108
|
+
return [...kept, { type: "context", elements: [{ type: "plain_text", text: followUpPressedLine(text), emoji: true }] }];
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Rewrite the answer after a press (see the header). Answers whether Slack took the rewrite. Never
|
|
112
|
+
* throws: a refused rewrite costs only the line, never the person's message, which wakes regardless.
|
|
113
|
+
*/
|
|
114
|
+
export async function markFollowUpPressed(click, form = slackForm) {
|
|
115
|
+
try {
|
|
116
|
+
const blocks = click.blocks === undefined ? undefined : blocksAfterFollowUp(click.blocks, click.text);
|
|
117
|
+
if (blocks === undefined)
|
|
118
|
+
return false;
|
|
119
|
+
const body = new URLSearchParams({ channel: click.channelId, ts: click.messageTs, blocks: JSON.stringify(blocks) });
|
|
120
|
+
if (click.messageText !== undefined)
|
|
121
|
+
body.set("text", click.messageText);
|
|
122
|
+
const res = await form("chat.update", body.toString());
|
|
123
|
+
return res?.ok === true;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=slack-follow-ups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-follow-ups.js","sourceRoot":"","sources":["../../../agent/channels/slack-follow-ups.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FriendlyNameResolver } from "@open-everywhere/core/agent/adapter-api.js";
|
|
2
|
+
/** The lookups the resolver uses. Live code passes none; a test injects each. */
|
|
3
|
+
export interface SlackFriendlyNameDeps {
|
|
4
|
+
readonly userName?: (id: string) => Promise<string | undefined>;
|
|
5
|
+
readonly channelName?: (id: string) => Promise<string | undefined>;
|
|
6
|
+
readonly teamName?: (id: string) => Promise<string | undefined>;
|
|
7
|
+
}
|
|
8
|
+
/** Build the Slack resolver. */
|
|
9
|
+
export declare function slackFriendlyNameResolver(deps?: SlackFriendlyNameDeps): FriendlyNameResolver;
|
|
10
|
+
//# sourceMappingURL=slack-friendly-names.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-friendly-names.d.ts","sourceRoot":"","sources":["../../../agent/channels/slack-friendly-names.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAIvF,iFAAiF;AACjF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAChE,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACnE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACjE;AAmBD,gCAAgC;AAChC,wBAAgB,yBAAyB,CAAC,IAAI,GAAE,qBAA0B,GAAG,oBAAoB,CAgBhG"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// slack-friendly-names — the Slack name resolver for the friendly-names guard (OPE-2482).
|
|
2
|
+
//
|
|
3
|
+
// The guard (core `channels/friendly-outbound.ts`) asks this resolver for a display name before it
|
|
4
|
+
// renders a raw Slack id in text a person reads. A member id answers the person's display name, a
|
|
5
|
+
// channel id answers `#name`, and the workspace id answers the install's recorded team name. Every
|
|
6
|
+
// lookup rides a cache that already exists (`users.info`, `conversations.info`), so a name costs one
|
|
7
|
+
// Slack call per id per instance. Any failure answers undefined: the id then renders as a mention or
|
|
8
|
+
// plain words, never as itself.
|
|
9
|
+
import { fetchChannelDisplayName, fetchUserDisplayName } from "./slack-events.js";
|
|
10
|
+
import { slackInstallState } from "../setup/install-state.js";
|
|
11
|
+
// The install record is read at most once per TEAM_NAME_TTL_MS, and only a FOUND name is kept: a post
|
|
12
|
+
// path must not read the store per message, and a deployment that installs (or renames its workspace)
|
|
13
|
+
// after boot must still be named without a restart.
|
|
14
|
+
const TEAM_NAME_TTL_MS = 30 * 60_000;
|
|
15
|
+
let teamNameMemo;
|
|
16
|
+
/** The workspace name, when the recorded install is that workspace. */
|
|
17
|
+
async function liveTeamName(id) {
|
|
18
|
+
if (teamNameMemo && teamNameMemo.teamId === id && Date.now() - teamNameMemo.at < TEAM_NAME_TTL_MS)
|
|
19
|
+
return teamNameMemo.name;
|
|
20
|
+
const install = await slackInstallState().catch(() => undefined);
|
|
21
|
+
if (install?.teamId === id && install.teamName) {
|
|
22
|
+
teamNameMemo = { teamId: id, name: install.teamName, at: Date.now() };
|
|
23
|
+
return install.teamName;
|
|
24
|
+
}
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
/** Build the Slack resolver. */
|
|
28
|
+
export function slackFriendlyNameResolver(deps = {}) {
|
|
29
|
+
return async (id) => {
|
|
30
|
+
if (/^[UW]/.test(id)) {
|
|
31
|
+
const name = await (deps.userName ?? fetchUserDisplayName)(id);
|
|
32
|
+
return name ? { label: name, kind: "person" } : undefined;
|
|
33
|
+
}
|
|
34
|
+
if (/^[CG]/.test(id)) {
|
|
35
|
+
const name = await (deps.channelName ?? fetchChannelDisplayName)(id);
|
|
36
|
+
return name ? { label: `#${name.replace(/^#/, "")}`, kind: "channel" } : undefined;
|
|
37
|
+
}
|
|
38
|
+
if (/^T/.test(id)) {
|
|
39
|
+
const name = await (deps.teamName ?? liveTeamName)(id);
|
|
40
|
+
return name ? { label: name, kind: "server" } : undefined;
|
|
41
|
+
}
|
|
42
|
+
return undefined;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=slack-friendly-names.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-friendly-names.js","sourceRoot":"","sources":["../../../agent/channels/slack-friendly-names.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,EAAE;AACF,mGAAmG;AACnG,kGAAkG;AAClG,mGAAmG;AACnG,qGAAqG;AACrG,qGAAqG;AACrG,gCAAgC;AAGhC,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAS9D,sGAAsG;AACtG,sGAAsG;AACtG,oDAAoD;AACpD,MAAM,gBAAgB,GAAG,EAAE,GAAG,MAAM,CAAC;AACrC,IAAI,YAAiG,CAAC;AAEtG,uEAAuE;AACvE,KAAK,UAAU,YAAY,CAAC,EAAU;IACpC,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC,EAAE,GAAG,gBAAgB;QAAE,OAAO,YAAY,CAAC,IAAI,CAAC;IAC5H,MAAM,OAAO,GAAG,MAAM,iBAAiB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACjE,IAAI,OAAO,EAAE,MAAM,KAAK,EAAE,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC/C,YAAY,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACtE,OAAO,OAAO,CAAC,QAAQ,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,yBAAyB,CAAC,IAAI,GAA0B,EAAE;IACxE,OAAO,KAAK,EAAE,EAAE,EAAE,EAAE;QAClB,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/D,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5D,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC;YACrE,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACrF,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5D,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { type SlackUserDeactivation } from "./slack-offboarding.js";
|
|
2
2
|
import type { OffboardOutcome } from "@open-everywhere/core/agent/adapter-api.js";
|
|
3
3
|
import { type Channel, type RouteHandlerArgs } from "eve/channels";
|
|
4
|
-
import { liveSupervisorDeps, type SlackEventEnvelope } from "./slack-events.js";
|
|
4
|
+
import { liveSupervisorDeps, type SlackEventEnvelope, type ParsedMessageEvent } from "./slack-events.js";
|
|
5
5
|
import { EventDedupe, ThreadFifo, type SingleWindowMentionPolicy, type DmSeat, type SetKeyViewResult, type PersonOptOutState } from "@open-everywhere/core/agent/adapter-api.js";
|
|
6
|
+
import { type ParsedSlackFeedbackClick } from "./slack-reply-feedback.js";
|
|
7
|
+
import { type ParsedSlackFollowUpClick } from "./slack-follow-ups.js";
|
|
6
8
|
import { type ParsedHomeClick, type ParsedHomeOpen, type ParsedHomeSubmission } from "./slack-home.js";
|
|
7
9
|
import { type ParsedSlackShortcut } from "./slack-shortcut.js";
|
|
8
10
|
/** An HTTP route handler — `RouteHandler` isn't a public eve export, so we mirror its shape. */
|
|
@@ -71,6 +73,22 @@ export type FrontDecision = {
|
|
|
71
73
|
readonly reason: string;
|
|
72
74
|
readonly payload: unknown;
|
|
73
75
|
}
|
|
76
|
+
/** A click on Slack's native thumbs up / down under an agent answer (OPE-2520, slack-reply-blocks.ts)
|
|
77
|
+
* — ours: record it as a `reply.feedback` row. Never forwarded, and it wakes nothing. */
|
|
78
|
+
| {
|
|
79
|
+
readonly kind: "feedback-click";
|
|
80
|
+
readonly reason: string;
|
|
81
|
+
readonly payload: unknown;
|
|
82
|
+
readonly click: ParsedSlackFeedbackClick;
|
|
83
|
+
}
|
|
84
|
+
/** OPE-2516 — a press on a suggested follow-up under an answer in a 1:1 DM (`oe_followup:<n>`). The
|
|
85
|
+
* handler wakes the DM seat with the button's text as the person's next message. */
|
|
86
|
+
| {
|
|
87
|
+
readonly kind: "followup-click";
|
|
88
|
+
readonly reason: string;
|
|
89
|
+
readonly payload: unknown;
|
|
90
|
+
readonly click: ParsedSlackFollowUpClick;
|
|
91
|
+
}
|
|
74
92
|
/** An `app_mention` — the native slackChannel path owns it UNLESS the handler's single-window
|
|
75
93
|
* policy says the unified window does (then the forward is suppressed and the mention's
|
|
76
94
|
* `message.channels` sibling carries it as an addressed wake). Carries `env` so the handler
|
|
@@ -132,6 +150,13 @@ export type FrontDecision = {
|
|
|
132
150
|
| {
|
|
133
151
|
readonly kind: "context-change";
|
|
134
152
|
readonly reason: string;
|
|
153
|
+
}
|
|
154
|
+
/** An `agent_session_stopped` (OPE-2519) — ours: the person pressed Slack's native Stop on an agent
|
|
155
|
+
* session. It takes the ✋ arm's cancel path (slack-agent-session.ts `routeAgentSessionStop`). */
|
|
156
|
+
| {
|
|
157
|
+
readonly kind: "session-stop";
|
|
158
|
+
readonly reason: string;
|
|
159
|
+
readonly env: SlackEventEnvelope;
|
|
135
160
|
};
|
|
136
161
|
/**
|
|
137
162
|
* Decide how the front route handles a raw inbound body. FORWARD is the fail-safe default:
|
|
@@ -174,11 +199,12 @@ export declare function resolveBotIdentity(): Promise<{
|
|
|
174
199
|
readonly userId?: string;
|
|
175
200
|
readonly botId?: string;
|
|
176
201
|
}>;
|
|
177
|
-
/** Reset the cached identity (tests only). */
|
|
178
|
-
export declare function _resetBotIdentity(): void;
|
|
179
202
|
/** Injectable seams so the wake path is testable without live crypto / Slack. */
|
|
180
203
|
export interface FrontOptions {
|
|
181
204
|
readonly signingSecret?: string;
|
|
205
|
+
/** Hear the voice clips on a message an addressed road already decided to wake (OPE-2524). Defaults to
|
|
206
|
+
* slack-voice-clips.ts `withSlackVoiceClips`; a test injects a stub so no audio is fetched. */
|
|
207
|
+
readonly hearVoiceClips?: (ev: ParsedMessageEvent) => Promise<ParsedMessageEvent>;
|
|
182
208
|
readonly dedupe?: EventDedupe;
|
|
183
209
|
readonly fifo?: ThreadFifo;
|
|
184
210
|
readonly getBotIdentity?: () => Promise<{
|
|
@@ -233,6 +259,15 @@ export interface FrontOptions {
|
|
|
233
259
|
readonly handleHomeOpened?: (open: ParsedHomeOpen) => Promise<boolean>;
|
|
234
260
|
readonly handleHomeClick?: (click: ParsedHomeClick) => Promise<boolean>;
|
|
235
261
|
readonly handleHomeSubmission?: (submission: ParsedHomeSubmission) => Promise<boolean>;
|
|
262
|
+
/** OPE-2426 — the asked-thread exception for a bot-authored thread reply. Returns the relay to run (the
|
|
263
|
+
* reply goes to the asker's DM, never to this channel's seat), or null to fall through to the ordinary
|
|
264
|
+
* bot-author drop. Injected in tests; the live default is core's `admitAskedBotReply`. */
|
|
265
|
+
readonly admitBotReply?: (ev: ParsedMessageEvent, self: {
|
|
266
|
+
readonly userId?: string;
|
|
267
|
+
readonly botId?: string;
|
|
268
|
+
}) => Promise<{
|
|
269
|
+
readonly relay: () => Promise<unknown>;
|
|
270
|
+
} | null>;
|
|
236
271
|
/** The domain memory canvas recheck a trust event runs (OPE-2451): a person joined the channel, or it
|
|
237
272
|
* was shared. Injected in tests; the live default is slack-memory-canvas.ts's, over the live deps. */
|
|
238
273
|
readonly recheckChannelCanvas?: (input: {
|
|
@@ -315,47 +350,6 @@ export interface FrontOptions {
|
|
|
315
350
|
readonly refuted: boolean;
|
|
316
351
|
}>;
|
|
317
352
|
}
|
|
318
|
-
/**
|
|
319
|
-
* Turn a swallowed FIFO wake failure into a DURABLE, queryable signal (resilience S-1 / #551
|
|
320
|
-
* §3.4): a log-ship "error" record (the primary win — the failure survives the ~1h console
|
|
321
|
-
* retention) plus a best-effort `surface.wake_failed` audit row (mirrors recordQuietFailure's
|
|
322
|
-
* posture). The FIFO key encodes the channel (`${channelId}:${threadTs}` for a thread wake,
|
|
323
|
-
* `${channelId}:oe-sup` for a supervisor wake); team is unknown at this layer, so the audit
|
|
324
|
-
* partition falls back to the empty-team default exactly like recordQuietFailure's own
|
|
325
|
-
* `teamId ?? ""` — best-effort, never blocks. Never throws.
|
|
326
|
-
*/
|
|
327
|
-
/**
|
|
328
|
-
* Deliver a wake, and RE-DELIVER IT ONCE when the first attempt died on a pruned deployment
|
|
329
|
-
* (OPE-963, channels/stranded-seat.ts).
|
|
330
|
-
*
|
|
331
|
-
* The first attempt's failure is not wasted: `divertToUnifiedWindow` classified it and MARKED the
|
|
332
|
-
* seat's `channel_session` row for rotation before it rethrew. So the second attempt re-resolves the
|
|
333
|
-
* seat, `rotationTrigger` answers `operator-marked`, the seat takes its own rotate leg (fresh
|
|
334
|
-
* generation, carried tail), and eve opens a NEW run under the CURRENT deployment. Without this the
|
|
335
|
-
* member loses the message that hit the strand, even though the seat itself is healed.
|
|
336
|
-
*
|
|
337
|
-
* EXACTLY ONE retry, and only for this class. Every other failure rethrows untouched, straight to
|
|
338
|
-
* the FIFO's loud handler ({@link recordWakeFailure}). A second failure of the same class rethrows
|
|
339
|
-
* too — the seat could not be marked, so a third attempt would resume the same dead run.
|
|
340
|
-
*
|
|
341
|
-
* THE ROUTE FUNCTION MUST BE RE-RUNNABLE, and both wrapped routes are. Everything they do before
|
|
342
|
-
* the divert is a read or an idempotent write: TTL-cached `conversations.info` / `users.info`
|
|
343
|
-
* probes, a deterministic external-policy verdict (its private notice posts only on a verdict that
|
|
344
|
-
* RETURNS rather than throws, so a retry never reaches it), a read-only spend gate, and
|
|
345
|
-
* `markEngaged`, which upserts. `recordWakeTail` and `touchDmSeat`/`touchSession` all run AFTER the
|
|
346
|
-
* divert, so a failed attempt records nothing to duplicate. The wake id is minted fresh, which is
|
|
347
|
-
* correct — the retry is a new delivery.
|
|
348
|
-
*
|
|
349
|
-
* Applied only to the WINDOW-bearing routes — a thread seat has no `channel_session` row to mark,
|
|
350
|
-
* so a retry there could only resume the same dead run.
|
|
351
|
-
*
|
|
352
|
-
* OPE-970: when the RETRY ALSO throws, the seat is still healed for its NEXT wake — but THIS
|
|
353
|
-
* member's message got no answer, and that fact must not collapse into an ordinary send-failure
|
|
354
|
-
* row indistinguishable from a transient blip. The retry's error is tagged
|
|
355
|
-
* ({@link markUndeliveredAfterHeal}) before it rethrows, so {@link recordWakeFailure} can give the
|
|
356
|
-
* row its own reason.
|
|
357
|
-
*/
|
|
358
|
-
export declare function deliverWithStrandRetry<T>(deliver: () => Promise<T>): Promise<T>;
|
|
359
353
|
export declare function recordWakeFailure(key: string, err: unknown): void;
|
|
360
354
|
/**
|
|
361
355
|
* Build the front route handler. Buffers the body once, verifies the signature, then forwards
|
|
@@ -391,8 +385,6 @@ export declare function recordWakeFailure(key: string, err: unknown): void;
|
|
|
391
385
|
* key directly rather than trying to parse it back out of the per-channel token.
|
|
392
386
|
*/
|
|
393
387
|
export declare function withSingleWindowDiversion(deps: ReturnType<typeof liveSupervisorDeps>, to: RouteHandlerArgs["to"], surfaceKey: string): ReturnType<typeof liveSupervisorDeps>;
|
|
394
|
-
/** Reset the cached DM-partner trust (tests only). */
|
|
395
|
-
export declare function _resetDmTrustCache(): void;
|
|
396
388
|
/**
|
|
397
389
|
* Does this `message` event DUPLICATE an `app_mention` Slack also fires, so the wake path must drop it?
|
|
398
390
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack-front.d.ts","sourceRoot":"","sources":["../../../agent/channels/slack-front.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"slack-front.d.ts","sourceRoot":"","sources":["../../../agent/channels/slack-front.ts"],"names":[],"mappings":"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"}
|