@geminixiang/mikan 1.0.0-beta.94 → 1.0.0-beta.96
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 +432 -378
- package/README.md +31 -40
- package/dist/adapters/commands/login.js +1 -1
- package/dist/adapters/commands/login.js.map +1 -1
- package/dist/adapters/commands/registry.d.ts +1 -1
- package/dist/adapters/commands/registry.d.ts.map +1 -1
- package/dist/adapters/commands/registry.js +1 -2
- package/dist/adapters/commands/registry.js.map +1 -1
- package/dist/adapters/commands/types.d.ts +2 -4
- package/dist/adapters/commands/types.d.ts.map +1 -1
- package/dist/adapters/commands/types.js.map +1 -1
- package/dist/adapters/github/bot.js +1 -1
- package/dist/adapters/github/bot.js.map +1 -1
- package/dist/adapters/github/policy.d.ts +2 -9
- package/dist/adapters/github/policy.d.ts.map +1 -1
- package/dist/adapters/github/policy.js +18 -26
- package/dist/adapters/github/policy.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +2 -4
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +28 -56
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/socket-agent.d.ts +9 -0
- package/dist/adapters/slack/socket-agent.d.ts.map +1 -0
- package/dist/adapters/slack/socket-agent.js +17 -0
- package/dist/adapters/slack/socket-agent.js.map +1 -0
- package/dist/adapters/telegram/bot.d.ts +1 -0
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +6 -1
- package/dist/adapters/telegram/bot.js.map +1 -1
- package/dist/adapters/telegram/types.d.ts +1 -0
- package/dist/adapters/telegram/types.d.ts.map +1 -1
- package/dist/adapters/telegram/types.js.map +1 -1
- package/dist/adapters/web/admin/portal.d.ts.map +1 -1
- package/dist/adapters/web/admin/portal.js +92 -173
- package/dist/adapters/web/admin/portal.js.map +1 -1
- package/dist/adapters/web/admin/types.d.ts +3 -8
- package/dist/adapters/web/admin/types.d.ts.map +1 -1
- package/dist/adapters/web/admin/types.js.map +1 -1
- package/dist/adapters/web/server.d.ts +1 -1
- package/dist/adapters/web/server.d.ts.map +1 -1
- package/dist/adapters/web/server.js.map +1 -1
- package/dist/cli/arg-grammar.d.ts +1 -3
- package/dist/cli/arg-grammar.d.ts.map +1 -1
- package/dist/cli/arg-grammar.js +2 -20
- package/dist/cli/arg-grammar.js.map +1 -1
- package/dist/cli/boot.d.ts.map +1 -1
- package/dist/cli/boot.js +5 -11
- package/dist/cli/boot.js.map +1 -1
- package/dist/cli/migrate.d.ts.map +1 -1
- package/dist/cli/migrate.js +22 -7
- package/dist/cli/migrate.js.map +1 -1
- package/dist/cli/office.d.ts.map +1 -1
- package/dist/cli/office.js +3 -5
- package/dist/cli/office.js.map +1 -1
- package/dist/cli/onboard.js +18 -20
- package/dist/cli/onboard.js.map +1 -1
- package/dist/cli/types.d.ts +1 -2
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/types.js.map +1 -1
- package/dist/env-manifest.d.ts +2 -1
- package/dist/env-manifest.d.ts.map +1 -1
- package/dist/env-manifest.js +76 -47
- package/dist/env-manifest.js.map +1 -1
- package/dist/events/index.d.ts +5 -5
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +1 -7
- package/dist/events/index.js.map +1 -1
- package/dist/file-guards.d.ts +1 -0
- package/dist/file-guards.d.ts.map +1 -1
- package/dist/file-guards.js +4 -1
- package/dist/file-guards.js.map +1 -1
- package/dist/harness/execution-resolver.d.ts.map +1 -1
- package/dist/harness/execution-resolver.js +2 -8
- package/dist/harness/execution-resolver.js.map +1 -1
- package/dist/harness/http.d.ts +1 -2
- package/dist/harness/http.d.ts.map +1 -1
- package/dist/harness/http.js +3 -16
- package/dist/harness/http.js.map +1 -1
- package/dist/harness/jev.d.ts +2 -1
- package/dist/harness/jev.d.ts.map +1 -1
- package/dist/harness/jev.js.map +1 -1
- package/dist/harness/models.d.ts +2 -2
- package/dist/harness/models.d.ts.map +1 -1
- package/dist/harness/models.js +4 -6
- package/dist/harness/models.js.map +1 -1
- package/dist/harness/prompt.d.ts.map +1 -1
- package/dist/harness/prompt.js +0 -6
- package/dist/harness/prompt.js.map +1 -1
- package/dist/harness/runner.js +1 -2
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session.d.ts +2 -9
- package/dist/harness/session.d.ts.map +1 -1
- package/dist/harness/session.js +3 -3
- package/dist/harness/session.js.map +1 -1
- package/dist/harness/tools/event.d.ts +0 -1
- package/dist/harness/tools/event.d.ts.map +1 -1
- package/dist/harness/tools/event.js +1 -7
- package/dist/harness/tools/event.js.map +1 -1
- package/dist/harness/types.d.ts +4 -4
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/index.d.ts +8 -31
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -15
- package/dist/index.js.map +1 -1
- package/dist/main.js +29 -41
- package/dist/main.js.map +1 -1
- package/dist/migrations/index.d.ts +0 -1
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +4 -10
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/legacy-office-files.d.ts +3 -0
- package/dist/migrations/legacy-office-files.d.ts.map +1 -0
- package/dist/migrations/legacy-office-files.js +29 -0
- package/dist/migrations/legacy-office-files.js.map +1 -0
- package/dist/migrations/session-v3.d.ts +57 -0
- package/dist/migrations/session-v3.d.ts.map +1 -0
- package/dist/migrations/session-v3.js +93 -0
- package/dist/migrations/session-v3.js.map +1 -0
- package/dist/migrations/sessions-sqlite.d.ts.map +1 -1
- package/dist/migrations/sessions-sqlite.js +98 -54
- package/dist/migrations/sessions-sqlite.js.map +1 -1
- package/dist/observability/instrument.js +2 -5
- package/dist/observability/instrument.js.map +1 -1
- package/dist/observability/sentry.js +1 -1
- package/dist/observability/sentry.js.map +1 -1
- package/dist/office/projection.js +2 -2
- package/dist/office/projection.js.map +1 -1
- package/dist/runtime/conversation-runtime.js +9 -14
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/types.d.ts +2 -7
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/identity.d.ts +0 -1
- package/dist/sandbox/identity.d.ts.map +1 -1
- package/dist/sandbox/identity.js +0 -3
- package/dist/sandbox/identity.js.map +1 -1
- package/dist/sandbox/registry.d.ts +1 -5
- package/dist/sandbox/registry.d.ts.map +1 -1
- package/dist/sandbox/registry.js +4 -13
- package/dist/sandbox/registry.js.map +1 -1
- package/dist/sandbox/types.d.ts +1 -5
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sandbox/types.js.map +1 -1
- package/dist/sessions/types.d.ts +1 -1
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/settings/apply.d.ts +1 -1
- package/dist/settings/apply.d.ts.map +1 -1
- package/dist/settings/apply.js +4 -5
- package/dist/settings/apply.js.map +1 -1
- package/dist/settings/index.d.ts +59 -5
- package/dist/settings/index.d.ts.map +1 -1
- package/dist/settings/index.js +75 -54
- package/dist/settings/index.js.map +1 -1
- package/dist/types.d.ts +3 -28
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +2 -15
- package/dist/vault/index.js.map +1 -1
- package/package.json +4 -17
- package/dist/cli/download.d.ts +0 -2
- package/dist/cli/download.d.ts.map +0 -1
- package/dist/cli/download.js +0 -84
- package/dist/cli/download.js.map +0 -1
- package/dist/harness/index.d.ts +0 -20
- package/dist/harness/index.d.ts.map +0 -1
- package/dist/harness/index.js +0 -14
- package/dist/harness/index.js.map +0 -1
- package/dist/migrations/dream-checkpoints.d.ts +0 -3
- package/dist/migrations/dream-checkpoints.d.ts.map +0 -1
- package/dist/migrations/dream-checkpoints.js +0 -23
- package/dist/migrations/dream-checkpoints.js.map +0 -1
- package/dist/migrations/private-office-dirs.d.ts +0 -3
- package/dist/migrations/private-office-dirs.d.ts.map +0 -1
- package/dist/migrations/private-office-dirs.js +0 -24
- package/dist/migrations/private-office-dirs.js.map +0 -1
- package/dist/migrations/session-files.d.ts +0 -28
- package/dist/migrations/session-files.d.ts.map +0 -1
- package/dist/migrations/session-files.js +0 -80
- package/dist/migrations/session-files.js.map +0 -1
- package/dist/migrations/session-v4.d.ts +0 -77
- package/dist/migrations/session-v4.d.ts.map +0 -1
- package/dist/migrations/session-v4.js +0 -177
- package/dist/migrations/session-v4.js.map +0 -1
- package/dist/migrations/sessions-v3.d.ts +0 -8
- package/dist/migrations/sessions-v3.d.ts.map +0 -1
- package/dist/migrations/sessions-v3.js +0 -350
- package/dist/migrations/sessions-v3.js.map +0 -1
- package/dist/sandbox/cloudflare.d.ts +0 -17
- package/dist/sandbox/cloudflare.d.ts.map +0 -1
- package/dist/sandbox/cloudflare.js +0 -142
- package/dist/sandbox/cloudflare.js.map +0 -1
- package/dist/sandbox/index.d.ts +0 -7
- package/dist/sandbox/index.d.ts.map +0 -1
- package/dist/sandbox/index.js +0 -6
- package/dist/sandbox/index.js.map +0 -1
|
@@ -10,50 +10,42 @@ const PERMISSION_RANK = {
|
|
|
10
10
|
};
|
|
11
11
|
const TRIGGER_PERMISSIONS = ["write", "maintain", "admin"];
|
|
12
12
|
const REPO_PATTERN = /^[\w.-]+\/(?:\*|[\w.-]+)$/;
|
|
13
|
-
function
|
|
14
|
-
return (
|
|
15
|
-
.split(",")
|
|
16
|
-
.map((entry) => entry.trim().toLowerCase())
|
|
17
|
-
.filter(Boolean);
|
|
13
|
+
function normalizeList(values) {
|
|
14
|
+
return (values ?? []).map((entry) => entry.trim().toLowerCase()).filter(Boolean);
|
|
18
15
|
}
|
|
19
|
-
function pickAll(
|
|
16
|
+
function pickAll(key, allowed, entries) {
|
|
20
17
|
const unknown = entries.filter((entry) => !allowed.includes(entry));
|
|
21
18
|
if (unknown.length > 0) {
|
|
22
|
-
throw new Error(
|
|
19
|
+
throw new Error(`github.${key} has unknown value(s) ${unknown.join(", ")}; use ${allowed.join(", ")}`);
|
|
23
20
|
}
|
|
24
21
|
return new Set(entries);
|
|
25
22
|
}
|
|
26
|
-
function
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
return false;
|
|
32
|
-
throw new Error(`${name} must be true or false`);
|
|
33
|
-
}
|
|
34
|
-
export function parseGithubPolicy(env) {
|
|
35
|
-
const repos = splitList(env.repos);
|
|
23
|
+
export function parseGithubPolicy(settings) {
|
|
24
|
+
if (settings?.repos === undefined) {
|
|
25
|
+
throw new Error("GitHub is configured but has no repositories. Set github.repos in ~/.mikan/settings.json to owner/repo or owner/* entries.");
|
|
26
|
+
}
|
|
27
|
+
const repos = normalizeList(settings.repos);
|
|
36
28
|
if (repos.length === 0) {
|
|
37
|
-
throw new Error("
|
|
29
|
+
throw new Error("github.repos must list at least one owner/repo or owner/*");
|
|
38
30
|
}
|
|
39
31
|
const invalidRepos = repos.filter((entry) => !REPO_PATTERN.test(entry));
|
|
40
32
|
if (invalidRepos.length > 0) {
|
|
41
|
-
throw new Error(`
|
|
33
|
+
throw new Error(`github.repos has invalid entries ${invalidRepos.join(", ")}; use owner/repo or owner/*`);
|
|
42
34
|
}
|
|
43
|
-
const minPermission = (
|
|
35
|
+
const minPermission = (settings.minPermission ?? "write").trim().toLowerCase();
|
|
44
36
|
if (!TRIGGER_PERMISSIONS.includes(minPermission)) {
|
|
45
|
-
throw new Error(`
|
|
37
|
+
throw new Error(`github.minPermission must be one of ${TRIGGER_PERMISSIONS.join(", ")}`);
|
|
46
38
|
}
|
|
47
|
-
const users =
|
|
39
|
+
const users = normalizeList(settings.users);
|
|
48
40
|
return {
|
|
49
41
|
repos,
|
|
50
|
-
publicRepos:
|
|
42
|
+
publicRepos: settings.publicRepos ?? false,
|
|
51
43
|
users: users.length > 0 ? users : null,
|
|
52
44
|
minPermission: minPermission,
|
|
53
|
-
triggers:
|
|
45
|
+
triggers: settings.triggers === undefined
|
|
54
46
|
? new Set(GITHUB_TRIGGERS)
|
|
55
|
-
: pickAll("
|
|
56
|
-
capabilities: pickAll("
|
|
47
|
+
: pickAll("triggers", GITHUB_TRIGGERS, normalizeList(settings.triggers)),
|
|
48
|
+
capabilities: pickAll("capabilities", GITHUB_CAPABILITIES, normalizeList(settings.capabilities)),
|
|
57
49
|
};
|
|
58
50
|
}
|
|
59
51
|
export function repoIsAllowed(policy, repo) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/adapters/github/policy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/adapters/github/policy.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n GithubCapability,\n GithubPolicy,\n GithubRepoRef,\n GithubTrigger,\n GithubTriggerPermission,\n} from \"./types.js\";\nimport type { GithubSettings } from \"../../settings/index.js\";\n\nconst GITHUB_TRIGGERS: readonly GithubTrigger[] = [\"mention\", \"assign\", \"review\", \"followup\"];\n\nconst GITHUB_CAPABILITIES: readonly GithubCapability[] = [\"triage\", \"push\"];\n\nconst PERMISSION_RANK = {\n none: 0,\n read: 1,\n triage: 2,\n write: 3,\n maintain: 4,\n admin: 5,\n};\n\nconst TRIGGER_PERMISSIONS: readonly GithubTriggerPermission[] = [\"write\", \"maintain\", \"admin\"];\n\nconst REPO_PATTERN = /^[\\w.-]+\\/(?:\\*|[\\w.-]+)$/;\n\nfunction normalizeList(values: readonly string[] | undefined): string[] {\n return (values ?? []).map((entry) => entry.trim().toLowerCase()).filter(Boolean);\n}\n\nfunction pickAll<T extends string>(key: string, allowed: readonly T[], entries: string[]): Set<T> {\n const unknown = entries.filter((entry) => !(allowed as readonly string[]).includes(entry));\n if (unknown.length > 0) {\n throw new Error(\n `github.${key} has unknown value(s) ${unknown.join(\", \")}; use ${allowed.join(\", \")}`,\n );\n }\n return new Set(entries as T[]);\n}\n\nexport function parseGithubPolicy(settings: GithubSettings | undefined): GithubPolicy {\n if (settings?.repos === undefined) {\n throw new Error(\n \"GitHub is configured but has no repositories. Set github.repos in ~/.mikan/settings.json to owner/repo or owner/* entries.\",\n );\n }\n const repos = normalizeList(settings.repos);\n if (repos.length === 0) {\n throw new Error(\"github.repos must list at least one owner/repo or owner/*\");\n }\n const invalidRepos = repos.filter((entry) => !REPO_PATTERN.test(entry));\n if (invalidRepos.length > 0) {\n throw new Error(\n `github.repos has invalid entries ${invalidRepos.join(\", \")}; use owner/repo or owner/*`,\n );\n }\n const minPermission = (settings.minPermission ?? \"write\").trim().toLowerCase();\n if (!(TRIGGER_PERMISSIONS as readonly string[]).includes(minPermission)) {\n throw new Error(`github.minPermission must be one of ${TRIGGER_PERMISSIONS.join(\", \")}`);\n }\n const users = normalizeList(settings.users);\n return {\n repos,\n publicRepos: settings.publicRepos ?? false,\n users: users.length > 0 ? users : null,\n minPermission: minPermission as GithubTriggerPermission,\n triggers:\n settings.triggers === undefined\n ? new Set(GITHUB_TRIGGERS)\n : pickAll(\"triggers\", GITHUB_TRIGGERS, normalizeList(settings.triggers)),\n capabilities: pickAll(\n \"capabilities\",\n GITHUB_CAPABILITIES,\n normalizeList(settings.capabilities),\n ),\n };\n}\n\nexport function repoIsAllowed(\n policy: GithubPolicy,\n repo: GithubRepoRef & { private: boolean },\n): boolean {\n if (!repo.private && !policy.publicRepos) return false;\n const owner = repo.owner.toLowerCase();\n const name = repo.repo.toLowerCase();\n return policy.repos.some((entry) => {\n const [entryOwner, entryName] = entry.split(\"/\");\n return entryOwner === owner && (entryName === \"*\" || entryName === name);\n });\n}\n\nexport function userIsAllowed(policy: GithubPolicy, login: string): boolean {\n return policy.users === null || policy.users.includes(login.toLowerCase());\n}\n\nfunction rankOfPermission(name: string): number {\n return PERMISSION_RANK[name as keyof typeof PERMISSION_RANK] ?? 0;\n}\n\nexport function permissionMeets(\n policy: GithubPolicy,\n role: { permission: string; role_name?: string },\n): boolean {\n const rank = Math.max(rankOfPermission(role.role_name ?? \"\"), rankOfPermission(role.permission));\n return rank >= PERMISSION_RANK[policy.minPermission];\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ConversationLogMessage, RunAnswer } from "../../types.js";
|
|
2
|
-
import type { MessagingBot, ConversationEvent, MessagingEventHandler, MessagingInfo
|
|
2
|
+
import type { MessagingBot, ConversationEvent, MessagingEventHandler, MessagingInfo } from "../../types.js";
|
|
3
3
|
import type { EventScheduler } from "../../events/scheduler.js";
|
|
4
4
|
import type { SlackChannel, SlackMessagingBotOptions, SlackUser, SuggestedPrompt } from "./types.js";
|
|
5
5
|
import type { SlackPersonaIdentity } from "./persona.js";
|
|
@@ -54,9 +54,7 @@ export declare class SlackMessagingBot implements MessagingBot {
|
|
|
54
54
|
postPrivateDiagnostic(conversationId: string, userId: string, text: string, options?: {
|
|
55
55
|
style?: "muted" | "error";
|
|
56
56
|
}): Promise<void>;
|
|
57
|
-
openDirectConversation
|
|
58
|
-
fetchHistory(channel: string, options?: PlatformHistoryOptions): Promise<PlatformHistoryMessage[]>;
|
|
59
|
-
listUsers(): Promise<PlatformUserInfo[]>;
|
|
57
|
+
private openDirectConversation;
|
|
60
58
|
updateMessage(channel: string, ts: string, text: string): Promise<void>;
|
|
61
59
|
tryReserveStreamStart(): boolean;
|
|
62
60
|
startMessageStream(channel: string, text: string, threadTs?: string, recipientUserId?: string): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/bot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAOxE,OAAO,KAAK,EACV,YAAY,EAEZ,iBAAiB,EACjB,qBAAqB,EAIrB,aAAa,
|
|
1
|
+
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/bot.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ import { COMMAND_MANIFEST } from "../commands/manifest.js";
|
|
|
8
8
|
import { slackConversationAutoReplyMode, resolveConversationSettings, } from "../../settings/index.js";
|
|
9
9
|
import { evaluateWithJev, JevNotConfiguredError } from "../../harness/jev.js";
|
|
10
10
|
import * as log from "../../log.js";
|
|
11
|
+
import { SlackSocketAgent } from "./socket-agent.js";
|
|
11
12
|
import { readTextFileNoFollowIfExists } from "../../file-guards.js";
|
|
12
13
|
import { PRODUCT_NAME, formatForceStopped } from "../messages.js";
|
|
13
14
|
import { MessagingEventQueue, MessagingIntakeTracker, AttachmentRejectedError, saveIncomingAttachments, writeResponseToFile, withRetry, } from "../shared.js";
|
|
@@ -257,6 +258,7 @@ export class SlackMessagingBot {
|
|
|
257
258
|
new SocketModeClient({
|
|
258
259
|
appToken: config.appToken,
|
|
259
260
|
clientPingTimeout: 12_000,
|
|
261
|
+
clientOptions: { agent: new SlackSocketAgent() },
|
|
260
262
|
});
|
|
261
263
|
this.webClient = config.webApi ?? new WebClient(config.botToken, { fetch: config.fetch });
|
|
262
264
|
this.statusClient = new WebClient(config.botToken, {
|
|
@@ -282,7 +284,14 @@ export class SlackMessagingBot {
|
|
|
282
284
|
this.backfillChannelKinds();
|
|
283
285
|
this.startupTs = (Date.now() / 1000).toFixed(6);
|
|
284
286
|
this.setupEventHandlers();
|
|
285
|
-
|
|
287
|
+
try {
|
|
288
|
+
await this.socketClient.start();
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
if (this.stopped)
|
|
292
|
+
return;
|
|
293
|
+
throw error;
|
|
294
|
+
}
|
|
286
295
|
log.logConnected("Slack");
|
|
287
296
|
void this.backfillAllChannels(this.startupTs).catch((error) => {
|
|
288
297
|
log.logWarning("Slack backfill failed", String(error));
|
|
@@ -399,55 +408,6 @@ export class SlackMessagingBot {
|
|
|
399
408
|
return channelId;
|
|
400
409
|
});
|
|
401
410
|
}
|
|
402
|
-
async fetchHistory(channel, options) {
|
|
403
|
-
const limit = Math.min(Math.max(options?.limit ?? 200, 1), 999);
|
|
404
|
-
const threadTs = options?.threadTs;
|
|
405
|
-
return slackRetry(async () => {
|
|
406
|
-
const result = threadTs
|
|
407
|
-
? await this.webClient.conversations.replies({
|
|
408
|
-
channel,
|
|
409
|
-
ts: threadTs,
|
|
410
|
-
oldest: options?.oldest || undefined,
|
|
411
|
-
inclusive: options?.oldest ? false : undefined,
|
|
412
|
-
limit,
|
|
413
|
-
})
|
|
414
|
-
: await this.webClient.conversations.history({
|
|
415
|
-
channel,
|
|
416
|
-
oldest: options?.oldest || undefined,
|
|
417
|
-
inclusive: options?.oldest ? false : undefined,
|
|
418
|
-
limit,
|
|
419
|
-
});
|
|
420
|
-
const messages = (result.messages ?? []);
|
|
421
|
-
const mapped = messages
|
|
422
|
-
.filter((msg) => !!msg.ts)
|
|
423
|
-
.filter((msg) => msg.ts !== threadTs)
|
|
424
|
-
.map((msg) => {
|
|
425
|
-
const user = msg.user ? this.users.get(msg.user) : undefined;
|
|
426
|
-
const message = {
|
|
427
|
-
ts: msg.ts,
|
|
428
|
-
text: unescapeSlackText(msg.text ?? ""),
|
|
429
|
-
isBot: !!msg.bot_id || msg.subtype === "bot_message" || user?.isBot === true,
|
|
430
|
-
};
|
|
431
|
-
if (msg.thread_ts && msg.thread_ts !== msg.ts)
|
|
432
|
-
message.threadTs = msg.thread_ts;
|
|
433
|
-
if (msg.user)
|
|
434
|
-
message.userId = msg.user;
|
|
435
|
-
if (user)
|
|
436
|
-
message.userName = user.userName;
|
|
437
|
-
return message;
|
|
438
|
-
});
|
|
439
|
-
return threadTs ? mapped : mapped.toReversed();
|
|
440
|
-
});
|
|
441
|
-
}
|
|
442
|
-
async listUsers() {
|
|
443
|
-
await slackRetry(() => this.fetchUsers());
|
|
444
|
-
return this.getAllUsers().map((user) => ({
|
|
445
|
-
id: user.id,
|
|
446
|
-
userName: user.userName,
|
|
447
|
-
displayName: user.displayName,
|
|
448
|
-
isBot: user.isBot === true,
|
|
449
|
-
}));
|
|
450
|
-
}
|
|
451
411
|
async updateMessage(channel, ts, text) {
|
|
452
412
|
return slackRetry(async () => {
|
|
453
413
|
const payload = { channel, ts, ...renderSlackBlocks(this.resolveMentions(text)) };
|
|
@@ -1059,14 +1019,22 @@ export class SlackMessagingBot {
|
|
|
1059
1019
|
await this.handler.handleEvent(event, this, context);
|
|
1060
1020
|
}
|
|
1061
1021
|
setupEventHandlers() {
|
|
1062
|
-
this.socketClient.on("disconnect", (err) => {
|
|
1063
|
-
log.logWarning("Slack socket disconnect", err ? String(err) : "");
|
|
1064
|
-
});
|
|
1065
1022
|
this.socketClient.on("error", (err) => {
|
|
1066
1023
|
log.logWarning("Slack socket error", err ? String(err) : "");
|
|
1067
1024
|
});
|
|
1068
|
-
|
|
1069
|
-
|
|
1025
|
+
let connectionLostAt;
|
|
1026
|
+
this.socketClient.on("close", () => {
|
|
1027
|
+
if (this.stopped || connectionLostAt !== undefined)
|
|
1028
|
+
return;
|
|
1029
|
+
connectionLostAt = Date.now();
|
|
1030
|
+
log.logWarning("Slack connection lost; reconnecting");
|
|
1031
|
+
});
|
|
1032
|
+
this.socketClient.on("connected", () => {
|
|
1033
|
+
if (connectionLostAt === undefined)
|
|
1034
|
+
return;
|
|
1035
|
+
const seconds = Math.round((Date.now() - connectionLostAt) / 1000);
|
|
1036
|
+
connectionLostAt = undefined;
|
|
1037
|
+
log.logInfo(`Slack reconnected after ${seconds}s`);
|
|
1070
1038
|
});
|
|
1071
1039
|
const on = (event, handle) => this.socketClient.on(event, (payload) => this.intake.run(() => handle(withLoggedAck(event, payload))));
|
|
1072
1040
|
on("app_mention", (payload) => this.handleAppMention(payload));
|
|
@@ -1378,7 +1346,11 @@ export class SlackMessagingBot {
|
|
|
1378
1346
|
return;
|
|
1379
1347
|
}
|
|
1380
1348
|
ack();
|
|
1381
|
-
const sessionKey = action.value
|
|
1349
|
+
const sessionKey = action.value;
|
|
1350
|
+
if (!sessionKey) {
|
|
1351
|
+
log.logWarning("[Force Stop] Ignored a button without a session key", action.action_id);
|
|
1352
|
+
return;
|
|
1353
|
+
}
|
|
1382
1354
|
const userId = body.user?.id;
|
|
1383
1355
|
const channelId = body.container?.channel_id || conversationIdOf(sessionKey);
|
|
1384
1356
|
log.logInfo(`[Force Stop] User ${userId} requested force stop for ${sessionKey}`);
|