@geminixiang/mikan 0.5.0 → 0.5.2
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/CHANGELOG.md +13 -0
- package/dist/adapter.d.ts +1 -1
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js.map +1 -1
- package/dist/adapters/slack/blocks.d.ts +6 -0
- package/dist/adapters/slack/blocks.d.ts.map +1 -0
- package/dist/adapters/slack/blocks.js +176 -0
- package/dist/adapters/slack/blocks.js.map +1 -0
- package/dist/adapters/slack/bot.d.ts +0 -1
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +12 -34
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
- package/dist/adapters/slack/response-lifecycle.js +0 -25
- package/dist/adapters/slack/response-lifecycle.js.map +1 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +40 -46
- package/dist/agent.js.map +1 -1
- package/dist/tools/index.d.ts +1 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +0 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/types.d.ts +0 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/web/admin/portal.js +125 -2
- package/dist/web/admin/portal.js.map +1 -1
- package/package.json +1 -1
- package/dist/adapters/slack/tools/block-kit.d.ts +0 -16
- package/dist/adapters/slack/tools/block-kit.d.ts.map +0 -1
- package/dist/adapters/slack/tools/block-kit.js +0 -105
- package/dist/adapters/slack/tools/block-kit.js.map +0 -1
- package/dist/tool-diagnostics.d.ts +0 -2
- package/dist/tool-diagnostics.d.ts.map +0 -1
- package/dist/tool-diagnostics.js +0 -7
- package/dist/tool-diagnostics.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -9,6 +9,19 @@ any release.
|
|
|
9
9
|
|
|
10
10
|
## [Unreleased]
|
|
11
11
|
|
|
12
|
+
## [0.5.2] - 2026-06-26
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- Show the top 20 pi sessions by token usage in the admin portal, including channel labels and raw input, output, cache read, cache write, total, and cost columns.
|
|
17
|
+
|
|
18
|
+
## [0.5.1] - 2026-06-26
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
|
|
22
|
+
- Render markdown as Slack Block Kit.
|
|
23
|
+
- Show live tool progress during agent runs.
|
|
24
|
+
|
|
12
25
|
## [0.5.0] - 2026-06-25
|
|
13
26
|
|
|
14
27
|
### Added
|
package/dist/adapter.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export type { MessagingBot, ConversationContext, ConversationEvent, MessagingEventHandler, ChatAdapter, ConversationMessage,
|
|
1
|
+
export type { MessagingBot, ConversationContext, ConversationEvent, MessagingEventHandler, ChatAdapter, ConversationMessage, ConversationResponder, ChatToolResult, ConversationKind, MessagingInfo, PlatformName, RunningSession, } from "./types.js";
|
|
2
2
|
//# sourceMappingURL=adapter.d.ts.map
|
package/dist/adapter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,WAAW,EACX,mBAAmB,EACnB,
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,WAAW,EACX,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC"}
|
package/dist/adapter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"","sourcesContent":["export type {\n MessagingBot,\n ConversationContext,\n ConversationEvent,\n MessagingEventHandler,\n ChatAdapter,\n ConversationMessage,\n
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"","sourcesContent":["export type {\n MessagingBot,\n ConversationContext,\n ConversationEvent,\n MessagingEventHandler,\n ChatAdapter,\n ConversationMessage,\n ConversationResponder,\n ChatToolResult,\n ConversationKind,\n MessagingInfo,\n PlatformName,\n RunningSession,\n} from \"./types.js\";\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/blocks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AA4H/C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,EAAE,CAAA;CAAE,CAwDxF"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import MarkdownIt from "markdown-it";
|
|
2
|
+
const markdown = new MarkdownIt({
|
|
3
|
+
html: false,
|
|
4
|
+
linkify: true,
|
|
5
|
+
breaks: true,
|
|
6
|
+
});
|
|
7
|
+
const MAX_BLOCKS = 50;
|
|
8
|
+
const SECTION_TEXT_LIMIT = 3000;
|
|
9
|
+
const FIELD_TEXT_LIMIT = 2000;
|
|
10
|
+
function pushSection(blocks, text) {
|
|
11
|
+
const trimmed = text.trim();
|
|
12
|
+
if (!trimmed)
|
|
13
|
+
return;
|
|
14
|
+
for (let i = 0; i < trimmed.length && blocks.length < MAX_BLOCKS; i += SECTION_TEXT_LIMIT) {
|
|
15
|
+
blocks.push({
|
|
16
|
+
type: "section",
|
|
17
|
+
text: { type: "mrkdwn", text: trimmed.slice(i, i + SECTION_TEXT_LIMIT) },
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function renderInline(tokens) {
|
|
22
|
+
if (!tokens)
|
|
23
|
+
return "";
|
|
24
|
+
let text = "";
|
|
25
|
+
for (const token of tokens) {
|
|
26
|
+
if (token.type === "text" || token.type === "code_inline")
|
|
27
|
+
text += token.content;
|
|
28
|
+
else if (token.type === "softbreak" || token.type === "hardbreak")
|
|
29
|
+
text += "\n";
|
|
30
|
+
else if (token.type === "strong_open")
|
|
31
|
+
text += "*";
|
|
32
|
+
else if (token.type === "strong_close")
|
|
33
|
+
text += "*";
|
|
34
|
+
else if (token.type === "em_open")
|
|
35
|
+
text += "_";
|
|
36
|
+
else if (token.type === "em_close")
|
|
37
|
+
text += "_";
|
|
38
|
+
else if (token.type === "link_open") {
|
|
39
|
+
const href = token.attrGet("href");
|
|
40
|
+
if (href)
|
|
41
|
+
text += `<${href}|`;
|
|
42
|
+
}
|
|
43
|
+
else if (token.type === "link_close") {
|
|
44
|
+
text += ">";
|
|
45
|
+
}
|
|
46
|
+
else if (token.children) {
|
|
47
|
+
text += renderInline(token.children);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return text;
|
|
51
|
+
}
|
|
52
|
+
function collectInlineUntil(tokens, index, endType) {
|
|
53
|
+
let text = "";
|
|
54
|
+
let i = index;
|
|
55
|
+
for (; i < tokens.length && tokens[i].type !== endType; i++) {
|
|
56
|
+
const token = tokens[i];
|
|
57
|
+
if (token.type === "inline")
|
|
58
|
+
text += renderInline(token.children) || token.content;
|
|
59
|
+
else if (token.type === "fence" || token.type === "code_block")
|
|
60
|
+
text += `\n\`\`\`\n${token.content}\n\`\`\``;
|
|
61
|
+
}
|
|
62
|
+
return { text, next: i };
|
|
63
|
+
}
|
|
64
|
+
function isTableAt(tokens, index) {
|
|
65
|
+
return tokens[index]?.type === "table_open";
|
|
66
|
+
}
|
|
67
|
+
function buildTableBlock(headers, rows) {
|
|
68
|
+
const hasIndex = headers[0] === "#";
|
|
69
|
+
const tableHeaders = hasIndex ? headers : ["#", ...headers];
|
|
70
|
+
const tableRows = hasIndex
|
|
71
|
+
? rows
|
|
72
|
+
: rows.map((row, rowNumber) => [String(rowNumber + 1)].concat(row));
|
|
73
|
+
return {
|
|
74
|
+
type: "table",
|
|
75
|
+
rows: [tableHeaders, ...tableRows].map((row) => row.map((cell) => ({ type: "raw_text", text: (cell || " ").slice(0, FIELD_TEXT_LIMIT) }))),
|
|
76
|
+
column_settings: tableHeaders.map(() => ({ is_wrapped: true })),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function parseTable(tokens, index) {
|
|
80
|
+
if (!isTableAt(tokens, index))
|
|
81
|
+
return null;
|
|
82
|
+
const headers = [];
|
|
83
|
+
const rows = [];
|
|
84
|
+
let currentRow = null;
|
|
85
|
+
let inHead = false;
|
|
86
|
+
let i = index + 1;
|
|
87
|
+
for (; i < tokens.length && tokens[i].type !== "table_close"; i++) {
|
|
88
|
+
const token = tokens[i];
|
|
89
|
+
if (token.type === "thead_open")
|
|
90
|
+
inHead = true;
|
|
91
|
+
else if (token.type === "thead_close")
|
|
92
|
+
inHead = false;
|
|
93
|
+
else if (token.type === "tr_open")
|
|
94
|
+
currentRow = [];
|
|
95
|
+
else if (token.type === "tr_close" && currentRow) {
|
|
96
|
+
if (inHead)
|
|
97
|
+
headers.push(...currentRow);
|
|
98
|
+
else
|
|
99
|
+
rows.push(currentRow);
|
|
100
|
+
currentRow = null;
|
|
101
|
+
}
|
|
102
|
+
else if (token.type === "inline" && currentRow) {
|
|
103
|
+
currentRow.push(renderInline(token.children) || token.content);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (!headers.length || !rows.length)
|
|
107
|
+
return null;
|
|
108
|
+
const fallback = [headers.join(" | "), ...rows.map((row) => row.join(" | "))].join("\n");
|
|
109
|
+
return { blocks: [buildTableBlock(headers, rows)], fallback, next: i };
|
|
110
|
+
}
|
|
111
|
+
function normalizeMarkdownTables(source) {
|
|
112
|
+
return source
|
|
113
|
+
.split("\n")
|
|
114
|
+
.map((line) => {
|
|
115
|
+
const trimmed = line.trim();
|
|
116
|
+
if (!trimmed.startsWith("|") || !trimmed.endsWith("|"))
|
|
117
|
+
return line;
|
|
118
|
+
if (!/^[|+\-:\s]+$/.test(trimmed) || !trimmed.includes("+"))
|
|
119
|
+
return line;
|
|
120
|
+
return line.replaceAll("+", "|");
|
|
121
|
+
})
|
|
122
|
+
.join("\n");
|
|
123
|
+
}
|
|
124
|
+
export function renderSlackBlocks(source) {
|
|
125
|
+
const tokens = markdown.parse(normalizeMarkdownTables(source), {});
|
|
126
|
+
const blocks = [];
|
|
127
|
+
const fallback = [];
|
|
128
|
+
for (let i = 0; i < tokens.length && blocks.length < MAX_BLOCKS; i++) {
|
|
129
|
+
const token = tokens[i];
|
|
130
|
+
const table = parseTable(tokens, i);
|
|
131
|
+
if (table) {
|
|
132
|
+
blocks.push(...table.blocks.slice(0, MAX_BLOCKS - blocks.length));
|
|
133
|
+
fallback.push(table.fallback);
|
|
134
|
+
i = table.next;
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (token.type === "heading_open") {
|
|
138
|
+
const collected = collectInlineUntil(tokens, i + 1, "heading_close");
|
|
139
|
+
const text = `*${collected.text}*`;
|
|
140
|
+
pushSection(blocks, text);
|
|
141
|
+
fallback.push(collected.text);
|
|
142
|
+
i = collected.next;
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (token.type === "paragraph_open") {
|
|
146
|
+
const collected = collectInlineUntil(tokens, i + 1, "paragraph_close");
|
|
147
|
+
pushSection(blocks, collected.text);
|
|
148
|
+
fallback.push(collected.text);
|
|
149
|
+
i = collected.next;
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (token.type === "bullet_list_open" || token.type === "ordered_list_open") {
|
|
153
|
+
const lines = [];
|
|
154
|
+
let item = 1;
|
|
155
|
+
for (i += 1; i < tokens.length && !tokens[i].type.endsWith("list_close"); i++) {
|
|
156
|
+
if (tokens[i].type !== "inline")
|
|
157
|
+
continue;
|
|
158
|
+
const marker = token.type === "ordered_list_open" ? `${item++}.` : "•";
|
|
159
|
+
lines.push(`${marker} ${renderInline(tokens[i].children) || tokens[i].content}`);
|
|
160
|
+
}
|
|
161
|
+
const text = lines.join("\n");
|
|
162
|
+
pushSection(blocks, text);
|
|
163
|
+
fallback.push(text);
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (token.type === "fence" || token.type === "code_block") {
|
|
167
|
+
const text = `\`\`\`\n${token.content}\n\`\`\``;
|
|
168
|
+
pushSection(blocks, text);
|
|
169
|
+
fallback.push(token.content);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (!blocks.length)
|
|
173
|
+
pushSection(blocks, source);
|
|
174
|
+
return { text: fallback.join("\n\n") || source, blocks };
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=blocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../../src/adapters/slack/blocks.ts"],"names":[],"mappings":"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","sourcesContent":["import MarkdownIt from \"markdown-it\";\nimport type Token from \"markdown-it/lib/token.mjs\";\nimport type { KnownBlock } from \"@slack/types\";\n\nconst markdown = new MarkdownIt({\n html: false,\n linkify: true,\n breaks: true,\n});\n\nconst MAX_BLOCKS = 50;\nconst SECTION_TEXT_LIMIT = 3000;\nconst FIELD_TEXT_LIMIT = 2000;\n\nfunction pushSection(blocks: KnownBlock[], text: string): void {\n const trimmed = text.trim();\n if (!trimmed) return;\n for (let i = 0; i < trimmed.length && blocks.length < MAX_BLOCKS; i += SECTION_TEXT_LIMIT) {\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: trimmed.slice(i, i + SECTION_TEXT_LIMIT) },\n } as KnownBlock);\n }\n}\n\nfunction renderInline(tokens: Token[] | null | undefined): string {\n if (!tokens) return \"\";\n let text = \"\";\n for (const token of tokens) {\n if (token.type === \"text\" || token.type === \"code_inline\") text += token.content;\n else if (token.type === \"softbreak\" || token.type === \"hardbreak\") text += \"\\n\";\n else if (token.type === \"strong_open\") text += \"*\";\n else if (token.type === \"strong_close\") text += \"*\";\n else if (token.type === \"em_open\") text += \"_\";\n else if (token.type === \"em_close\") text += \"_\";\n else if (token.type === \"link_open\") {\n const href = token.attrGet(\"href\");\n if (href) text += `<${href}|`;\n } else if (token.type === \"link_close\") {\n text += \">\";\n } else if (token.children) {\n text += renderInline(token.children);\n }\n }\n return text;\n}\n\nfunction collectInlineUntil(\n tokens: Token[],\n index: number,\n endType: string,\n): { text: string; next: number } {\n let text = \"\";\n let i = index;\n for (; i < tokens.length && tokens[i].type !== endType; i++) {\n const token = tokens[i];\n if (token.type === \"inline\") text += renderInline(token.children) || token.content;\n else if (token.type === \"fence\" || token.type === \"code_block\")\n text += `\\n\\`\\`\\`\\n${token.content}\\n\\`\\`\\``;\n }\n return { text, next: i };\n}\n\nfunction isTableAt(tokens: Token[], index: number): boolean {\n return tokens[index]?.type === \"table_open\";\n}\n\nfunction buildTableBlock(headers: string[], rows: string[][]): KnownBlock {\n const hasIndex = headers[0] === \"#\";\n const tableHeaders = hasIndex ? headers : [\"#\", ...headers];\n const tableRows = hasIndex\n ? rows\n : rows.map((row, rowNumber) => [String(rowNumber + 1)].concat(row));\n return {\n type: \"table\",\n rows: [tableHeaders, ...tableRows].map((row) =>\n row.map((cell) => ({ type: \"raw_text\", text: (cell || \" \").slice(0, FIELD_TEXT_LIMIT) })),\n ),\n column_settings: tableHeaders.map(() => ({ is_wrapped: true })),\n } as KnownBlock;\n}\n\nfunction parseTable(\n tokens: Token[],\n index: number,\n): { blocks: KnownBlock[]; fallback: string; next: number } | null {\n if (!isTableAt(tokens, index)) return null;\n\n const headers: string[] = [];\n const rows: string[][] = [];\n let currentRow: string[] | null = null;\n let inHead = false;\n let i = index + 1;\n\n for (; i < tokens.length && tokens[i].type !== \"table_close\"; i++) {\n const token = tokens[i];\n if (token.type === \"thead_open\") inHead = true;\n else if (token.type === \"thead_close\") inHead = false;\n else if (token.type === \"tr_open\") currentRow = [];\n else if (token.type === \"tr_close\" && currentRow) {\n if (inHead) headers.push(...currentRow);\n else rows.push(currentRow);\n currentRow = null;\n } else if (token.type === \"inline\" && currentRow) {\n currentRow.push(renderInline(token.children) || token.content);\n }\n }\n\n if (!headers.length || !rows.length) return null;\n\n const fallback = [headers.join(\" | \"), ...rows.map((row) => row.join(\" | \"))].join(\"\\n\");\n return { blocks: [buildTableBlock(headers, rows)], fallback, next: i };\n}\n\nfunction normalizeMarkdownTables(source: string): string {\n return source\n .split(\"\\n\")\n .map((line) => {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"|\") || !trimmed.endsWith(\"|\")) return line;\n if (!/^[|+\\-:\\s]+$/.test(trimmed) || !trimmed.includes(\"+\")) return line;\n return line.replaceAll(\"+\", \"|\");\n })\n .join(\"\\n\");\n}\n\nexport function renderSlackBlocks(source: string): { text: string; blocks: KnownBlock[] } {\n const tokens = markdown.parse(normalizeMarkdownTables(source), {});\n const blocks: KnownBlock[] = [];\n const fallback: string[] = [];\n\n for (let i = 0; i < tokens.length && blocks.length < MAX_BLOCKS; i++) {\n const token = tokens[i];\n\n const table = parseTable(tokens, i);\n if (table) {\n blocks.push(...table.blocks.slice(0, MAX_BLOCKS - blocks.length));\n fallback.push(table.fallback);\n i = table.next;\n continue;\n }\n\n if (token.type === \"heading_open\") {\n const collected = collectInlineUntil(tokens, i + 1, \"heading_close\");\n const text = `*${collected.text}*`;\n pushSection(blocks, text);\n fallback.push(collected.text);\n i = collected.next;\n continue;\n }\n\n if (token.type === \"paragraph_open\") {\n const collected = collectInlineUntil(tokens, i + 1, \"paragraph_close\");\n pushSection(blocks, collected.text);\n fallback.push(collected.text);\n i = collected.next;\n continue;\n }\n\n if (token.type === \"bullet_list_open\" || token.type === \"ordered_list_open\") {\n const lines: string[] = [];\n let item = 1;\n for (i += 1; i < tokens.length && !tokens[i].type.endsWith(\"list_close\"); i++) {\n if (tokens[i].type !== \"inline\") continue;\n const marker = token.type === \"ordered_list_open\" ? `${item++}.` : \"•\";\n lines.push(`${marker} ${renderInline(tokens[i].children) || tokens[i].content}`);\n }\n const text = lines.join(\"\\n\");\n pushSection(blocks, text);\n fallback.push(text);\n continue;\n }\n\n if (token.type === \"fence\" || token.type === \"code_block\") {\n const text = `\\`\\`\\`\\n${token.content}\\n\\`\\`\\``;\n pushSection(blocks, text);\n fallback.push(token.content);\n }\n }\n\n if (!blocks.length) pushSection(blocks, source);\n return { text: fallback.join(\"\\n\\n\") || source, blocks };\n}\n"]}
|
|
@@ -55,7 +55,6 @@ export declare class SlackMessagingBot implements MessagingBot {
|
|
|
55
55
|
setAssistantStatus(channel: string, threadTs: string, status: string): Promise<void>;
|
|
56
56
|
postInThread(channel: string, threadTs: string, text: string): Promise<string>;
|
|
57
57
|
postInThreadBlocks(channel: string, threadTs: string, text: string, blocks: object[]): Promise<string>;
|
|
58
|
-
postBlocks(channel: string, text: string, blocks: object[]): Promise<string>;
|
|
59
58
|
uploadFile(channel: string, filePath: string, title?: string, threadTs?: string): Promise<void>;
|
|
60
59
|
logToFile(channel: string, entry: object): void;
|
|
61
60
|
logBotResponse(channel: string, text: string, ts: string, threadTs?: string, slackBlocks?: object[]): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/bot.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,YAAY,EAEZ,iBAAiB,EACjB,qBAAqB,EAKrB,aAAa,EACd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,KAAK,EAGV,YAAY,EAEZ,SAAS,EACV,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/bot.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ import { createSlackAdapters } from "./context.js";
|
|
|
12
12
|
import { hasMaterializedChatSession, registerThreadSession, } from "../../sessions/agent-memory-file-manager.js";
|
|
13
13
|
import { isSlackThreadSessionKey, planSlackAdapterSession, planSlackEventAnchorRun, resolveSlackSessionKey, } from "./session.js";
|
|
14
14
|
import { reportUserFacingError } from "../../observability/sentry.js";
|
|
15
|
+
import { renderSlackBlocks } from "./blocks.js";
|
|
15
16
|
const SLACK_EVENT_ANCHOR_TEXT = "Working on it...";
|
|
16
17
|
// Slack WebClient errors carry either `code: "rate_limited"` (retry-after) or
|
|
17
18
|
// the legacy `data.error === "rate_limited"` / 429 status shape.
|
|
@@ -146,7 +147,8 @@ export class SlackMessagingBot {
|
|
|
146
147
|
}
|
|
147
148
|
async postMessage(channel, text) {
|
|
148
149
|
return slackRetry(async () => {
|
|
149
|
-
const
|
|
150
|
+
const payload = { channel, ...renderSlackBlocks(text) };
|
|
151
|
+
const result = await this.webClient.chat.postMessage(payload);
|
|
150
152
|
return result.ts;
|
|
151
153
|
});
|
|
152
154
|
}
|
|
@@ -173,11 +175,8 @@ export class SlackMessagingBot {
|
|
|
173
175
|
}
|
|
174
176
|
async postMessageBlocks(channel, text, blocks) {
|
|
175
177
|
return slackRetry(async () => {
|
|
176
|
-
const
|
|
177
|
-
|
|
178
|
-
text,
|
|
179
|
-
blocks: blocks,
|
|
180
|
-
});
|
|
178
|
+
const payload = { channel, text, blocks: blocks };
|
|
179
|
+
const result = await this.webClient.chat.postMessage(payload);
|
|
181
180
|
return result.ts;
|
|
182
181
|
});
|
|
183
182
|
}
|
|
@@ -203,7 +202,8 @@ export class SlackMessagingBot {
|
|
|
203
202
|
}
|
|
204
203
|
async updateMessage(channel, ts, text) {
|
|
205
204
|
return slackRetry(async () => {
|
|
206
|
-
|
|
205
|
+
const payload = { channel, ts, ...renderSlackBlocks(text) };
|
|
206
|
+
await this.webClient.chat.update(payload);
|
|
207
207
|
});
|
|
208
208
|
}
|
|
209
209
|
async startMessageStream(channel, text, threadTs, recipientUserId) {
|
|
@@ -255,42 +255,20 @@ export class SlackMessagingBot {
|
|
|
255
255
|
}
|
|
256
256
|
async postInThread(channel, threadTs, text) {
|
|
257
257
|
return slackRetry(async () => {
|
|
258
|
-
|
|
259
|
-
const
|
|
260
|
-
if (text.length > 500) {
|
|
261
|
-
const blockText = text.length > SECTION_TEXT_LIMIT
|
|
262
|
-
? text.substring(0, SECTION_TEXT_LIMIT - 20) + "\n_(truncated)_"
|
|
263
|
-
: text;
|
|
264
|
-
const result = await this.webClient.chat.postMessage({
|
|
265
|
-
channel,
|
|
266
|
-
thread_ts: threadTs,
|
|
267
|
-
text, // full text as notification fallback
|
|
268
|
-
blocks: [{ type: "section", text: { type: "mrkdwn", text: blockText } }],
|
|
269
|
-
});
|
|
270
|
-
return result.ts;
|
|
271
|
-
}
|
|
272
|
-
const result = await this.webClient.chat.postMessage({ channel, thread_ts: threadTs, text });
|
|
258
|
+
const payload = { channel, thread_ts: threadTs, ...renderSlackBlocks(text) };
|
|
259
|
+
const result = await this.webClient.chat.postMessage(payload);
|
|
273
260
|
return result.ts;
|
|
274
261
|
});
|
|
275
262
|
}
|
|
276
263
|
async postInThreadBlocks(channel, threadTs, text, blocks) {
|
|
277
264
|
return slackRetry(async () => {
|
|
278
|
-
const
|
|
265
|
+
const payload = {
|
|
279
266
|
channel,
|
|
280
267
|
thread_ts: threadTs,
|
|
281
268
|
text, // fallback for notifications
|
|
282
269
|
blocks: blocks,
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
async postBlocks(channel, text, blocks) {
|
|
288
|
-
return slackRetry(async () => {
|
|
289
|
-
const result = await this.webClient.chat.postMessage({
|
|
290
|
-
channel,
|
|
291
|
-
text,
|
|
292
|
-
blocks: blocks,
|
|
293
|
-
});
|
|
270
|
+
};
|
|
271
|
+
const result = await this.webClient.chat.postMessage(payload);
|
|
294
272
|
return result.ts;
|
|
295
273
|
});
|
|
296
274
|
}
|