@geminixiang/mikan 0.3.2 → 0.4.0-beta.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/CHANGELOG.md +17 -0
- package/dist/adapter.d.ts +1 -138
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js.map +1 -1
- package/dist/adapters/discord/bot.d.ts +1 -4
- package/dist/adapters/discord/bot.d.ts.map +1 -1
- package/dist/adapters/discord/bot.js +25 -33
- package/dist/adapters/discord/bot.js.map +1 -1
- package/dist/adapters/discord/context.d.ts.map +1 -1
- package/dist/adapters/discord/context.js +28 -0
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/discord/types.d.ts +6 -0
- package/dist/adapters/discord/types.d.ts.map +1 -0
- package/dist/adapters/discord/types.js +2 -0
- package/dist/adapters/discord/types.js.map +1 -0
- package/dist/adapters/intake.d.ts +11 -0
- package/dist/adapters/intake.d.ts.map +1 -0
- package/dist/adapters/intake.js +42 -0
- package/dist/adapters/intake.js.map +1 -0
- package/dist/adapters/shared.d.ts +7 -31
- package/dist/adapters/shared.d.ts.map +1 -1
- package/dist/adapters/shared.js +18 -2
- package/dist/adapters/shared.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +14 -33
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +148 -116
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/context.d.ts +3 -4
- package/dist/adapters/slack/context.d.ts.map +1 -1
- package/dist/adapters/slack/context.js +97 -14
- package/dist/adapters/slack/context.js.map +1 -1
- package/dist/adapters/slack/session.d.ts +5 -20
- package/dist/adapters/slack/session.d.ts.map +1 -1
- package/dist/adapters/slack/session.js.map +1 -1
- package/dist/adapters/slack/types.d.ts +84 -0
- package/dist/adapters/slack/types.d.ts.map +1 -0
- package/dist/adapters/slack/types.js +2 -0
- package/dist/adapters/slack/types.js.map +1 -0
- package/dist/adapters/streaming.d.ts +18 -0
- package/dist/adapters/streaming.d.ts.map +1 -0
- package/dist/adapters/streaming.js +44 -0
- package/dist/adapters/streaming.js.map +1 -0
- package/dist/adapters/telegram/bot.d.ts +1 -4
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +32 -39
- package/dist/adapters/telegram/bot.js.map +1 -1
- package/dist/adapters/telegram/context.d.ts.map +1 -1
- package/dist/adapters/telegram/context.js +33 -0
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/adapters/telegram/types.d.ts +6 -0
- package/dist/adapters/telegram/types.d.ts.map +1 -0
- package/dist/adapters/telegram/types.js +2 -0
- package/dist/adapters/telegram/types.js.map +1 -0
- package/dist/adapters/types.d.ts +58 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/agent.d.ts +4 -16
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +27 -20
- package/dist/agent.js.map +1 -1
- package/dist/commands/admin.d.ts.map +1 -1
- package/dist/commands/admin.js +1 -1
- package/dist/commands/admin.js.map +1 -1
- package/dist/commands/auto-reply.d.ts.map +1 -1
- package/dist/commands/auto-reply.js +1 -8
- package/dist/commands/auto-reply.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +3 -3
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/model.d.ts +5 -8
- package/dist/commands/model.d.ts.map +1 -1
- package/dist/commands/model.js +15 -20
- package/dist/commands/model.js.map +1 -1
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +5 -10
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/parse.d.ts.map +1 -1
- package/dist/commands/parse.js +1 -4
- package/dist/commands/parse.js.map +1 -1
- package/dist/commands/registry.d.ts +1 -0
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +23 -0
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/sandbox.d.ts +2 -5
- package/dist/commands/sandbox.d.ts.map +1 -1
- package/dist/commands/sandbox.js +11 -16
- package/dist/commands/sandbox.js.map +1 -1
- package/dist/commands/session-view.d.ts.map +1 -1
- package/dist/commands/session-view.js +10 -15
- package/dist/commands/session-view.js.map +1 -1
- package/dist/commands/types.d.ts +11 -2
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/types.js.map +1 -1
- package/dist/config.d.ts +6 -28
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +43 -41
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +1 -15
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js.map +1 -1
- package/dist/events.d.ts +3 -44
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +2 -9
- package/dist/events.js.map +1 -1
- package/dist/execution-resolver.d.ts +3 -7
- package/dist/execution-resolver.d.ts.map +1 -1
- package/dist/execution-resolver.js +8 -8
- package/dist/execution-resolver.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/log.d.ts +2 -6
- package/dist/log.d.ts.map +1 -1
- package/dist/log.js +1 -37
- package/dist/log.js.map +1 -1
- package/dist/main.d.ts +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +16 -16
- package/dist/main.js.map +1 -1
- package/dist/observability/instrument.d.ts.map +1 -0
- package/dist/{instrument.js → observability/instrument.js} +2 -2
- package/dist/observability/instrument.js.map +1 -0
- package/dist/{sentry.d.ts → observability/sentry.d.ts} +2 -30
- package/dist/observability/sentry.d.ts.map +1 -0
- package/dist/observability/sentry.js.map +1 -0
- package/dist/observability/types.d.ts +31 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +2 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/{ui-copy.d.ts → platform-messages.d.ts} +1 -1
- package/dist/platform-messages.d.ts.map +1 -0
- package/dist/{ui-copy.js → platform-messages.js} +1 -1
- package/dist/platform-messages.js.map +1 -0
- package/dist/portal-shell.d.ts +2 -28
- package/dist/portal-shell.d.ts.map +1 -1
- package/dist/portal-shell.js +2 -2
- package/dist/portal-shell.js.map +1 -1
- package/dist/provisioner.d.ts +2 -23
- package/dist/provisioner.d.ts.map +1 -1
- package/dist/provisioner.js +1 -1
- package/dist/provisioner.js.map +1 -1
- package/dist/runtime/conversation-orchestrator.d.ts +4 -19
- package/dist/runtime/conversation-orchestrator.d.ts.map +1 -1
- package/dist/runtime/conversation-orchestrator.js +3 -3
- package/dist/runtime/conversation-orchestrator.js.map +1 -1
- package/dist/runtime/session-runtime.d.ts +2 -23
- package/dist/runtime/session-runtime.d.ts.map +1 -1
- package/dist/runtime/session-runtime.js +7 -9
- package/dist/runtime/session-runtime.js.map +1 -1
- package/dist/runtime/types.d.ts +35 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/sandbox/cloudflare.d.ts.map +1 -1
- package/dist/sandbox/cloudflare.js +1 -1
- package/dist/sandbox/cloudflare.js.map +1 -1
- package/dist/sandbox/container.d.ts.map +1 -1
- package/dist/sandbox/container.js +1 -4
- package/dist/sandbox/container.js.map +1 -1
- package/dist/sessions/chat-session-manager.d.ts +2 -46
- package/dist/sessions/chat-session-manager.d.ts.map +1 -1
- package/dist/sessions/chat-session-manager.js +12 -40
- package/dist/sessions/chat-session-manager.js.map +1 -1
- package/dist/sessions/metadata.d.ts +1 -13
- package/dist/sessions/metadata.d.ts.map +1 -1
- package/dist/sessions/metadata.js.map +1 -1
- package/dist/sessions/policy.d.ts +3 -10
- package/dist/sessions/policy.d.ts.map +1 -1
- package/dist/sessions/policy.js.map +1 -1
- package/dist/sessions/store.d.ts +1 -12
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +4 -7
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +76 -0
- package/dist/sessions/types.d.ts.map +1 -0
- package/dist/sessions/types.js +2 -0
- package/dist/sessions/types.js.map +1 -0
- package/dist/store.d.ts +2 -19
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +1 -1
- package/dist/store.js.map +1 -1
- package/dist/tools/event.d.ts +30 -36
- package/dist/tools/event.d.ts.map +1 -1
- package/dist/tools/event.js +207 -26
- package/dist/tools/event.js.map +1 -1
- package/dist/tools/index.d.ts +2 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/sandbox.d.ts.map +1 -1
- package/dist/tools/sandbox.js +1 -1
- package/dist/tools/sandbox.js.map +1 -1
- package/dist/tools/truncate.d.ts +2 -26
- package/dist/tools/truncate.d.ts.map +1 -1
- package/dist/tools/truncate.js.map +1 -1
- package/dist/tools/types.d.ts +54 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/trigger.d.ts +2 -13
- package/dist/trigger.d.ts.map +1 -1
- package/dist/trigger.js.map +1 -1
- package/dist/types.d.ts +307 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/date.d.ts +10 -0
- package/dist/utils/date.d.ts.map +1 -0
- package/dist/utils/date.js +23 -0
- package/dist/utils/date.js.map +1 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/file-guards.d.ts.map +1 -0
- package/dist/utils/file-guards.js.map +1 -0
- package/dist/utils/fs-atomic.d.ts.map +1 -0
- package/dist/utils/fs-atomic.js.map +1 -0
- package/dist/utils/html.d.ts.map +1 -0
- package/dist/utils/html.js.map +1 -0
- package/dist/utils/http-body.d.ts +10 -0
- package/dist/utils/http-body.d.ts.map +1 -0
- package/dist/utils/http-body.js +34 -0
- package/dist/utils/http-body.js.map +1 -0
- package/dist/vault/index.d.ts +34 -0
- package/dist/vault/index.d.ts.map +1 -0
- package/dist/{vault.js → vault/index.js} +4 -4
- package/dist/vault/index.js.map +1 -0
- package/dist/{vault-routing.d.ts → vault/routing.d.ts} +2 -2
- package/dist/vault/routing.d.ts.map +1 -0
- package/dist/{vault-routing.js → vault/routing.js} +2 -2
- package/dist/vault/routing.js.map +1 -0
- package/dist/{vault.d.ts → vault/types.d.ts} +3 -34
- package/dist/vault/types.d.ts.map +1 -0
- package/dist/vault/types.js +2 -0
- package/dist/vault/types.js.map +1 -0
- package/dist/web/admin/portal.d.ts +5 -0
- package/dist/web/admin/portal.d.ts.map +1 -0
- package/dist/{admin → web/admin}/portal.js +140 -52
- package/dist/web/admin/portal.js.map +1 -0
- package/dist/web/admin/store.d.ts +13 -0
- package/dist/web/admin/store.d.ts.map +1 -0
- package/dist/web/admin/store.js +23 -0
- package/dist/web/admin/store.js.map +1 -0
- package/dist/web/admin/types.d.ts +28 -0
- package/dist/web/admin/types.d.ts.map +1 -0
- package/dist/web/admin/types.js +2 -0
- package/dist/web/admin/types.js.map +1 -0
- package/dist/web/login/oauth.d.ts +6 -0
- package/dist/web/login/oauth.d.ts.map +1 -0
- package/dist/{login/index.js → web/login/oauth.js} +33 -30
- package/dist/web/login/oauth.js.map +1 -0
- package/dist/{login → web/login}/portal.d.ts +5 -5
- package/dist/web/login/portal.d.ts.map +1 -0
- package/dist/{login → web/login}/portal.js +16 -35
- package/dist/web/login/portal.js.map +1 -0
- package/dist/web/login/store.d.ts +12 -0
- package/dist/web/login/store.d.ts.map +1 -0
- package/dist/web/login/store.js +28 -0
- package/dist/web/login/store.js.map +1 -0
- package/dist/web/login/types.d.ts +50 -0
- package/dist/web/login/types.d.ts.map +1 -0
- package/dist/web/login/types.js +2 -0
- package/dist/web/login/types.js.map +1 -0
- package/dist/web/session-view/command.d.ts +4 -0
- package/dist/web/session-view/command.d.ts.map +1 -0
- package/dist/{session-view → web/session-view}/command.js +1 -1
- package/dist/web/session-view/command.js.map +1 -0
- package/dist/{session-view → web/session-view}/portal.d.ts +2 -5
- package/dist/web/session-view/portal.d.ts.map +1 -0
- package/dist/{session-view → web/session-view}/portal.js +5 -5
- package/dist/web/session-view/portal.js.map +1 -0
- package/dist/web/session-view/service.d.ts +6 -0
- package/dist/web/session-view/service.d.ts.map +1 -0
- package/dist/{session-view → web/session-view}/service.js +6 -36
- package/dist/web/session-view/service.js.map +1 -0
- package/dist/web/session-view/store.d.ts +8 -0
- package/dist/web/session-view/store.d.ts.map +1 -0
- package/dist/web/session-view/store.js +20 -0
- package/dist/web/session-view/store.js.map +1 -0
- package/dist/{session-view/service.d.ts → web/session-view/types.d.ts} +20 -4
- package/dist/web/session-view/types.d.ts.map +1 -0
- package/dist/web/session-view/types.js +2 -0
- package/dist/web/session-view/types.js.map +1 -0
- package/dist/web/token-store.d.ts +19 -0
- package/dist/web/token-store.d.ts.map +1 -0
- package/dist/web/token-store.js +45 -0
- package/dist/web/token-store.js.map +1 -0
- package/dist/web/types.d.ts +5 -0
- package/dist/web/types.d.ts.map +1 -0
- package/dist/web/types.js +2 -0
- package/dist/web/types.js.map +1 -0
- package/package.json +1 -1
- package/dist/adapters/discord/index.d.ts +0 -3
- package/dist/adapters/discord/index.d.ts.map +0 -1
- package/dist/adapters/discord/index.js +0 -3
- package/dist/adapters/discord/index.js.map +0 -1
- package/dist/adapters/slack/index.d.ts +0 -3
- package/dist/adapters/slack/index.d.ts.map +0 -1
- package/dist/adapters/slack/index.js +0 -3
- package/dist/adapters/slack/index.js.map +0 -1
- package/dist/adapters/slack/thread-manager.d.ts +0 -19
- package/dist/adapters/slack/thread-manager.d.ts.map +0 -1
- package/dist/adapters/slack/thread-manager.js +0 -11
- package/dist/adapters/slack/thread-manager.js.map +0 -1
- package/dist/adapters/telegram/index.d.ts +0 -3
- package/dist/adapters/telegram/index.d.ts.map +0 -1
- package/dist/adapters/telegram/index.js +0 -3
- package/dist/adapters/telegram/index.js.map +0 -1
- package/dist/admin/portal.d.ts +0 -27
- package/dist/admin/portal.d.ts.map +0 -1
- package/dist/admin/portal.js.map +0 -1
- package/dist/admin/store.d.ts +0 -22
- package/dist/admin/store.d.ts.map +0 -1
- package/dist/admin/store.js +0 -39
- package/dist/admin/store.js.map +0 -1
- package/dist/commands/index.d.ts +0 -5
- package/dist/commands/index.d.ts.map +0 -1
- package/dist/commands/index.js +0 -20
- package/dist/commands/index.js.map +0 -1
- package/dist/env.d.ts.map +0 -1
- package/dist/env.js.map +0 -1
- package/dist/file-guards.d.ts.map +0 -1
- package/dist/file-guards.js.map +0 -1
- package/dist/fs-atomic.d.ts.map +0 -1
- package/dist/fs-atomic.js.map +0 -1
- package/dist/html.d.ts.map +0 -1
- package/dist/html.js.map +0 -1
- package/dist/instrument.d.ts.map +0 -1
- package/dist/instrument.js.map +0 -1
- package/dist/login/index.d.ts +0 -43
- package/dist/login/index.d.ts.map +0 -1
- package/dist/login/index.js.map +0 -1
- package/dist/login/portal.d.ts.map +0 -1
- package/dist/login/portal.js.map +0 -1
- package/dist/login/store.d.ts +0 -26
- package/dist/login/store.d.ts.map +0 -1
- package/dist/login/store.js +0 -56
- package/dist/login/store.js.map +0 -1
- package/dist/runtime/index.d.ts +0 -2
- package/dist/runtime/index.d.ts.map +0 -1
- package/dist/runtime/index.js +0 -2
- package/dist/runtime/index.js.map +0 -1
- package/dist/sentry.d.ts.map +0 -1
- package/dist/sentry.js.map +0 -1
- package/dist/session-view/command.d.ts +0 -5
- package/dist/session-view/command.d.ts.map +0 -1
- package/dist/session-view/command.js.map +0 -1
- package/dist/session-view/portal.d.ts.map +0 -1
- package/dist/session-view/portal.js.map +0 -1
- package/dist/session-view/service.d.ts.map +0 -1
- package/dist/session-view/service.js.map +0 -1
- package/dist/session-view/store.d.ts +0 -18
- package/dist/session-view/store.d.ts.map +0 -1
- package/dist/session-view/store.js +0 -36
- package/dist/session-view/store.js.map +0 -1
- package/dist/ui-copy.d.ts.map +0 -1
- package/dist/ui-copy.js.map +0 -1
- package/dist/vault-routing.d.ts.map +0 -1
- package/dist/vault-routing.js.map +0 -1
- package/dist/vault.d.ts.map +0 -1
- package/dist/vault.js.map +0 -1
- /package/dist/{instrument.d.ts → observability/instrument.d.ts} +0 -0
- /package/dist/{sentry.js → observability/sentry.js} +0 -0
- /package/dist/{env.d.ts → utils/env.d.ts} +0 -0
- /package/dist/{env.js → utils/env.js} +0 -0
- /package/dist/{file-guards.d.ts → utils/file-guards.d.ts} +0 -0
- /package/dist/{file-guards.js → utils/file-guards.js} +0 -0
- /package/dist/{fs-atomic.d.ts → utils/fs-atomic.d.ts} +0 -0
- /package/dist/{fs-atomic.js → utils/fs-atomic.js} +0 -0
- /package/dist/{html.d.ts → utils/html.d.ts} +0 -0
- /package/dist/{html.js → utils/html.js} +0 -0
|
@@ -3,14 +3,15 @@ import { WebClient } from "@slack/web-api";
|
|
|
3
3
|
import { existsSync, readFileSync } from "fs";
|
|
4
4
|
import { readFile } from "fs/promises";
|
|
5
5
|
import { basename, join } from "path";
|
|
6
|
+
import { resolveConversationSettings } from "../../config.js";
|
|
6
7
|
import * as log from "../../log.js";
|
|
7
|
-
import { PRODUCT_NAME, formatForceStopped, formatNothingRunning } from "../../
|
|
8
|
+
import { PRODUCT_NAME, formatForceStopped, formatNothingRunning } from "../../platform-messages.js";
|
|
8
9
|
import { appendBotResponseLog, appendChannelLog, ChannelQueue, resolveOnlyScopedStopTarget, resolveStopTarget, withRetry, } from "../shared.js";
|
|
9
|
-
import {
|
|
10
|
+
import { processMessageIntake } from "../intake.js";
|
|
10
11
|
import { createSlackAdapters } from "./context.js";
|
|
11
12
|
import { hasMaterializedChatSession, registerThreadSession, } from "../../sessions/chat-session-manager.js";
|
|
12
13
|
import { isSlackThreadSessionKey, planSlackAdapterSession, planSlackEventAnchorRun, resolveSlackSessionKey, } from "./session.js";
|
|
13
|
-
import { reportUserFacingError } from "../../sentry.js";
|
|
14
|
+
import { reportUserFacingError } from "../../observability/sentry.js";
|
|
14
15
|
const SLACK_EVENT_ANCHOR_TEXT = "Working on it...";
|
|
15
16
|
// Slack WebClient errors carry either `code: "rate_limited"` (retry-after) or
|
|
16
17
|
// the legacy `data.error === "rate_limited"` / 429 status shape.
|
|
@@ -53,10 +54,30 @@ function buildSlackAppMessageText(event) {
|
|
|
53
54
|
const deduped = parts.filter((part, index) => parts.indexOf(part) === index);
|
|
54
55
|
return deduped.join("\n");
|
|
55
56
|
}
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// Shared mrkdwn truncation helper
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
const MRKDWN_CONTEXT_TEXT_LIMIT = 3000;
|
|
61
|
+
/**
|
|
62
|
+
* Build a Slack context block whose text is capped at the mrkdwn limit.
|
|
63
|
+
* Used for muted diagnostics and ephemeral command responses.
|
|
64
|
+
*/
|
|
65
|
+
export function buildMrkdwnContextBlock(text) {
|
|
66
|
+
const blockText = text.length > MRKDWN_CONTEXT_TEXT_LIMIT
|
|
67
|
+
? text.substring(0, MRKDWN_CONTEXT_TEXT_LIMIT - 20) + "\n_(truncated)_"
|
|
68
|
+
: text;
|
|
69
|
+
return { type: "context", elements: [{ type: "mrkdwn", text: blockText }] };
|
|
70
|
+
}
|
|
56
71
|
// ============================================================================
|
|
57
72
|
// SlackBot
|
|
58
73
|
// ============================================================================
|
|
59
74
|
export class SlackBot {
|
|
75
|
+
createAdapters(event) {
|
|
76
|
+
return createSlackAdapters(event, this, {
|
|
77
|
+
replyMode: resolveConversationSettings(join(this.workingDir, event.conversationId)).slack?.replyMode ??
|
|
78
|
+
"top-level",
|
|
79
|
+
});
|
|
80
|
+
}
|
|
60
81
|
constructor(handler, config) {
|
|
61
82
|
this.botUserId = null;
|
|
62
83
|
this.botId = null;
|
|
@@ -163,16 +184,10 @@ export class SlackBot {
|
|
|
163
184
|
}
|
|
164
185
|
async postPrivateDiagnostic(conversationId, userId, text, options) {
|
|
165
186
|
if (options?.style !== "muted") {
|
|
166
|
-
await this.
|
|
187
|
+
await this.postEphemeral(conversationId, userId, options?.style === "error" ? `_${text}_` : text);
|
|
167
188
|
return;
|
|
168
189
|
}
|
|
169
|
-
|
|
170
|
-
const blockText = text.length > CONTEXT_TEXT_LIMIT
|
|
171
|
-
? text.substring(0, CONTEXT_TEXT_LIMIT - 20) + "\n_(truncated)_"
|
|
172
|
-
: text;
|
|
173
|
-
await this.postEphemeralBlocks(conversationId, userId, text, [
|
|
174
|
-
{ type: "context", elements: [{ type: "mrkdwn", text: blockText }] },
|
|
175
|
-
]);
|
|
190
|
+
await this.postEphemeralBlocks(conversationId, userId, text, [buildMrkdwnContextBlock(text)]);
|
|
176
191
|
}
|
|
177
192
|
async openDirectMessage(userId) {
|
|
178
193
|
return slackRetry(async () => {
|
|
@@ -189,6 +204,33 @@ export class SlackBot {
|
|
|
189
204
|
await this.webClient.chat.update({ channel, ts, text });
|
|
190
205
|
});
|
|
191
206
|
}
|
|
207
|
+
async startMessageStream(channel, text, threadTs) {
|
|
208
|
+
return slackRetry(async () => {
|
|
209
|
+
const result = await this.webClient.apiCall("chat.startStream", {
|
|
210
|
+
channel,
|
|
211
|
+
markdown_text: text,
|
|
212
|
+
...(threadTs ? { thread_ts: threadTs } : {}),
|
|
213
|
+
});
|
|
214
|
+
const ts = result.ts;
|
|
215
|
+
if (!ts)
|
|
216
|
+
throw new Error("Slack chat.startStream did not return ts");
|
|
217
|
+
return ts;
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
async appendMessageStream(channel, ts, text) {
|
|
221
|
+
return slackRetry(async () => {
|
|
222
|
+
await this.webClient.apiCall("chat.appendStream", {
|
|
223
|
+
channel,
|
|
224
|
+
ts,
|
|
225
|
+
markdown_text: text,
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
async stopMessageStream(channel, ts) {
|
|
230
|
+
return slackRetry(async () => {
|
|
231
|
+
await this.webClient.apiCall("chat.stopStream", { channel, ts });
|
|
232
|
+
});
|
|
233
|
+
}
|
|
192
234
|
async deleteMessage(channel, ts) {
|
|
193
235
|
return slackRetry(async () => {
|
|
194
236
|
await this.webClient.chat.delete({ channel, ts });
|
|
@@ -353,6 +395,8 @@ export class SlackBot {
|
|
|
353
395
|
};
|
|
354
396
|
const adapters = createSlackAdapters(slackEvent, this, {
|
|
355
397
|
initialMessageTs: eventPlan.initialMessageTs,
|
|
398
|
+
replyMode: resolveConversationSettings(join(this.workingDir, eventForRun.conversationId)).slack
|
|
399
|
+
?.replyMode ?? "top-level",
|
|
356
400
|
});
|
|
357
401
|
return this.handler.handleEvent(eventForRun, this, adapters);
|
|
358
402
|
});
|
|
@@ -383,6 +427,22 @@ export class SlackBot {
|
|
|
383
427
|
sessionKey,
|
|
384
428
|
});
|
|
385
429
|
}
|
|
430
|
+
processSlackMessageIntake(options) {
|
|
431
|
+
void processMessageIntake({
|
|
432
|
+
eventBase: options.event,
|
|
433
|
+
workingDir: this.workingDir,
|
|
434
|
+
isAutoReplyCandidate: options.isAutoReplyCandidate,
|
|
435
|
+
logEntryBase: {},
|
|
436
|
+
processAttachments: () => options.attachmentsPromise,
|
|
437
|
+
queueKey: options.queueKey,
|
|
438
|
+
enqueue: (queueKey, work) => this.getQueue(queueKey).enqueue(work),
|
|
439
|
+
handler: this.handler,
|
|
440
|
+
bot: this,
|
|
441
|
+
createAdapters: (event) => this.createAdapters(event),
|
|
442
|
+
onNotTriggered: options.onNotTriggered,
|
|
443
|
+
deferAttachmentsUntilRun: true,
|
|
444
|
+
});
|
|
445
|
+
}
|
|
386
446
|
buildHomeView() {
|
|
387
447
|
const blocks = [
|
|
388
448
|
{
|
|
@@ -552,11 +612,7 @@ export class SlackBot {
|
|
|
552
612
|
this.logBotResponse(conversationId, responseText, messageTs);
|
|
553
613
|
};
|
|
554
614
|
const respondMuted = async (responseText) => {
|
|
555
|
-
const
|
|
556
|
-
const blockText = responseText.length > CONTEXT_TEXT_LIMIT
|
|
557
|
-
? responseText.substring(0, CONTEXT_TEXT_LIMIT - 20) + "\n_(truncated)_"
|
|
558
|
-
: responseText;
|
|
559
|
-
const blocks = [{ type: "context", elements: [{ type: "mrkdwn", text: blockText }] }];
|
|
615
|
+
const blocks = [buildMrkdwnContextBlock(responseText)];
|
|
560
616
|
if (options.ephemeralChannelId) {
|
|
561
617
|
await this.postEphemeralBlocks(options.ephemeralChannelId, userId, responseText, blocks, options.threadTs);
|
|
562
618
|
return;
|
|
@@ -627,22 +683,6 @@ export class SlackBot {
|
|
|
627
683
|
const adapters = this.createCommandAdapters(conversationId, payload.user_id, userName, commandText, eventTs, isDirectMessage ? { threadTs } : { ephemeralChannelId: conversationId, threadTs });
|
|
628
684
|
return { event, adapters };
|
|
629
685
|
}
|
|
630
|
-
createSlashCommandBot(conversationId, threadTs) {
|
|
631
|
-
return {
|
|
632
|
-
start: async () => { },
|
|
633
|
-
postMessage: async (_channel, text) => {
|
|
634
|
-
if (threadTs) {
|
|
635
|
-
return this.postInThread(conversationId, threadTs, text);
|
|
636
|
-
}
|
|
637
|
-
return this.postMessage(conversationId, text);
|
|
638
|
-
},
|
|
639
|
-
updateMessage: async (channel, ts, text) => {
|
|
640
|
-
await this.updateMessage(channel, ts, text);
|
|
641
|
-
},
|
|
642
|
-
enqueueEvent: (event) => this.enqueueEvent(event),
|
|
643
|
-
getPlatformInfo: () => this.getPlatformInfo(),
|
|
644
|
-
};
|
|
645
|
-
}
|
|
646
686
|
async routeSlashLoginCommand(payload) {
|
|
647
687
|
const { event, adapters } = this.buildSlashCommandEvent(payload, {
|
|
648
688
|
type: payload.channel_id.startsWith("D") ? "dm" : "private_command",
|
|
@@ -668,19 +708,19 @@ export class SlackBot {
|
|
|
668
708
|
attachments: [],
|
|
669
709
|
isBot: false,
|
|
670
710
|
});
|
|
671
|
-
const commandBot =
|
|
711
|
+
const commandBot = {
|
|
712
|
+
start: async () => { },
|
|
713
|
+
postMessage: async (_channel, text) => this.postMessage(conversationId, text),
|
|
714
|
+
updateMessage: async (channel, ts, text) => this.updateMessage(channel, ts, text),
|
|
715
|
+
enqueueEvent: (event) => this.enqueueEvent(event),
|
|
716
|
+
getPlatformInfo: () => this.getPlatformInfo(),
|
|
717
|
+
};
|
|
672
718
|
await this.handler.handleNewCommand(conversationId, conversationId, commandBot);
|
|
673
719
|
}
|
|
674
720
|
async routeSlashModelCommand(payload) {
|
|
675
721
|
const { event, adapters } = this.buildSlashCommandEvent(payload, { includeText: true });
|
|
676
722
|
await this.handler.handleEvent(event, this, adapters);
|
|
677
723
|
}
|
|
678
|
-
async routeSlashSandboxCommand(payload) {
|
|
679
|
-
await this.routeSlashModelCommand(payload);
|
|
680
|
-
}
|
|
681
|
-
async routeSlashAutoReplyCommand(payload) {
|
|
682
|
-
await this.routeSlashModelCommand(payload);
|
|
683
|
-
}
|
|
684
724
|
async routeSlashSessionCommand(payload) {
|
|
685
725
|
const { event, adapters } = this.buildSlashCommandEvent(payload, { thread: true });
|
|
686
726
|
await this.handler.handleEvent(event, this, adapters);
|
|
@@ -754,10 +794,11 @@ export class SlackBot {
|
|
|
754
794
|
ack();
|
|
755
795
|
return;
|
|
756
796
|
}
|
|
757
|
-
this.
|
|
758
|
-
slackEvent
|
|
759
|
-
|
|
760
|
-
|
|
797
|
+
this.processSlackMessageIntake({
|
|
798
|
+
event: slackEvent,
|
|
799
|
+
attachmentsPromise,
|
|
800
|
+
queueKey: this.resolveQueueKey(e.channel, sessionKey),
|
|
801
|
+
isAutoReplyCandidate: false,
|
|
761
802
|
});
|
|
762
803
|
ack();
|
|
763
804
|
}
|
|
@@ -853,10 +894,11 @@ export class SlackBot {
|
|
|
853
894
|
// treats the message ts as a thread session (`channel:ts`) instead of the
|
|
854
895
|
// persistent top-level channel session.
|
|
855
896
|
slackEvent.sessionKey = activeSessionKey;
|
|
856
|
-
this.
|
|
857
|
-
slackEvent
|
|
858
|
-
|
|
859
|
-
|
|
897
|
+
this.processSlackMessageIntake({
|
|
898
|
+
event: slackEvent,
|
|
899
|
+
attachmentsPromise,
|
|
900
|
+
queueKey: this.resolveQueueKey(e.channel, activeSessionKey),
|
|
901
|
+
isAutoReplyCandidate: false,
|
|
860
902
|
});
|
|
861
903
|
};
|
|
862
904
|
const logOnly = () => {
|
|
@@ -874,18 +916,14 @@ export class SlackBot {
|
|
|
874
916
|
ack();
|
|
875
917
|
return;
|
|
876
918
|
}
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
// been queued for logging via logUserMessage above.
|
|
881
|
-
evaluateAutoReplyPolicy({
|
|
919
|
+
const activeSessionKey = resolveSlackSessionKey(e.channel, e.thread_ts);
|
|
920
|
+
slackEvent.sessionKey = activeSessionKey;
|
|
921
|
+
this.processSlackMessageIntake({
|
|
882
922
|
event: slackEvent,
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
else
|
|
888
|
-
logOnly();
|
|
923
|
+
attachmentsPromise,
|
|
924
|
+
queueKey: this.resolveQueueKey(e.channel, activeSessionKey),
|
|
925
|
+
isAutoReplyCandidate: true,
|
|
926
|
+
onNotTriggered: logOnly,
|
|
889
927
|
});
|
|
890
928
|
ack();
|
|
891
929
|
}
|
|
@@ -895,62 +933,56 @@ export class SlackBot {
|
|
|
895
933
|
if (!payload.command || !payload.channel_id || !payload.user_id) {
|
|
896
934
|
return;
|
|
897
935
|
}
|
|
898
|
-
const
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
channel_id: payload.channel_id,
|
|
949
|
-
user_id: payload.user_id,
|
|
950
|
-
user_name: payload.user_name,
|
|
951
|
-
thread_ts: payload.thread_ts,
|
|
952
|
-
})
|
|
953
|
-
: null;
|
|
936
|
+
const { command, text, channel_id, user_id, user_name, thread_ts } = payload;
|
|
937
|
+
let handlerPromise = null;
|
|
938
|
+
if (command === "/pi-login") {
|
|
939
|
+
handlerPromise = this.routeSlashLoginCommand({
|
|
940
|
+
command,
|
|
941
|
+
text,
|
|
942
|
+
channel_id,
|
|
943
|
+
user_id,
|
|
944
|
+
user_name,
|
|
945
|
+
});
|
|
946
|
+
}
|
|
947
|
+
else if (command === "/pi-new") {
|
|
948
|
+
handlerPromise = this.routeSlashNewCommand({ command, channel_id, user_id, user_name });
|
|
949
|
+
}
|
|
950
|
+
else if (command === "/pi-session") {
|
|
951
|
+
handlerPromise = this.routeSlashSessionCommand({
|
|
952
|
+
command,
|
|
953
|
+
channel_id,
|
|
954
|
+
user_id,
|
|
955
|
+
user_name,
|
|
956
|
+
thread_ts,
|
|
957
|
+
});
|
|
958
|
+
}
|
|
959
|
+
else if (command === "/pi-model") {
|
|
960
|
+
handlerPromise = this.routeSlashModelCommand({
|
|
961
|
+
command,
|
|
962
|
+
text,
|
|
963
|
+
channel_id,
|
|
964
|
+
user_id,
|
|
965
|
+
user_name,
|
|
966
|
+
});
|
|
967
|
+
}
|
|
968
|
+
else if (command === "/pi-sandbox" || command === "/pi-auto-reply") {
|
|
969
|
+
handlerPromise = this.routeSlashModelCommand({
|
|
970
|
+
command,
|
|
971
|
+
text,
|
|
972
|
+
channel_id,
|
|
973
|
+
user_id,
|
|
974
|
+
user_name,
|
|
975
|
+
});
|
|
976
|
+
}
|
|
977
|
+
else if (command === "/pi-admin") {
|
|
978
|
+
handlerPromise = this.routeSlashAdminCommand({
|
|
979
|
+
command,
|
|
980
|
+
channel_id,
|
|
981
|
+
user_id,
|
|
982
|
+
user_name,
|
|
983
|
+
thread_ts,
|
|
984
|
+
});
|
|
985
|
+
}
|
|
954
986
|
if (!handlerPromise) {
|
|
955
987
|
return;
|
|
956
988
|
}
|
|
@@ -972,7 +1004,7 @@ export class SlackBot {
|
|
|
972
1004
|
log.logWarning(`Failed to publish App Home view`, String(err));
|
|
973
1005
|
});
|
|
974
1006
|
}
|
|
975
|
-
async handleBlockAction({ body, ack }) {
|
|
1007
|
+
async handleBlockAction({ body, ack, }) {
|
|
976
1008
|
const action = body.actions?.[0];
|
|
977
1009
|
if (!action) {
|
|
978
1010
|
ack();
|
|
@@ -1073,7 +1105,7 @@ export class SlackBot {
|
|
|
1073
1105
|
attachments: [],
|
|
1074
1106
|
sessionKey,
|
|
1075
1107
|
};
|
|
1076
|
-
return this.handler.handleEvent(event, this,
|
|
1108
|
+
return this.handler.handleEvent(event, this, this.createAdapters(slackEvent));
|
|
1077
1109
|
});
|
|
1078
1110
|
}
|
|
1079
1111
|
/**
|