@memberjunction/messaging-adapters 0.0.1 → 5.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +231 -43
- package/dist/base/BaseMessagingAdapter.d.ts +428 -0
- package/dist/base/BaseMessagingAdapter.d.ts.map +1 -0
- package/dist/base/BaseMessagingAdapter.js +934 -0
- package/dist/base/BaseMessagingAdapter.js.map +1 -0
- package/dist/base/message-formatter.d.ts +70 -0
- package/dist/base/message-formatter.d.ts.map +1 -0
- package/dist/base/message-formatter.js +201 -0
- package/dist/base/message-formatter.js.map +1 -0
- package/dist/base/types.d.ts +211 -0
- package/dist/base/types.d.ts.map +1 -0
- package/dist/base/types.js +6 -0
- package/dist/base/types.js.map +1 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/slack/SlackAdapter.d.ts +141 -0
- package/dist/slack/SlackAdapter.d.ts.map +1 -0
- package/dist/slack/SlackAdapter.js +291 -0
- package/dist/slack/SlackAdapter.js.map +1 -0
- package/dist/slack/SlackMessagingExtension.d.ts +148 -0
- package/dist/slack/SlackMessagingExtension.d.ts.map +1 -0
- package/dist/slack/SlackMessagingExtension.js +433 -0
- package/dist/slack/SlackMessagingExtension.js.map +1 -0
- package/dist/slack/slack-block-builder.d.ts +133 -0
- package/dist/slack/slack-block-builder.d.ts.map +1 -0
- package/dist/slack/slack-block-builder.js +748 -0
- package/dist/slack/slack-block-builder.js.map +1 -0
- package/dist/slack/slack-formatter.d.ts +37 -0
- package/dist/slack/slack-formatter.d.ts.map +1 -0
- package/dist/slack/slack-formatter.js +116 -0
- package/dist/slack/slack-formatter.js.map +1 -0
- package/dist/slack/slack-interactivity.d.ts +38 -0
- package/dist/slack/slack-interactivity.d.ts.map +1 -0
- package/dist/slack/slack-interactivity.js +414 -0
- package/dist/slack/slack-interactivity.js.map +1 -0
- package/dist/slack/slack-routes.d.ts +35 -0
- package/dist/slack/slack-routes.d.ts.map +1 -0
- package/dist/slack/slack-routes.js +98 -0
- package/dist/slack/slack-routes.js.map +1 -0
- package/dist/teams/TeamsAdapter.d.ts +155 -0
- package/dist/teams/TeamsAdapter.d.ts.map +1 -0
- package/dist/teams/TeamsAdapter.js +383 -0
- package/dist/teams/TeamsAdapter.js.map +1 -0
- package/dist/teams/TeamsMessagingExtension.d.ts +75 -0
- package/dist/teams/TeamsMessagingExtension.d.ts.map +1 -0
- package/dist/teams/TeamsMessagingExtension.js +176 -0
- package/dist/teams/TeamsMessagingExtension.js.map +1 -0
- package/dist/teams/teams-card-builder.d.ts +94 -0
- package/dist/teams/teams-card-builder.d.ts.map +1 -0
- package/dist/teams/teams-card-builder.js +648 -0
- package/dist/teams/teams-card-builder.js.map +1 -0
- package/dist/teams/teams-formatter.d.ts +39 -0
- package/dist/teams/teams-formatter.d.ts.map +1 -0
- package/dist/teams/teams-formatter.js +107 -0
- package/dist/teams/teams-formatter.js.map +1 -0
- package/package.json +40 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-block-builder.js","sourceRoot":"","sources":["../../src/slack/slack-block-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @memberjunction/messaging-adapters
|
|
3
|
+
* @description Convert Markdown agent responses to Slack Block Kit format.
|
|
4
|
+
*
|
|
5
|
+
* Slack Block Kit has specific formatting requirements and limitations:
|
|
6
|
+
* - Text blocks have a 3000-character limit
|
|
7
|
+
* - Uses `mrkdwn` format (similar to but not identical to Markdown)
|
|
8
|
+
* - Bold: `*text*` (not `**text**`)
|
|
9
|
+
* - Links: `<url|text>` (not `[text](url)`)
|
|
10
|
+
* - Code blocks: triple backticks work the same
|
|
11
|
+
* - Headers use a dedicated `header` block type
|
|
12
|
+
*
|
|
13
|
+
* @see https://api.slack.com/reference/block-kit
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Convert Markdown text from an agent response to Slack Block Kit blocks.
|
|
17
|
+
*
|
|
18
|
+
* Handles:
|
|
19
|
+
* - ATX headers → Block Kit `header` blocks
|
|
20
|
+
* - Fenced code blocks → `section` blocks with triple backtick wrapping
|
|
21
|
+
* - Paragraphs → `section` blocks with `mrkdwn` formatting
|
|
22
|
+
* - Long text → auto-split into multiple blocks to respect the 3000-char limit
|
|
23
|
+
*
|
|
24
|
+
* @param markdown - Raw Markdown text from an agent response.
|
|
25
|
+
* @returns Array of Slack Block Kit block objects.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const blocks = markdownToBlocks('# Hello\n\nThis is **bold** text.');
|
|
30
|
+
* // [
|
|
31
|
+
* // { type: 'header', text: { type: 'plain_text', text: 'Hello' } },
|
|
32
|
+
* // { type: 'section', text: { type: 'mrkdwn', text: 'This is *bold* text.' } }
|
|
33
|
+
* // ]
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare function markdownToBlocks(markdown: string): Record<string, unknown>[];
|
|
37
|
+
//# sourceMappingURL=slack-formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-formatter.d.ts","sourceRoot":"","sources":["../../src/slack/slack-formatter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAUH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CA2B5E"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @memberjunction/messaging-adapters
|
|
3
|
+
* @description Convert Markdown agent responses to Slack Block Kit format.
|
|
4
|
+
*
|
|
5
|
+
* Slack Block Kit has specific formatting requirements and limitations:
|
|
6
|
+
* - Text blocks have a 3000-character limit
|
|
7
|
+
* - Uses `mrkdwn` format (similar to but not identical to Markdown)
|
|
8
|
+
* - Bold: `*text*` (not `**text**`)
|
|
9
|
+
* - Links: `<url|text>` (not `[text](url)`)
|
|
10
|
+
* - Code blocks: triple backticks work the same
|
|
11
|
+
* - Headers use a dedicated `header` block type
|
|
12
|
+
*
|
|
13
|
+
* @see https://api.slack.com/reference/block-kit
|
|
14
|
+
*/
|
|
15
|
+
import { splitMarkdownIntoSections, convertToSlackMrkdwn, splitTextIntoChunks } from '../base/message-formatter.js';
|
|
16
|
+
/** Maximum character length for a single Slack text element. */
|
|
17
|
+
const SLACK_TEXT_BLOCK_MAX_LENGTH = 3000;
|
|
18
|
+
/** Maximum character length for a Slack header text element. */
|
|
19
|
+
const SLACK_HEADER_MAX_LENGTH = 150;
|
|
20
|
+
/**
|
|
21
|
+
* Convert Markdown text from an agent response to Slack Block Kit blocks.
|
|
22
|
+
*
|
|
23
|
+
* Handles:
|
|
24
|
+
* - ATX headers → Block Kit `header` blocks
|
|
25
|
+
* - Fenced code blocks → `section` blocks with triple backtick wrapping
|
|
26
|
+
* - Paragraphs → `section` blocks with `mrkdwn` formatting
|
|
27
|
+
* - Long text → auto-split into multiple blocks to respect the 3000-char limit
|
|
28
|
+
*
|
|
29
|
+
* @param markdown - Raw Markdown text from an agent response.
|
|
30
|
+
* @returns Array of Slack Block Kit block objects.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const blocks = markdownToBlocks('# Hello\n\nThis is **bold** text.');
|
|
35
|
+
* // [
|
|
36
|
+
* // { type: 'header', text: { type: 'plain_text', text: 'Hello' } },
|
|
37
|
+
* // { type: 'section', text: { type: 'mrkdwn', text: 'This is *bold* text.' } }
|
|
38
|
+
* // ]
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export function markdownToBlocks(markdown) {
|
|
42
|
+
const blocks = [];
|
|
43
|
+
const sections = splitMarkdownIntoSections(markdown);
|
|
44
|
+
for (const section of sections) {
|
|
45
|
+
switch (section.Type) {
|
|
46
|
+
case 'header':
|
|
47
|
+
blocks.push(createHeaderBlock(section.Content));
|
|
48
|
+
break;
|
|
49
|
+
case 'code':
|
|
50
|
+
blocks.push(...createCodeBlocks(section.Content));
|
|
51
|
+
break;
|
|
52
|
+
case 'text':
|
|
53
|
+
blocks.push(...createTextBlocks(section.Content));
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Ensure we always return at least one block
|
|
58
|
+
if (blocks.length === 0) {
|
|
59
|
+
blocks.push({
|
|
60
|
+
type: 'section',
|
|
61
|
+
text: { type: 'mrkdwn', text: markdown || '(empty response)' }
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return blocks;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Create a Slack header block. Truncates if the header text exceeds the limit.
|
|
68
|
+
*/
|
|
69
|
+
function createHeaderBlock(text) {
|
|
70
|
+
const headerText = text.length > SLACK_HEADER_MAX_LENGTH
|
|
71
|
+
? text.substring(0, SLACK_HEADER_MAX_LENGTH - 3) + '...'
|
|
72
|
+
: text;
|
|
73
|
+
return {
|
|
74
|
+
type: 'header',
|
|
75
|
+
text: { type: 'plain_text', text: headerText, emoji: true }
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Create Slack section blocks for a code block.
|
|
80
|
+
* Wraps in triple backticks and splits if too long.
|
|
81
|
+
*/
|
|
82
|
+
function createCodeBlocks(code) {
|
|
83
|
+
const wrapped = '```\n' + code + '\n```';
|
|
84
|
+
if (wrapped.length <= SLACK_TEXT_BLOCK_MAX_LENGTH) {
|
|
85
|
+
return [{
|
|
86
|
+
type: 'section',
|
|
87
|
+
text: { type: 'mrkdwn', text: wrapped }
|
|
88
|
+
}];
|
|
89
|
+
}
|
|
90
|
+
// Split long code blocks
|
|
91
|
+
const chunks = splitTextIntoChunks(code, SLACK_TEXT_BLOCK_MAX_LENGTH - 10); // Account for backtick wrapping
|
|
92
|
+
return chunks.map(chunk => ({
|
|
93
|
+
type: 'section',
|
|
94
|
+
text: { type: 'mrkdwn', text: '```\n' + chunk + '\n```' }
|
|
95
|
+
}));
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Create Slack section blocks for text content.
|
|
99
|
+
* Converts Markdown formatting to Slack mrkdwn and splits if too long.
|
|
100
|
+
*/
|
|
101
|
+
function createTextBlocks(text) {
|
|
102
|
+
const mrkdwn = convertToSlackMrkdwn(text);
|
|
103
|
+
if (mrkdwn.length <= SLACK_TEXT_BLOCK_MAX_LENGTH) {
|
|
104
|
+
return [{
|
|
105
|
+
type: 'section',
|
|
106
|
+
text: { type: 'mrkdwn', text: mrkdwn }
|
|
107
|
+
}];
|
|
108
|
+
}
|
|
109
|
+
// Split long text blocks
|
|
110
|
+
const chunks = splitTextIntoChunks(mrkdwn, SLACK_TEXT_BLOCK_MAX_LENGTH);
|
|
111
|
+
return chunks.map(chunk => ({
|
|
112
|
+
type: 'section',
|
|
113
|
+
text: { type: 'mrkdwn', text: chunk }
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=slack-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-formatter.js","sourceRoot":"","sources":["../../src/slack/slack-formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @memberjunction/messaging-adapters
|
|
3
|
+
* @description Handler for Slack interactive message payloads (button clicks, etc.).
|
|
4
|
+
*
|
|
5
|
+
* When users click buttons in Block Kit messages (e.g., "View Full Report"),
|
|
6
|
+
* Slack sends an interaction payload to the configured Request URL. This module
|
|
7
|
+
* routes those payloads to the appropriate handler.
|
|
8
|
+
*
|
|
9
|
+
* ## Slack App Setup
|
|
10
|
+
*
|
|
11
|
+
* 1. Go to your Slack App → Interactivity & Shortcuts
|
|
12
|
+
* 2. Enable Interactivity
|
|
13
|
+
* 3. Set Request URL to: `{your-server}/webhook/slack/interact`
|
|
14
|
+
*
|
|
15
|
+
* @see https://api.slack.com/reference/interaction-payloads
|
|
16
|
+
*/
|
|
17
|
+
import { WebClient } from '@slack/web-api';
|
|
18
|
+
import type { AgentResponseForm } from '@memberjunction/ai-core-plus';
|
|
19
|
+
import type { SlackAdapter } from './SlackAdapter.js';
|
|
20
|
+
/**
|
|
21
|
+
* Register a response form for a given channel/thread so it can be opened as a modal.
|
|
22
|
+
* Called by the block builder when a form with non-choice questions is rendered.
|
|
23
|
+
*/
|
|
24
|
+
export declare function registerActiveForm(channelId: string, threadTs: string, form: AgentResponseForm): void;
|
|
25
|
+
/**
|
|
26
|
+
* Handle a Slack interactivity payload.
|
|
27
|
+
*
|
|
28
|
+
* Routes by `action_id` prefix:
|
|
29
|
+
* - `mj:view_full:*` — Opens a modal with the full agent response
|
|
30
|
+
* - `mj:action_*` — Custom agent action buttons (logged, no-op for now)
|
|
31
|
+
* - URL buttons are handled client-side and don't trigger callbacks
|
|
32
|
+
*
|
|
33
|
+
* @param rawPayload - The raw JSON string from the `payload` form field.
|
|
34
|
+
* @param client - Slack WebClient for API calls (e.g., opening modals).
|
|
35
|
+
* @param adapter - Optional SlackAdapter for form round-trip (posting choices back as messages).
|
|
36
|
+
*/
|
|
37
|
+
export declare function handleSlackInteraction(rawPayload: string, client: WebClient, adapter?: SlackAdapter): Promise<void>;
|
|
38
|
+
//# sourceMappingURL=slack-interactivity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-interactivity.d.ts","sourceRoot":"","sources":["../../src/slack/slack-interactivity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAWtD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI,CASrG;AA2BD;;;;;;;;;;;GAWG;AACH,wBAAsB,sBAAsB,CACxC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,SAAS,EACjB,OAAO,CAAC,EAAE,YAAY,GACvB,OAAO,CAAC,IAAI,CAAC,CAuBf"}
|
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @memberjunction/messaging-adapters
|
|
3
|
+
* @description Handler for Slack interactive message payloads (button clicks, etc.).
|
|
4
|
+
*
|
|
5
|
+
* When users click buttons in Block Kit messages (e.g., "View Full Report"),
|
|
6
|
+
* Slack sends an interaction payload to the configured Request URL. This module
|
|
7
|
+
* routes those payloads to the appropriate handler.
|
|
8
|
+
*
|
|
9
|
+
* ## Slack App Setup
|
|
10
|
+
*
|
|
11
|
+
* 1. Go to your Slack App → Interactivity & Shortcuts
|
|
12
|
+
* 2. Enable Interactivity
|
|
13
|
+
* 3. Set Request URL to: `{your-server}/webhook/slack/interact`
|
|
14
|
+
*
|
|
15
|
+
* @see https://api.slack.com/reference/interaction-payloads
|
|
16
|
+
*/
|
|
17
|
+
import { LogError, LogStatus } from '@memberjunction/core';
|
|
18
|
+
import { buildFormModal, getFullResponseText } from './slack-block-builder.js';
|
|
19
|
+
/**
|
|
20
|
+
* In-memory store for active response forms, keyed by `channelId:threadTs`.
|
|
21
|
+
* Allows the modal open handler to look up the form definition.
|
|
22
|
+
* Entries expire after 30 minutes.
|
|
23
|
+
*/
|
|
24
|
+
const activeFormStore = new Map();
|
|
25
|
+
const FORM_STORE_TTL_MS = 30 * 60 * 1000;
|
|
26
|
+
/**
|
|
27
|
+
* Register a response form for a given channel/thread so it can be opened as a modal.
|
|
28
|
+
* Called by the block builder when a form with non-choice questions is rendered.
|
|
29
|
+
*/
|
|
30
|
+
export function registerActiveForm(channelId, threadTs, form) {
|
|
31
|
+
const key = `${channelId}:${threadTs}`;
|
|
32
|
+
activeFormStore.set(key, { form, timestamp: Date.now() });
|
|
33
|
+
// Cleanup old entries
|
|
34
|
+
for (const [k, v] of activeFormStore) {
|
|
35
|
+
if (Date.now() - v.timestamp > FORM_STORE_TTL_MS) {
|
|
36
|
+
activeFormStore.delete(k);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Handle a Slack interactivity payload.
|
|
42
|
+
*
|
|
43
|
+
* Routes by `action_id` prefix:
|
|
44
|
+
* - `mj:view_full:*` — Opens a modal with the full agent response
|
|
45
|
+
* - `mj:action_*` — Custom agent action buttons (logged, no-op for now)
|
|
46
|
+
* - URL buttons are handled client-side and don't trigger callbacks
|
|
47
|
+
*
|
|
48
|
+
* @param rawPayload - The raw JSON string from the `payload` form field.
|
|
49
|
+
* @param client - Slack WebClient for API calls (e.g., opening modals).
|
|
50
|
+
* @param adapter - Optional SlackAdapter for form round-trip (posting choices back as messages).
|
|
51
|
+
*/
|
|
52
|
+
export async function handleSlackInteraction(rawPayload, client, adapter) {
|
|
53
|
+
let payload;
|
|
54
|
+
try {
|
|
55
|
+
payload = JSON.parse(rawPayload);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
LogError('Failed to parse Slack interaction payload');
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (payload.type === 'view_submission') {
|
|
62
|
+
await handleModalSubmission(payload, client, adapter);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (payload.type !== 'block_actions') {
|
|
66
|
+
LogStatus(`Slack interaction: ignoring type '${payload.type}'`);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const actions = payload.actions ?? [];
|
|
70
|
+
for (const action of actions) {
|
|
71
|
+
await routeAction(action, payload, client, adapter);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Route a single Slack action to its handler.
|
|
76
|
+
*/
|
|
77
|
+
async function routeAction(action, payload, client, adapter) {
|
|
78
|
+
const actionId = action.action_id;
|
|
79
|
+
LogStatus(`Slack interaction: action_id='${actionId}', user='${payload.user?.name}'`);
|
|
80
|
+
if (actionId.startsWith('mj:view_full:')) {
|
|
81
|
+
await handleViewFull(action, payload, client);
|
|
82
|
+
}
|
|
83
|
+
else if (actionId === 'mj:view_artifact') {
|
|
84
|
+
// URL buttons — handled client-side, no server action needed
|
|
85
|
+
LogStatus('Slack interaction: artifact view button clicked (URL button, no-op)');
|
|
86
|
+
}
|
|
87
|
+
else if (actionId === 'mj:form_modal:open') {
|
|
88
|
+
await handleFormModalOpen(payload, client);
|
|
89
|
+
}
|
|
90
|
+
else if (actionId.startsWith('mj:form_choice:')) {
|
|
91
|
+
await handleFormChoice(action, payload, client, adapter);
|
|
92
|
+
}
|
|
93
|
+
else if (actionId.startsWith('mj:action_')) {
|
|
94
|
+
LogStatus(`Slack interaction: custom action '${actionId}' clicked by ${payload.user?.name}`);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
LogStatus(`Slack interaction: unhandled action_id '${actionId}'`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Handle "View Full Report" button: open a Slack modal with the full content.
|
|
102
|
+
*
|
|
103
|
+
* The action_id format is `mj:view_full:{identifier}`.
|
|
104
|
+
* The full content is pulled from the original message blocks.
|
|
105
|
+
*/
|
|
106
|
+
async function handleViewFull(action, payload, client) {
|
|
107
|
+
try {
|
|
108
|
+
// Try to retrieve stored full text first (preserves content lost during truncation)
|
|
109
|
+
const storeKey = action.value;
|
|
110
|
+
const storedText = storeKey ? getFullResponseText(storeKey) : null;
|
|
111
|
+
// Fall back to extracting from already-truncated blocks
|
|
112
|
+
const messageBlocks = payload.message?.blocks ?? [];
|
|
113
|
+
const fullText = storedText ?? extractTextFromBlocks(messageBlocks);
|
|
114
|
+
// Split content into modal blocks (modal has same 50-block limit)
|
|
115
|
+
const modalBlocks = buildModalContentBlocks(fullText);
|
|
116
|
+
await client.views.open({
|
|
117
|
+
trigger_id: payload.trigger_id,
|
|
118
|
+
view: {
|
|
119
|
+
type: 'modal',
|
|
120
|
+
title: {
|
|
121
|
+
type: 'plain_text',
|
|
122
|
+
text: 'Full Response',
|
|
123
|
+
emoji: true
|
|
124
|
+
},
|
|
125
|
+
close: {
|
|
126
|
+
type: 'plain_text',
|
|
127
|
+
text: 'Close'
|
|
128
|
+
},
|
|
129
|
+
blocks: modalBlocks
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
LogError('Failed to open Slack modal for full response:', undefined, error);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Extract plain text content from Block Kit blocks.
|
|
139
|
+
*/
|
|
140
|
+
function extractTextFromBlocks(blocks) {
|
|
141
|
+
const textParts = [];
|
|
142
|
+
for (const block of blocks) {
|
|
143
|
+
const blockType = block.type;
|
|
144
|
+
if (blockType === 'section' || blockType === 'header') {
|
|
145
|
+
const textObj = block.text;
|
|
146
|
+
if (textObj && typeof textObj.text === 'string') {
|
|
147
|
+
textParts.push(textObj.text);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
else if (blockType === 'context') {
|
|
151
|
+
const elements = block.elements;
|
|
152
|
+
if (elements) {
|
|
153
|
+
for (const el of elements) {
|
|
154
|
+
if (typeof el.text === 'string') {
|
|
155
|
+
textParts.push(el.text);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return textParts.join('\n\n');
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Handle "Fill Out Form" button: open a Slack modal with input fields.
|
|
165
|
+
*
|
|
166
|
+
* The form definition is stored in the button's `value` field as JSON.
|
|
167
|
+
* Falls back to the in-memory form store if the value is too large.
|
|
168
|
+
*/
|
|
169
|
+
async function handleFormModalOpen(payload, client) {
|
|
170
|
+
try {
|
|
171
|
+
const channelId = payload.channel?.id;
|
|
172
|
+
// Use thread_ts (thread root) if available, fall back to message ts.
|
|
173
|
+
// This ensures form responses post back to the original thread, not a sub-thread.
|
|
174
|
+
const threadTs = payload.message?.thread_ts ?? payload.message?.ts;
|
|
175
|
+
if (!channelId) {
|
|
176
|
+
LogStatus('Slack form modal: missing channel');
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
// Try to get the form from the button value first
|
|
180
|
+
const action = payload.actions?.[0];
|
|
181
|
+
let form = null;
|
|
182
|
+
if (action?.value && action.value !== 'too_large') {
|
|
183
|
+
try {
|
|
184
|
+
form = JSON.parse(action.value);
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
LogStatus('Slack form modal: failed to parse form from button value');
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// Fall back to in-memory store
|
|
191
|
+
if (!form) {
|
|
192
|
+
const key = `${channelId}:${threadTs}`;
|
|
193
|
+
const stored = activeFormStore.get(key);
|
|
194
|
+
if (stored) {
|
|
195
|
+
form = stored.form;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (!form) {
|
|
199
|
+
await client.chat.postEphemeral({
|
|
200
|
+
channel: channelId,
|
|
201
|
+
user: payload.user.id,
|
|
202
|
+
text: 'This form has expired. Please ask the agent again.'
|
|
203
|
+
});
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const modalView = buildFormModal(form);
|
|
207
|
+
// Store channel/thread in private_metadata so we can post the response back
|
|
208
|
+
modalView.private_metadata = JSON.stringify({ channelId, threadTs });
|
|
209
|
+
await client.views.open({
|
|
210
|
+
trigger_id: payload.trigger_id,
|
|
211
|
+
view: modalView
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
LogError('Failed to open form modal:', undefined, error);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Handle a modal form submission (view_submission callback).
|
|
220
|
+
* Extracts field values, formats as `@{_mode:"form",...}`, and posts back to the thread.
|
|
221
|
+
*/
|
|
222
|
+
async function handleModalSubmission(payload, client, adapter) {
|
|
223
|
+
try {
|
|
224
|
+
const view = payload.view;
|
|
225
|
+
if (!view || view.callback_id !== 'mj:form_modal:submit')
|
|
226
|
+
return;
|
|
227
|
+
// Parse channel/thread from private_metadata
|
|
228
|
+
let channelId;
|
|
229
|
+
let threadTs;
|
|
230
|
+
if (view.private_metadata) {
|
|
231
|
+
try {
|
|
232
|
+
const meta = JSON.parse(view.private_metadata);
|
|
233
|
+
channelId = meta.channelId;
|
|
234
|
+
threadTs = meta.threadTs;
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// Invalid metadata
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
if (!channelId) {
|
|
241
|
+
LogStatus('Slack modal submit: missing channel metadata');
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
// Extract field values from modal state
|
|
245
|
+
const values = view.state?.values ?? {};
|
|
246
|
+
const fields = [];
|
|
247
|
+
for (const [blockId, blockValues] of Object.entries(values)) {
|
|
248
|
+
// Block IDs are formatted as mj_form_{questionId}
|
|
249
|
+
const questionId = blockId.replace('mj_form_', '');
|
|
250
|
+
for (const [, fieldState] of Object.entries(blockValues)) {
|
|
251
|
+
let fieldValue = '';
|
|
252
|
+
let displayVal = '';
|
|
253
|
+
if (fieldState.selected_option) {
|
|
254
|
+
fieldValue = fieldState.selected_option.value;
|
|
255
|
+
displayVal = fieldValue;
|
|
256
|
+
}
|
|
257
|
+
else if (fieldState.selected_options && fieldState.selected_options.length > 0) {
|
|
258
|
+
fieldValue = fieldState.selected_options.map(o => o.value).join(',');
|
|
259
|
+
displayVal = fieldValue;
|
|
260
|
+
}
|
|
261
|
+
else if (fieldState.value != null) {
|
|
262
|
+
fieldValue = fieldState.value;
|
|
263
|
+
displayVal = fieldValue;
|
|
264
|
+
}
|
|
265
|
+
if (fieldValue) {
|
|
266
|
+
fields.push({
|
|
267
|
+
name: questionId,
|
|
268
|
+
value: fieldValue,
|
|
269
|
+
label: questionId,
|
|
270
|
+
displayValue: displayVal
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
if (fields.length === 0) {
|
|
276
|
+
LogStatus('Slack modal submit: no fields extracted');
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
LogStatus(`Slack modal submit: user='${payload.user?.name}', fields=${fields.length}`);
|
|
280
|
+
await postFormSubmission({
|
|
281
|
+
fields,
|
|
282
|
+
channelId,
|
|
283
|
+
threadTs,
|
|
284
|
+
userId: payload.user.id,
|
|
285
|
+
userName: payload.user.name,
|
|
286
|
+
client,
|
|
287
|
+
adapter
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
LogError('Failed to handle modal submission:', undefined, error);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Handle a form choice button click with full round-trip back to the agent.
|
|
296
|
+
*
|
|
297
|
+
* The action_id format is `mj:form_choice:{questionId}:{value}`.
|
|
298
|
+
*
|
|
299
|
+
* Flow (mirrors MJ Explorer):
|
|
300
|
+
* 1. Parse the selected value from the action_id
|
|
301
|
+
* 2. Format it as a `@{_mode:"form",...}` message (same format Explorer uses)
|
|
302
|
+
* 3. Post the choice as a visible user message in the thread
|
|
303
|
+
* 4. Route the message through the adapter so the agent processes it
|
|
304
|
+
*/
|
|
305
|
+
async function handleFormChoice(action, payload, client, adapter) {
|
|
306
|
+
try {
|
|
307
|
+
// Parse action_id: mj:form_choice:{questionId}:{value}
|
|
308
|
+
const parts = action.action_id.split(':');
|
|
309
|
+
const questionId = parts[2] ?? 'unknown';
|
|
310
|
+
const chosenValue = parts.slice(3).join(':') || action.value || 'unknown';
|
|
311
|
+
const displayValue = action.value || chosenValue;
|
|
312
|
+
LogStatus(`Slack form choice: user='${payload.user?.name}', question='${questionId}', value='${chosenValue}'`);
|
|
313
|
+
const channelId = payload.channel?.id;
|
|
314
|
+
const threadTs = payload.message?.thread_ts ?? payload.message?.ts;
|
|
315
|
+
if (!channelId)
|
|
316
|
+
return;
|
|
317
|
+
await postFormSubmission({
|
|
318
|
+
fields: [{
|
|
319
|
+
name: questionId,
|
|
320
|
+
value: chosenValue,
|
|
321
|
+
label: questionId,
|
|
322
|
+
displayValue
|
|
323
|
+
}],
|
|
324
|
+
channelId,
|
|
325
|
+
threadTs,
|
|
326
|
+
userId: payload.user.id,
|
|
327
|
+
userName: payload.user.name,
|
|
328
|
+
client,
|
|
329
|
+
adapter
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
LogError('Failed to handle form choice interaction:', undefined, error);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Post a form submission back to a Slack thread and route it through the adapter.
|
|
338
|
+
*
|
|
339
|
+
* Shared by handleFormChoice() and handleModalSubmission() — both build
|
|
340
|
+
* `@{_mode:"form",...}` JSON and post it as a visible message in the thread,
|
|
341
|
+
* then hand it to the adapter for agent re-execution.
|
|
342
|
+
*/
|
|
343
|
+
async function postFormSubmission(params) {
|
|
344
|
+
const { fields, channelId, threadTs, userId, userName, client, adapter } = params;
|
|
345
|
+
// Build @{_mode:"form"} message matching Explorer's format
|
|
346
|
+
const formResponse = JSON.stringify({
|
|
347
|
+
_mode: 'form',
|
|
348
|
+
action: 'formSubmit',
|
|
349
|
+
fields
|
|
350
|
+
});
|
|
351
|
+
const messageText = `@${formResponse}`;
|
|
352
|
+
// Post as a visible message in the thread
|
|
353
|
+
const displayText = fields.map(f => `${f.label}: ${f.displayValue}`).join(', ');
|
|
354
|
+
const postResult = await client.chat.postMessage({
|
|
355
|
+
channel: channelId,
|
|
356
|
+
thread_ts: threadTs,
|
|
357
|
+
text: displayText
|
|
358
|
+
});
|
|
359
|
+
// Route through adapter for agent re-execution
|
|
360
|
+
if (adapter && postResult.ts) {
|
|
361
|
+
const incomingMessage = {
|
|
362
|
+
MessageID: postResult.ts,
|
|
363
|
+
Text: messageText,
|
|
364
|
+
SenderID: userId,
|
|
365
|
+
SenderName: userName,
|
|
366
|
+
ChannelID: channelId,
|
|
367
|
+
ThreadID: threadTs ?? null,
|
|
368
|
+
IsDirectMessage: false,
|
|
369
|
+
IsBotMention: true,
|
|
370
|
+
Timestamp: new Date(),
|
|
371
|
+
RawEvent: {}
|
|
372
|
+
};
|
|
373
|
+
adapter.HandleMessage(incomingMessage).catch(err => {
|
|
374
|
+
LogError('Failed to re-execute agent after form submission:', undefined, err);
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Build Block Kit blocks for the modal content.
|
|
380
|
+
*/
|
|
381
|
+
function buildModalContentBlocks(text) {
|
|
382
|
+
const maxBlockTextLength = 3000;
|
|
383
|
+
const blocks = [];
|
|
384
|
+
// Split text into chunks that fit in section blocks
|
|
385
|
+
let remaining = text;
|
|
386
|
+
while (remaining.length > 0 && blocks.length < 48) {
|
|
387
|
+
const chunk = remaining.substring(0, maxBlockTextLength);
|
|
388
|
+
remaining = remaining.substring(maxBlockTextLength);
|
|
389
|
+
blocks.push({
|
|
390
|
+
type: 'section',
|
|
391
|
+
text: {
|
|
392
|
+
type: 'mrkdwn',
|
|
393
|
+
text: chunk || '(empty)'
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
if (remaining.length > 0) {
|
|
398
|
+
blocks.push({
|
|
399
|
+
type: 'context',
|
|
400
|
+
elements: [{
|
|
401
|
+
type: 'mrkdwn',
|
|
402
|
+
text: '⋯ _Content truncated due to length._'
|
|
403
|
+
}]
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
if (blocks.length === 0) {
|
|
407
|
+
blocks.push({
|
|
408
|
+
type: 'section',
|
|
409
|
+
text: { type: 'mrkdwn', text: '(No content available)' }
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
return blocks;
|
|
413
|
+
}
|
|
414
|
+
//# sourceMappingURL=slack-interactivity.js.map
|