@geminixiang/mikan 1.0.0-beta.45 → 1.0.0-beta.47
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 +47 -0
- package/README.md +12 -19
- 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/discord/bot.d.ts +6 -1
- package/dist/adapters/discord/bot.d.ts.map +1 -1
- package/dist/adapters/discord/bot.js +168 -144
- package/dist/adapters/discord/bot.js.map +1 -1
- package/dist/adapters/discord/context.d.ts +2 -8
- package/dist/adapters/discord/context.d.ts.map +1 -1
- package/dist/adapters/discord/context.js +1 -1
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/discord/format.d.ts.map +1 -1
- package/dist/adapters/discord/format.js +2 -4
- package/dist/adapters/discord/format.js.map +1 -1
- package/dist/adapters/github/bot.d.ts +6 -1
- package/dist/adapters/github/bot.d.ts.map +1 -1
- package/dist/adapters/github/bot.js +57 -25
- package/dist/adapters/github/bot.js.map +1 -1
- package/dist/adapters/github/context.d.ts +2 -9
- package/dist/adapters/github/context.d.ts.map +1 -1
- package/dist/adapters/github/context.js.map +1 -1
- package/dist/adapters/github/github-ops.d.ts +4 -17
- package/dist/adapters/github/github-ops.d.ts.map +1 -1
- package/dist/adapters/github/github-ops.js +17 -86
- package/dist/adapters/github/github-ops.js.map +1 -1
- package/dist/adapters/github/tool-pack.d.ts.map +1 -1
- package/dist/adapters/github/tool-pack.js +0 -1
- package/dist/adapters/github/tool-pack.js.map +1 -1
- package/dist/adapters/github/tools/checks.d.ts +0 -1
- package/dist/adapters/github/tools/checks.d.ts.map +1 -1
- package/dist/adapters/github/tools/checks.js +3 -22
- package/dist/adapters/github/tools/checks.js.map +1 -1
- package/dist/adapters/github/types.d.ts +0 -33
- package/dist/adapters/github/types.d.ts.map +1 -1
- package/dist/adapters/github/types.js.map +1 -1
- package/dist/adapters/progressive-renderer.d.ts.map +1 -1
- package/dist/adapters/progressive-renderer.js +311 -318
- package/dist/adapters/progressive-renderer.js.map +1 -1
- package/dist/adapters/shared.d.ts +12 -1
- package/dist/adapters/shared.d.ts.map +1 -1
- package/dist/adapters/shared.js +44 -1
- package/dist/adapters/shared.js.map +1 -1
- package/dist/adapters/slack/blocks.d.ts.map +1 -1
- package/dist/adapters/slack/blocks.js +1 -4
- package/dist/adapters/slack/blocks.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +15 -0
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +233 -206
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/context.d.ts +2 -8
- package/dist/adapters/slack/context.d.ts.map +1 -1
- package/dist/adapters/slack/context.js +1 -1
- package/dist/adapters/slack/context.js.map +1 -1
- package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
- package/dist/adapters/slack/response-lifecycle.js +135 -123
- package/dist/adapters/slack/response-lifecycle.js.map +1 -1
- package/dist/adapters/slack/stream-limits.d.ts +1 -1
- package/dist/adapters/slack/stream-limits.js +1 -1
- package/dist/adapters/slack/stream-limits.js.map +1 -1
- package/dist/adapters/slack/types.d.ts +4 -0
- package/dist/adapters/slack/types.d.ts.map +1 -1
- package/dist/adapters/slack/types.js.map +1 -1
- package/dist/adapters/telegram/bot.d.ts +3 -0
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +23 -7
- package/dist/adapters/telegram/bot.js.map +1 -1
- package/dist/adapters/telegram/context.d.ts +2 -8
- package/dist/adapters/telegram/context.d.ts.map +1 -1
- package/dist/adapters/telegram/context.js +1 -2
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/adapters/types.d.ts +11 -5
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/agent/catalog.d.ts +6 -18
- package/dist/agent/catalog.d.ts.map +1 -1
- package/dist/agent/catalog.js +24 -156
- package/dist/agent/catalog.js.map +1 -1
- package/dist/agent/execution.d.ts +0 -7
- package/dist/agent/execution.d.ts.map +1 -1
- package/dist/agent/execution.js +23 -21
- package/dist/agent/execution.js.map +1 -1
- package/dist/agent/presenter.d.ts +7 -9
- package/dist/agent/presenter.d.ts.map +1 -1
- package/dist/agent/presenter.js +355 -357
- package/dist/agent/presenter.js.map +1 -1
- package/dist/agent/prompt.d.ts +5 -12
- package/dist/agent/prompt.d.ts.map +1 -1
- package/dist/agent/prompt.js +56 -81
- package/dist/agent/prompt.js.map +1 -1
- package/dist/agent/runner.d.ts +0 -7
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +335 -318
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/types.d.ts +21 -17
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +0 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/cli/boot.d.ts.map +1 -1
- package/dist/cli/boot.js +7 -10
- package/dist/cli/boot.js.map +1 -1
- package/dist/cli/onboard.d.ts +10 -0
- package/dist/cli/onboard.d.ts.map +1 -0
- package/dist/cli/onboard.js +237 -0
- package/dist/cli/onboard.js.map +1 -0
- package/dist/cli/types.d.ts +8 -3
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/types.js.map +1 -1
- package/dist/commands/auto-reply.d.ts.map +1 -1
- package/dist/commands/auto-reply.js +5 -12
- package/dist/commands/auto-reply.js.map +1 -1
- package/dist/commands/manifest.d.ts.map +1 -1
- package/dist/commands/manifest.js +9 -16
- package/dist/commands/manifest.js.map +1 -1
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +15 -10
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +0 -2
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/sandbox.d.ts.map +1 -1
- package/dist/commands/sandbox.js +89 -70
- package/dist/commands/sandbox.js.map +1 -1
- package/dist/commands/session-view.js +9 -2
- package/dist/commands/session-view.js.map +1 -1
- package/dist/commands/types.d.ts +4 -3
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/types.js.map +1 -1
- package/dist/config.d.ts +13 -17
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +39 -37
- package/dist/config.js.map +1 -1
- package/dist/dream/index.d.ts +20 -0
- package/dist/dream/index.d.ts.map +1 -0
- package/dist/dream/index.js +253 -0
- package/dist/dream/index.js.map +1 -0
- package/dist/dream/types.d.ts +30 -0
- package/dist/dream/types.d.ts.map +1 -0
- package/dist/dream/types.js.map +1 -0
- package/dist/env-manifest.d.ts.map +1 -1
- package/dist/env-manifest.js +12 -27
- package/dist/env-manifest.js.map +1 -1
- package/dist/execution-resolver.d.ts +9 -2
- package/dist/execution-resolver.d.ts.map +1 -1
- package/dist/execution-resolver.js +26 -27
- package/dist/execution-resolver.js.map +1 -1
- package/dist/harness/event-format.d.ts +1 -2
- package/dist/harness/event-format.d.ts.map +1 -1
- package/dist/harness/event-format.js +9 -15
- package/dist/harness/event-format.js.map +1 -1
- package/dist/harness/index.d.ts +1 -7
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +0 -4
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/models.d.ts.map +1 -1
- package/dist/harness/models.js +15 -35
- package/dist/harness/models.js.map +1 -1
- package/dist/harness/runner.d.ts +7 -16
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +13 -131
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session-store.d.ts +1 -1
- package/dist/harness/session-store.d.ts.map +1 -1
- package/dist/harness/session-store.js +1 -1
- package/dist/harness/session-store.js.map +1 -1
- package/dist/harness/subagent-runner.d.ts +2 -2
- package/dist/harness/subagent-runner.d.ts.map +1 -1
- package/dist/harness/subagent-runner.js +157 -162
- package/dist/harness/subagent-runner.js.map +1 -1
- package/dist/harness/types.d.ts +1 -13
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/index.d.ts +3 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -5
- package/dist/index.js.map +1 -1
- package/dist/main.js +103 -222
- package/dist/main.js.map +1 -1
- package/dist/mcp/catalog.d.ts +5 -0
- package/dist/mcp/catalog.d.ts.map +1 -0
- package/dist/mcp/catalog.js +156 -0
- package/dist/mcp/catalog.js.map +1 -0
- package/dist/mcp/loader.d.ts +3 -2
- package/dist/mcp/loader.d.ts.map +1 -1
- package/dist/mcp/loader.js +54 -23
- package/dist/mcp/loader.js.map +1 -1
- package/dist/mcp/open-connector.d.ts +14 -0
- package/dist/mcp/open-connector.d.ts.map +1 -0
- package/dist/mcp/open-connector.js +203 -0
- package/dist/mcp/open-connector.js.map +1 -0
- package/dist/mcp/types.d.ts +28 -0
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js.map +1 -1
- package/dist/office/index.d.ts +136 -8
- package/dist/office/index.d.ts.map +1 -1
- package/dist/office/index.js +1050 -9
- package/dist/office/index.js.map +1 -1
- package/dist/office/types.d.ts +19 -1
- package/dist/office/types.d.ts.map +1 -1
- package/dist/office/types.js.map +1 -1
- package/dist/packages/index.d.ts +168 -5
- package/dist/packages/index.d.ts.map +1 -1
- package/dist/packages/index.js +720 -5
- package/dist/packages/index.js.map +1 -1
- package/dist/packages/types.d.ts +1 -5
- package/dist/packages/types.d.ts.map +1 -1
- package/dist/packages/types.js.map +1 -1
- package/dist/process-lifecycle.d.ts +19 -0
- package/dist/process-lifecycle.d.ts.map +1 -0
- package/dist/process-lifecycle.js +60 -0
- package/dist/process-lifecycle.js.map +1 -0
- package/dist/provisioner.d.ts +2 -9
- package/dist/provisioner.d.ts.map +1 -1
- package/dist/provisioner.js +3 -12
- package/dist/provisioner.js.map +1 -1
- package/dist/runtime/conversation-runtime.d.ts.map +1 -1
- package/dist/runtime/conversation-runtime.js +124 -380
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/session-lifecycle.d.ts +34 -18
- package/dist/runtime/session-lifecycle.d.ts.map +1 -1
- package/dist/runtime/session-lifecycle.js +179 -46
- package/dist/runtime/session-lifecycle.js.map +1 -1
- package/dist/runtime/types.d.ts +8 -26
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/cloudflare.d.ts.map +1 -1
- package/dist/sandbox/cloudflare.js +2 -3
- package/dist/sandbox/cloudflare.js.map +1 -1
- package/dist/sandbox/container.d.ts +0 -1
- package/dist/sandbox/container.d.ts.map +1 -1
- package/dist/sandbox/container.js +2 -3
- package/dist/sandbox/container.js.map +1 -1
- package/dist/sandbox/host.d.ts.map +1 -1
- package/dist/sandbox/host.js +4 -2
- package/dist/sandbox/host.js.map +1 -1
- package/dist/sandbox/identity.d.ts +10 -19
- package/dist/sandbox/identity.d.ts.map +1 -1
- package/dist/sandbox/identity.js +8 -8
- package/dist/sandbox/identity.js.map +1 -1
- package/dist/sandbox/index.d.ts +7 -10
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +45 -16
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/types.d.ts +13 -45
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sandbox/types.js.map +1 -1
- package/dist/sandbox/utils.d.ts +5 -0
- package/dist/sandbox/utils.d.ts.map +1 -1
- package/dist/sandbox/utils.js +10 -0
- package/dist/sandbox/utils.js.map +1 -1
- package/dist/sessions/chat-history-sync.d.ts +1 -3
- package/dist/sessions/chat-history-sync.d.ts.map +1 -1
- package/dist/sessions/chat-history-sync.js +58 -11
- package/dist/sessions/chat-history-sync.js.map +1 -1
- package/dist/sessions/migrate-v3.d.ts +2 -5
- package/dist/sessions/migrate-v3.d.ts.map +1 -1
- package/dist/sessions/migrate-v3.js +17 -1
- package/dist/sessions/migrate-v3.js.map +1 -1
- package/dist/sessions/store.d.ts +5 -6
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +62 -2
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +9 -0
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +2 -10
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/read.js +2 -2
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/sandbox.d.ts.map +1 -1
- package/dist/tools/sandbox.js +2 -3
- package/dist/tools/sandbox.js.map +1 -1
- package/dist/tools/subagent.d.ts +1 -1
- package/dist/tools/subagent.js.map +1 -1
- package/dist/types.d.ts +54 -130
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vault/index.d.ts +9 -2
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +29 -5
- package/dist/vault/index.js.map +1 -1
- package/dist/web/admin/portal.d.ts +12 -1
- package/dist/web/admin/portal.d.ts.map +1 -1
- package/dist/web/admin/portal.js +437 -422
- package/dist/web/admin/portal.js.map +1 -1
- package/dist/web/admin/types.d.ts +2 -2
- package/dist/web/admin/types.d.ts.map +1 -1
- package/dist/web/admin/types.js.map +1 -1
- package/dist/web/login/portal.d.ts +7 -1
- package/dist/web/login/portal.d.ts.map +1 -1
- package/dist/web/login/portal.js +143 -78
- package/dist/web/login/portal.js.map +1 -1
- package/dist/web/portal-shell.d.ts +1 -0
- package/dist/web/portal-shell.d.ts.map +1 -1
- package/dist/web/portal-shell.js +12 -1
- package/dist/web/portal-shell.js.map +1 -1
- package/dist/web/server.d.ts +3 -3
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js.map +1 -1
- package/dist/web/session-view/portal.d.ts +8 -1
- package/dist/web/session-view/portal.d.ts.map +1 -1
- package/dist/web/session-view/portal.js +609 -132
- package/dist/web/session-view/portal.js.map +1 -1
- package/dist/web/session-view/types.d.ts +8 -0
- package/dist/web/session-view/types.d.ts.map +1 -1
- package/dist/web/session-view/types.js.map +1 -1
- package/dist/workspace-projection/index.d.ts +14 -2
- package/dist/workspace-projection/index.d.ts.map +1 -1
- package/dist/workspace-projection/index.js +102 -14
- package/dist/workspace-projection/index.js.map +1 -1
- package/dist/workspace-projection/types.d.ts +14 -1
- package/dist/workspace-projection/types.d.ts.map +1 -1
- package/dist/workspace-projection/types.js.map +1 -1
- package/package.json +3 -5
- package/dist/adapters/github/cloudbuild.d.ts +0 -19
- package/dist/adapters/github/cloudbuild.d.ts.map +0 -1
- package/dist/adapters/github/cloudbuild.js +0 -71
- package/dist/adapters/github/cloudbuild.js.map +0 -1
- package/dist/adapters/github/gcp-auth.d.ts +0 -28
- package/dist/adapters/github/gcp-auth.d.ts.map +0 -1
- package/dist/adapters/github/gcp-auth.js +0 -196
- package/dist/adapters/github/gcp-auth.js.map +0 -1
- package/dist/agent/index.d.ts +0 -9
- package/dist/agent/index.d.ts.map +0 -1
- package/dist/agent/index.js +0 -8
- package/dist/agent/index.js.map +0 -1
- package/dist/cli/ext-dev.d.ts +0 -2
- package/dist/cli/ext-dev.d.ts.map +0 -1
- package/dist/cli/ext-dev.js +0 -188
- package/dist/cli/ext-dev.js.map +0 -1
- package/dist/cli/ext.d.ts +0 -2
- package/dist/cli/ext.d.ts.map +0 -1
- package/dist/cli/ext.js +0 -324
- package/dist/cli/ext.js.map +0 -1
- package/dist/commands/extensions.d.ts +0 -26
- package/dist/commands/extensions.d.ts.map +0 -1
- package/dist/commands/extensions.js +0 -103
- package/dist/commands/extensions.js.map +0 -1
- package/dist/extension-schedules.d.ts +0 -31
- package/dist/extension-schedules.d.ts.map +0 -1
- package/dist/extension-schedules.js +0 -229
- package/dist/extension-schedules.js.map +0 -1
- package/dist/harness/auth.d.ts +0 -17
- package/dist/harness/auth.d.ts.map +0 -1
- package/dist/harness/auth.js +0 -92
- package/dist/harness/auth.js.map +0 -1
- package/dist/harness/extensions/loader.d.ts +0 -40
- package/dist/harness/extensions/loader.d.ts.map +0 -1
- package/dist/harness/extensions/loader.js +0 -723
- package/dist/harness/extensions/loader.js.map +0 -1
- package/dist/harness/extensions/registry.d.ts +0 -155
- package/dist/harness/extensions/registry.d.ts.map +0 -1
- package/dist/harness/extensions/registry.js +0 -420
- package/dist/harness/extensions/registry.js.map +0 -1
- package/dist/harness/extensions/types.d.ts +0 -665
- package/dist/harness/extensions/types.d.ts.map +0 -1
- package/dist/harness/extensions/types.js.map +0 -1
- package/dist/office/address.d.ts +0 -31
- package/dist/office/address.d.ts.map +0 -1
- package/dist/office/address.js +0 -113
- package/dist/office/address.js.map +0 -1
- package/dist/office/layout.d.ts +0 -27
- package/dist/office/layout.d.ts.map +0 -1
- package/dist/office/layout.js +0 -97
- package/dist/office/layout.js.map +0 -1
- package/dist/office/migration.d.ts +0 -44
- package/dist/office/migration.d.ts.map +0 -1
- package/dist/office/migration.js +0 -255
- package/dist/office/migration.js.map +0 -1
- package/dist/office/registry.d.ts +0 -75
- package/dist/office/registry.d.ts.map +0 -1
- package/dist/office/registry.js +0 -646
- package/dist/office/registry.js.map +0 -1
- package/dist/packages/admin.d.ts +0 -17
- package/dist/packages/admin.d.ts.map +0 -1
- package/dist/packages/admin.js +0 -98
- package/dist/packages/admin.js.map +0 -1
- package/dist/packages/inspect.d.ts +0 -11
- package/dist/packages/inspect.d.ts.map +0 -1
- package/dist/packages/inspect.js +0 -98
- package/dist/packages/inspect.js.map +0 -1
- package/dist/packages/materialize.d.ts +0 -40
- package/dist/packages/materialize.d.ts.map +0 -1
- package/dist/packages/materialize.js +0 -297
- package/dist/packages/materialize.js.map +0 -1
- package/dist/packages/resolve.d.ts +0 -25
- package/dist/packages/resolve.d.ts.map +0 -1
- package/dist/packages/resolve.js +0 -208
- package/dist/packages/resolve.js.map +0 -1
- package/dist/packages/source.d.ts +0 -39
- package/dist/packages/source.d.ts.map +0 -1
- package/dist/packages/source.js +0 -189
- package/dist/packages/source.js.map +0 -1
- package/dist/sandbox/errors.d.ts +0 -6
- package/dist/sandbox/errors.d.ts.map +0 -1
- package/dist/sandbox/errors.js +0 -11
- package/dist/sandbox/errors.js.map +0 -1
- package/dist/sandbox/firecracker.d.ts +0 -18
- package/dist/sandbox/firecracker.d.ts.map +0 -1
- package/dist/sandbox/firecracker.js +0 -223
- package/dist/sandbox/firecracker.js.map +0 -1
- package/dist/sandbox/gondolin.d.ts +0 -57
- package/dist/sandbox/gondolin.d.ts.map +0 -1
- package/dist/sandbox/gondolin.js +0 -764
- package/dist/sandbox/gondolin.js.map +0 -1
- package/dist/sandbox/image.d.ts +0 -3
- package/dist/sandbox/image.d.ts.map +0 -1
- package/dist/sandbox/image.js +0 -29
- package/dist/sandbox/image.js.map +0 -1
- package/dist/sessions/conversation-log.d.ts +0 -9
- package/dist/sessions/conversation-log.d.ts.map +0 -1
- package/dist/sessions/conversation-log.js +0 -50
- package/dist/sessions/conversation-log.js.map +0 -1
- package/dist/sessions/rotation.d.ts +0 -2
- package/dist/sessions/rotation.d.ts.map +0 -1
- package/dist/sessions/rotation.js +0 -41
- package/dist/sessions/rotation.js.map +0 -1
- package/dist/vault/disabled.d.ts +0 -9
- package/dist/vault/disabled.d.ts.map +0 -1
- package/dist/vault/disabled.js +0 -25
- package/dist/vault/disabled.js.map +0 -1
- package/dist/web/admin/store.d.ts +0 -13
- package/dist/web/admin/store.d.ts.map +0 -1
- package/dist/web/admin/store.js +0 -14
- package/dist/web/admin/store.js.map +0 -1
- package/dist/web/login/store.d.ts +0 -8
- package/dist/web/login/store.d.ts.map +0 -1
- package/dist/web/login/store.js +0 -15
- package/dist/web/login/store.js.map +0 -1
- package/dist/web/session-view/service.d.ts +0 -6
- package/dist/web/session-view/service.d.ts.map +0 -1
- package/dist/web/session-view/service.js +0 -517
- package/dist/web/session-view/service.js.map +0 -1
- package/dist/web/session-view/store.d.ts +0 -8
- package/dist/web/session-view/store.d.ts.map +0 -1
- package/dist/web/session-view/store.js +0 -15
- package/dist/web/session-view/store.js.map +0 -1
- /package/dist/{harness/extensions → dream}/types.js +0 -0
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { SocketModeClient } from "@slack/socket-mode";
|
|
2
2
|
import { WebAPIRateLimitedError, WebClient } from "@slack/web-api";
|
|
3
|
-
import { readEnv } from "../../env-manifest.js";
|
|
4
3
|
import { existsSync, readFileSync } from "node:fs";
|
|
5
4
|
import { readFile, writeFile } from "node:fs/promises";
|
|
6
5
|
import { basename, join } from "node:path";
|
|
@@ -8,12 +7,12 @@ import { createConversationEvent, createConversationMessage, } from "../../adapt
|
|
|
8
7
|
import { createOfficeAddress } from "../../office/index.js";
|
|
9
8
|
import { COMMAND_MANIFEST } from "../../commands/manifest.js";
|
|
10
9
|
import { resolveConversationSettings } from "../../config.js";
|
|
11
|
-
import { parseExtActionId } from "../../harness/extensions/registry.js";
|
|
12
10
|
import * as log from "../../log.js";
|
|
13
11
|
import { isRecord, readTextFileIfExists } from "../../utils/file-guards.js";
|
|
14
12
|
import { PRODUCT_NAME, formatForceStopped } from "../../platform-messages.js";
|
|
15
|
-
import { appendBotResponseLog, appendChannelLog, MessagingEventQueue, saveIncomingAttachments, withRetry, } from "../shared.js";
|
|
13
|
+
import { appendBotResponseLog, appendChannelLog, MessagingEventQueue, MessagingIntakeTracker, saveIncomingAttachments, withRetry, } from "../shared.js";
|
|
16
14
|
import { processMessageIntake } from "../intake.js";
|
|
15
|
+
import { recordPlatformChannelKind, } from "../../workspace-projection/index.js";
|
|
17
16
|
import { AssistantThreadRegistry, handleAgentContextChanged, handleAgentDmOpened, handleAssistantThreadStarted, titleAssistantThread, } from "./assistant.js";
|
|
18
17
|
import { createSlackAdapters } from "./context.js";
|
|
19
18
|
import { hasMaterializedChatSession, registerThreadSession, } from "../../sessions/chat-history-sync.js";
|
|
@@ -140,7 +139,9 @@ export class SlackMessagingBot {
|
|
|
140
139
|
* instead of inheriting whatever ran before it.
|
|
141
140
|
*/
|
|
142
141
|
this.streamStarts = new StreamStartLimiter();
|
|
142
|
+
this.stopped = false;
|
|
143
143
|
this.queues = new Map();
|
|
144
|
+
this.intake = new MessagingIntakeTracker("Slack");
|
|
144
145
|
this.eventsWatcher = null;
|
|
145
146
|
this.handler = handler;
|
|
146
147
|
this.workspace = config.workspace;
|
|
@@ -160,11 +161,14 @@ export class SlackMessagingBot {
|
|
|
160
161
|
// Public API
|
|
161
162
|
// ==========================================================================
|
|
162
163
|
async start() {
|
|
164
|
+
this.stopped = false;
|
|
163
165
|
const auth = await this.webClient.auth.test();
|
|
164
166
|
this.botUserId = auth.user_id;
|
|
165
167
|
this.botId = typeof auth.bot_id === "string" ? auth.bot_id : null;
|
|
166
168
|
this.teamId = typeof auth.team_id === "string" ? auth.team_id : null;
|
|
167
169
|
await Promise.all([this.fetchUsers(), this.fetchChannels()]);
|
|
170
|
+
if (this.stopped)
|
|
171
|
+
return;
|
|
168
172
|
log.logInfo(`Loaded ${this.channels.size} channels, ${this.users.size} users`);
|
|
169
173
|
// Record startup time before opening the socket. Slack may replay older events;
|
|
170
174
|
// those should be logged but not processed. Backfill runs in the background up
|
|
@@ -177,6 +181,16 @@ export class SlackMessagingBot {
|
|
|
177
181
|
log.logWarning("Slack backfill failed", String(error));
|
|
178
182
|
});
|
|
179
183
|
}
|
|
184
|
+
async stop() {
|
|
185
|
+
this.stopped = true;
|
|
186
|
+
try {
|
|
187
|
+
await this.socketClient.disconnect();
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
await this.intake.close();
|
|
191
|
+
await Promise.all([...this.queues.values()].map((queue) => queue.close()));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
180
194
|
getUser(userId) {
|
|
181
195
|
return this.users.get(userId);
|
|
182
196
|
}
|
|
@@ -559,8 +573,8 @@ export class SlackMessagingBot {
|
|
|
559
573
|
getMessagingInfo() {
|
|
560
574
|
return {
|
|
561
575
|
name: "slack",
|
|
576
|
+
...(this.teamId ? { workspaceId: this.teamId } : {}),
|
|
562
577
|
trustModel: "membership",
|
|
563
|
-
bareExtensionCommands: true,
|
|
564
578
|
formattingGuide: "## Slack Formatting\nWrite standard Markdown/GFM: **bold**, _italic_, ~~strike~~, `code`, fenced code blocks, [links](url), lists, and pipe tables (rendered as native Slack tables).\nDo NOT use Slack mrkdwn syntax like *single-asterisk bold* or <url|label> links.",
|
|
565
579
|
channels: this.getAllChannels().map((c) => ({ id: c.id, name: c.name })),
|
|
566
580
|
users: this.getAllUsers().map((u) => ({
|
|
@@ -581,6 +595,8 @@ export class SlackMessagingBot {
|
|
|
581
595
|
* Returns true if enqueued, false if queue is full (max 5).
|
|
582
596
|
*/
|
|
583
597
|
enqueueEvent(event) {
|
|
598
|
+
if (this.stopped)
|
|
599
|
+
return false;
|
|
584
600
|
const conversationId = event.conversationId;
|
|
585
601
|
const queue = this.getQueue(conversationId);
|
|
586
602
|
if (queue.size() >= 5) {
|
|
@@ -588,7 +604,7 @@ export class SlackMessagingBot {
|
|
|
588
604
|
return false;
|
|
589
605
|
}
|
|
590
606
|
log.logInfo(`Enqueueing event for ${conversationId}: ${event.text.substring(0, 50)}`);
|
|
591
|
-
queue.enqueue(async () => {
|
|
607
|
+
return queue.enqueue(async () => {
|
|
592
608
|
let anchorTs;
|
|
593
609
|
if (!event.thread_ts) {
|
|
594
610
|
try {
|
|
@@ -623,7 +639,7 @@ export class SlackMessagingBot {
|
|
|
623
639
|
const runQueueKey = planSlackAdapterSession(eventForRun, {
|
|
624
640
|
initialMessageTs: eventPlan.initialMessageTs,
|
|
625
641
|
}).sessionKey;
|
|
626
|
-
|
|
642
|
+
const run = async () => {
|
|
627
643
|
const slackEvent = createConversationEvent({
|
|
628
644
|
platform: "slack",
|
|
629
645
|
address: eventForRun.address,
|
|
@@ -643,9 +659,13 @@ export class SlackMessagingBot {
|
|
|
643
659
|
replyMode: this.resolveReplyMode(eventForRun.address),
|
|
644
660
|
});
|
|
645
661
|
return this.handler.handleEvent(eventForRun, this, context);
|
|
646
|
-
}
|
|
662
|
+
};
|
|
663
|
+
const runQueue = this.getQueue(runQueueKey);
|
|
664
|
+
if (!runQueue.enqueue(run)) {
|
|
665
|
+
await runQueue.close();
|
|
666
|
+
await run();
|
|
667
|
+
}
|
|
647
668
|
});
|
|
648
|
-
return true;
|
|
649
669
|
}
|
|
650
670
|
// ==========================================================================
|
|
651
671
|
// Private - Event Handlers
|
|
@@ -654,6 +674,8 @@ export class SlackMessagingBot {
|
|
|
654
674
|
let queue = this.queues.get(channelId);
|
|
655
675
|
if (!queue) {
|
|
656
676
|
queue = new MessagingEventQueue("Slack");
|
|
677
|
+
if (this.stopped)
|
|
678
|
+
void queue.close();
|
|
657
679
|
this.queues.set(channelId, queue);
|
|
658
680
|
}
|
|
659
681
|
return queue;
|
|
@@ -672,13 +694,48 @@ export class SlackMessagingBot {
|
|
|
672
694
|
sessionKey,
|
|
673
695
|
});
|
|
674
696
|
}
|
|
697
|
+
/**
|
|
698
|
+
* Slack's own conversation vocabulary for this channel, from the metadata
|
|
699
|
+
* fetchChannels() already loads. Externally shared channels report
|
|
700
|
+
* "external" regardless of privacy — platform-public within one workspace
|
|
701
|
+
* is the sharing condition, and a channel visible to another organization
|
|
702
|
+
* does not satisfy it. Unknown channels return undefined (never recorded,
|
|
703
|
+
* so the projection keeps its isolated default).
|
|
704
|
+
*/
|
|
705
|
+
channelKindFor(channelId) {
|
|
706
|
+
if (channelId.startsWith("D"))
|
|
707
|
+
return "im";
|
|
708
|
+
const channel = this.channels.get(channelId);
|
|
709
|
+
if (!channel)
|
|
710
|
+
return undefined;
|
|
711
|
+
if (channel.name.startsWith("DM:"))
|
|
712
|
+
return "im";
|
|
713
|
+
if (channel.isExternallyShared)
|
|
714
|
+
return "external";
|
|
715
|
+
if (channel.isPrivate === true)
|
|
716
|
+
return "private_channel";
|
|
717
|
+
if (channel.isPrivate === false)
|
|
718
|
+
return "public_channel";
|
|
719
|
+
return undefined;
|
|
720
|
+
}
|
|
675
721
|
processSlackMessageIntake(options) {
|
|
722
|
+
const kind = this.channelKindFor(options.event.conversationId);
|
|
723
|
+
if (kind) {
|
|
724
|
+
try {
|
|
725
|
+
recordPlatformChannelKind(this.workspace.office(options.event.address), kind);
|
|
726
|
+
}
|
|
727
|
+
catch (err) {
|
|
728
|
+
// A failed snapshot must not block the message; the projection just
|
|
729
|
+
// keeps its previous (or isolated default) posture.
|
|
730
|
+
log.logWarning("Failed to record Slack channel kind", String(err));
|
|
731
|
+
}
|
|
732
|
+
}
|
|
676
733
|
const absorbAttachmentFailure = () => {
|
|
677
734
|
void options.attachmentsPromise.catch((err) => {
|
|
678
735
|
log.logWarning("Failed to log Slack message", String(err));
|
|
679
736
|
});
|
|
680
737
|
};
|
|
681
|
-
processMessageIntake({
|
|
738
|
+
return processMessageIntake({
|
|
682
739
|
eventBase: options.event,
|
|
683
740
|
office: this.workspace.office(options.event.address),
|
|
684
741
|
isAutoReplyCandidate: options.isAutoReplyCandidate,
|
|
@@ -702,22 +759,7 @@ export class SlackMessagingBot {
|
|
|
702
759
|
absorbAttachmentFailure();
|
|
703
760
|
});
|
|
704
761
|
}
|
|
705
|
-
|
|
706
|
-
const blocks = [
|
|
707
|
-
{
|
|
708
|
-
type: "section",
|
|
709
|
-
text: {
|
|
710
|
-
type: "mrkdwn",
|
|
711
|
-
text: `*${PRODUCT_NAME}*\nStart a new task or check on running work.`,
|
|
712
|
-
},
|
|
713
|
-
accessory: {
|
|
714
|
-
type: "image",
|
|
715
|
-
image_url: "https://media1.tenor.com/m/lfDATg4Bhc0AAAAC/happy-cat.gif",
|
|
716
|
-
alt_text: PRODUCT_NAME,
|
|
717
|
-
},
|
|
718
|
-
},
|
|
719
|
-
];
|
|
720
|
-
// --- Running tasks ---
|
|
762
|
+
appendRunningTasks(blocks) {
|
|
721
763
|
const runningSessions = this.handler.getRunningSessions();
|
|
722
764
|
blocks.push({ type: "divider" }, {
|
|
723
765
|
type: "header",
|
|
@@ -732,67 +774,49 @@ export class SlackMessagingBot {
|
|
|
732
774
|
type: "context",
|
|
733
775
|
elements: [{ type: "mrkdwn", text: "_No tasks running right now._" }],
|
|
734
776
|
});
|
|
777
|
+
return;
|
|
735
778
|
}
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
const
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
779
|
+
const stuckThresholdMs = 10 * 60 * 1000;
|
|
780
|
+
for (const session of runningSessions) {
|
|
781
|
+
const channelId = conversationIdOf(session.sessionKey);
|
|
782
|
+
const channelName = this.channels.get(channelId)?.name;
|
|
783
|
+
const elapsed = Math.floor((Date.now() - session.startedAt) / 60000);
|
|
784
|
+
const elapsedStr = elapsed < 1 ? "<1 min" : `${elapsed} min`;
|
|
785
|
+
const lastActivity = session.lastActivityAt ? Date.now() - session.lastActivityAt : 0;
|
|
786
|
+
const isStuck = lastActivity > stuckThresholdMs;
|
|
787
|
+
let statusLine = `${isStuck ? "_stuck_" : "_running_"} · ${elapsedStr}`;
|
|
788
|
+
if (session.currentTool)
|
|
789
|
+
statusLine += ` · ${session.currentTool}`;
|
|
790
|
+
if (isStuck)
|
|
791
|
+
statusLine += ` · idle ${Math.floor(lastActivity / 60000)}m`;
|
|
792
|
+
blocks.push({
|
|
793
|
+
type: "context",
|
|
794
|
+
elements: [
|
|
795
|
+
{
|
|
796
|
+
type: "mrkdwn",
|
|
797
|
+
text: `*${channelName ? `#${channelName}` : channelId}* · ${statusLine}`,
|
|
798
|
+
},
|
|
799
|
+
],
|
|
800
|
+
});
|
|
801
|
+
if (isStuck) {
|
|
759
802
|
blocks.push({
|
|
760
803
|
type: "context",
|
|
761
804
|
elements: [
|
|
805
|
+
{ type: "mrkdwn", text: " " },
|
|
762
806
|
{
|
|
763
|
-
type: "
|
|
764
|
-
text:
|
|
807
|
+
type: "button",
|
|
808
|
+
text: { type: "plain_text", text: "Force Stop", emoji: true },
|
|
809
|
+
// `value` preserves the raw key; action_id is only a unique route.
|
|
810
|
+
action_id: `force_stop_${session.sessionKey.replace(/:/g, "_")}`,
|
|
811
|
+
value: session.sessionKey,
|
|
812
|
+
style: "danger",
|
|
765
813
|
},
|
|
766
814
|
],
|
|
767
815
|
});
|
|
768
|
-
// Add Force Stop button as separate element if stuck
|
|
769
|
-
if (isStuck) {
|
|
770
|
-
blocks.push({
|
|
771
|
-
type: "context",
|
|
772
|
-
elements: [
|
|
773
|
-
{
|
|
774
|
-
type: "mrkdwn",
|
|
775
|
-
text: " ",
|
|
776
|
-
},
|
|
777
|
-
{
|
|
778
|
-
type: "button",
|
|
779
|
-
text: { type: "plain_text", text: "Force Stop", emoji: true },
|
|
780
|
-
// The raw session key travels in `value` (Slack returns it
|
|
781
|
-
// verbatim); the action_id only routes and must be unique per
|
|
782
|
-
// view, so it carries a sanitized copy of the key. Never
|
|
783
|
-
// decode the key from the action_id — the `:`↔`_` rewrite is
|
|
784
|
-
// irreversible for conversation ids that contain `_` (GitHub's
|
|
785
|
-
// GH_owner_repo_number do, by design).
|
|
786
|
-
action_id: `force_stop_${session.sessionKey.replace(/:/g, "_")}`,
|
|
787
|
-
value: session.sessionKey,
|
|
788
|
-
style: "danger",
|
|
789
|
-
},
|
|
790
|
-
],
|
|
791
|
-
});
|
|
792
|
-
}
|
|
793
816
|
}
|
|
794
817
|
}
|
|
795
|
-
|
|
818
|
+
}
|
|
819
|
+
appendScheduledJobs(blocks) {
|
|
796
820
|
const periodicEvents = this.eventsWatcher?.getPeriodicEvents() ?? [];
|
|
797
821
|
blocks.push({ type: "divider" }, {
|
|
798
822
|
type: "header",
|
|
@@ -807,34 +831,46 @@ export class SlackMessagingBot {
|
|
|
807
831
|
type: "context",
|
|
808
832
|
elements: [{ type: "mrkdwn", text: "_No scheduled jobs._" }],
|
|
809
833
|
});
|
|
834
|
+
return;
|
|
810
835
|
}
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
:
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
:
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
text: {
|
|
831
|
-
type: "mrkdwn",
|
|
832
|
-
text: `*${ev.text}*\n└ \`${ev.schedule}\` · ${channelLabel} · Next: ${nextStr}`,
|
|
833
|
-
},
|
|
834
|
-
});
|
|
835
|
-
}
|
|
836
|
+
for (const event of periodicEvents) {
|
|
837
|
+
const channel = event.platform === "slack" ? this.channels.get(event.conversationId) : undefined;
|
|
838
|
+
const channelId = channel ? `#${channel.name}` : event.conversationId;
|
|
839
|
+
const channelLabel = `${event.platform}:${channelId}`;
|
|
840
|
+
const nextRun = event.nextRun
|
|
841
|
+
? new Date(event.nextRun).toLocaleString("en-US", {
|
|
842
|
+
month: "short",
|
|
843
|
+
day: "numeric",
|
|
844
|
+
hour: "2-digit",
|
|
845
|
+
minute: "2-digit",
|
|
846
|
+
})
|
|
847
|
+
: "—";
|
|
848
|
+
blocks.push({
|
|
849
|
+
type: "section",
|
|
850
|
+
text: {
|
|
851
|
+
type: "mrkdwn",
|
|
852
|
+
text: `*${event.text}*\n└ \`${event.schedule}\` · ${channelLabel} · Next: ${nextRun}`,
|
|
853
|
+
},
|
|
854
|
+
});
|
|
836
855
|
}
|
|
837
|
-
|
|
856
|
+
}
|
|
857
|
+
buildHomeView() {
|
|
858
|
+
const blocks = [
|
|
859
|
+
{
|
|
860
|
+
type: "section",
|
|
861
|
+
text: {
|
|
862
|
+
type: "mrkdwn",
|
|
863
|
+
text: `*${PRODUCT_NAME}*\nStart a new task or check on running work.`,
|
|
864
|
+
},
|
|
865
|
+
accessory: {
|
|
866
|
+
type: "image",
|
|
867
|
+
image_url: "https://media1.tenor.com/m/lfDATg4Bhc0AAAAC/happy-cat.gif",
|
|
868
|
+
alt_text: PRODUCT_NAME,
|
|
869
|
+
},
|
|
870
|
+
},
|
|
871
|
+
];
|
|
872
|
+
this.appendRunningTasks(blocks);
|
|
873
|
+
this.appendScheduledJobs(blocks);
|
|
838
874
|
blocks.push({ type: "divider" }, {
|
|
839
875
|
type: "context",
|
|
840
876
|
elements: [
|
|
@@ -843,7 +879,8 @@ export class SlackMessagingBot {
|
|
|
843
879
|
});
|
|
844
880
|
return { type: "home", blocks: blocks };
|
|
845
881
|
}
|
|
846
|
-
createCommandAdapters(
|
|
882
|
+
createCommandAdapters(input) {
|
|
883
|
+
const { conversationId, userId, userName, text, ts, ...options } = input;
|
|
847
884
|
const message = createConversationMessage({
|
|
848
885
|
platform: "slack",
|
|
849
886
|
conversationId,
|
|
@@ -937,9 +974,16 @@ export class SlackMessagingBot {
|
|
|
937
974
|
...(threadTs ? { thread_ts: threadTs } : {}),
|
|
938
975
|
sessionKey,
|
|
939
976
|
});
|
|
940
|
-
const context = this.createCommandAdapters(
|
|
941
|
-
|
|
942
|
-
:
|
|
977
|
+
const context = this.createCommandAdapters({
|
|
978
|
+
conversationId,
|
|
979
|
+
userId: payload.user_id,
|
|
980
|
+
userName,
|
|
981
|
+
text: commandText,
|
|
982
|
+
ts: eventTs,
|
|
983
|
+
...(isDirectMessage
|
|
984
|
+
? { threadTs, sessionKey }
|
|
985
|
+
: { ephemeralChannelId: conversationId, threadTs, sessionKey }),
|
|
986
|
+
});
|
|
943
987
|
return { event, context };
|
|
944
988
|
}
|
|
945
989
|
/**
|
|
@@ -972,31 +1016,39 @@ export class SlackMessagingBot {
|
|
|
972
1016
|
this.socketClient.on("unable_to_socket_mode_start", (err) => {
|
|
973
1017
|
log.logWarning("Slack socket unable_to_start", err ? String(err) : "");
|
|
974
1018
|
});
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
this.socketClient.on("slash_commands", (payload) => void this.handleSlashCommand(payload));
|
|
988
|
-
this.socketClient.on("app_home_opened", (payload) => this.handleAppHomeOpened(payload));
|
|
1019
|
+
this.socketClient.on("app_mention", (payload) => {
|
|
1020
|
+
void this.intake.run(() => this.handleAppMention(payload));
|
|
1021
|
+
});
|
|
1022
|
+
this.socketClient.on("message", (payload) => {
|
|
1023
|
+
void this.intake.run(() => this.handleMessageEvent(payload));
|
|
1024
|
+
});
|
|
1025
|
+
this.socketClient.on("slash_commands", (payload) => {
|
|
1026
|
+
void this.intake.run(() => this.handleSlashCommand(payload));
|
|
1027
|
+
});
|
|
1028
|
+
this.socketClient.on("app_home_opened", (payload) => {
|
|
1029
|
+
void this.intake.run(() => this.handleAppHomeOpened(payload));
|
|
1030
|
+
});
|
|
989
1031
|
// The assistant surface's lifecycle. Both events were already subscribed
|
|
990
1032
|
// in the app manifest and then dropped on the floor, which is why the pane
|
|
991
1033
|
// opened empty and the sidebar filled with untitled conversations.
|
|
992
|
-
this.socketClient.on("assistant_thread_started", (payload) =>
|
|
993
|
-
|
|
1034
|
+
this.socketClient.on("assistant_thread_started", (payload) => {
|
|
1035
|
+
void this.intake.run(() => this.handleAssistantThreadStarted(payload));
|
|
1036
|
+
});
|
|
1037
|
+
this.socketClient.on("assistant_thread_context_changed", (payload) => {
|
|
1038
|
+
void this.intake.run(() => this.handleAgentContextChangedEvent(payload));
|
|
1039
|
+
});
|
|
994
1040
|
// agent_view's spelling of the same signal.
|
|
995
|
-
this.socketClient.on("app_context_changed", (payload) =>
|
|
996
|
-
|
|
997
|
-
|
|
1041
|
+
this.socketClient.on("app_context_changed", (payload) => {
|
|
1042
|
+
void this.intake.run(() => this.handleAgentContextChangedEvent(payload));
|
|
1043
|
+
});
|
|
1044
|
+
this.socketClient.on("block_actions", (payload) => {
|
|
1045
|
+
void this.intake.run(() => this.handleBlockAction(payload));
|
|
1046
|
+
});
|
|
1047
|
+
this.socketClient.on("interactive", (payload) => {
|
|
1048
|
+
void this.intake.run(() => this.handleBlockAction(payload));
|
|
1049
|
+
});
|
|
998
1050
|
}
|
|
999
|
-
handleAppMention({ event, ack }) {
|
|
1051
|
+
async handleAppMention({ event, ack, }) {
|
|
1000
1052
|
const e = event;
|
|
1001
1053
|
// Skip DMs (handled by message event)
|
|
1002
1054
|
if (e.channel.startsWith("D")) {
|
|
@@ -1030,7 +1082,7 @@ export class SlackMessagingBot {
|
|
|
1030
1082
|
ack();
|
|
1031
1083
|
return;
|
|
1032
1084
|
}
|
|
1033
|
-
this.processSlackMessageIntake({
|
|
1085
|
+
const intake = this.processSlackMessageIntake({
|
|
1034
1086
|
event: slackEvent,
|
|
1035
1087
|
attachmentsPromise,
|
|
1036
1088
|
queueKey: this.resolveQueueKey(e.channel, sessionKey),
|
|
@@ -1038,50 +1090,46 @@ export class SlackMessagingBot {
|
|
|
1038
1090
|
addressed: true,
|
|
1039
1091
|
});
|
|
1040
1092
|
ack();
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
const
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1093
|
+
await intake;
|
|
1094
|
+
}
|
|
1095
|
+
admitHumanMessage(event, ack) {
|
|
1096
|
+
const hasSlackContent = !!event.text ||
|
|
1097
|
+
!!event.files?.length ||
|
|
1098
|
+
!!event.blocks?.length ||
|
|
1099
|
+
!!event.attachments?.length;
|
|
1100
|
+
const isOwnMessage = event.user === this.botUserId || (!!this.botId && event.bot_id === this.botId);
|
|
1101
|
+
if (isOwnMessage) {
|
|
1048
1102
|
ack();
|
|
1049
|
-
return;
|
|
1103
|
+
return false;
|
|
1050
1104
|
}
|
|
1051
|
-
//
|
|
1052
|
-
//
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
if (
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
if (!hasSlackContent) {
|
|
1064
|
-
ack();
|
|
1065
|
-
return;
|
|
1105
|
+
// User-token posts carry bot_id/app_id beside the human user. Only unknown
|
|
1106
|
+
// authors and known bot users take the external-bot loop-protection path.
|
|
1107
|
+
const authorIsKnownHuman = !!event.user && this.users.get(event.user)?.isBot === false;
|
|
1108
|
+
const isExternalMessage = event.subtype === "bot_message" || (!!event.bot_id && !authorIsKnownHuman);
|
|
1109
|
+
if (isExternalMessage) {
|
|
1110
|
+
const supportedSubtype = event.subtype === undefined ||
|
|
1111
|
+
event.subtype === "bot_message" ||
|
|
1112
|
+
event.subtype === "file_share";
|
|
1113
|
+
if (supportedSubtype && hasSlackContent) {
|
|
1114
|
+
void this.logExternalMessagingBotMessage(event).catch((err) => {
|
|
1115
|
+
log.logWarning("Failed to log Slack bot message", String(err));
|
|
1116
|
+
});
|
|
1066
1117
|
}
|
|
1067
|
-
void this.logExternalMessagingBotMessage(e).catch((err) => {
|
|
1068
|
-
log.logWarning("Failed to log Slack bot message", String(err));
|
|
1069
|
-
});
|
|
1070
|
-
ack();
|
|
1071
|
-
return;
|
|
1072
|
-
}
|
|
1073
|
-
if (!e.user) {
|
|
1074
|
-
ack();
|
|
1075
|
-
return;
|
|
1076
|
-
}
|
|
1077
|
-
if (e.subtype !== undefined && e.subtype !== "file_share") {
|
|
1078
1118
|
ack();
|
|
1079
|
-
return;
|
|
1119
|
+
return false;
|
|
1080
1120
|
}
|
|
1081
|
-
|
|
1082
|
-
|
|
1121
|
+
const isSupportedUserMessage = !!event.user &&
|
|
1122
|
+
(event.subtype === undefined || event.subtype === "file_share") &&
|
|
1123
|
+
hasSlackContent;
|
|
1124
|
+
if (isSupportedUserMessage)
|
|
1125
|
+
return true;
|
|
1126
|
+
ack();
|
|
1127
|
+
return false;
|
|
1128
|
+
}
|
|
1129
|
+
async handleMessageEvent({ event, ack, }) {
|
|
1130
|
+
const e = event;
|
|
1131
|
+
if (!this.admitHumanMessage(e, ack))
|
|
1083
1132
|
return;
|
|
1084
|
-
}
|
|
1085
1133
|
// message.im normally carries channel_type "im", but fall back to the
|
|
1086
1134
|
// D-prefix convention (used by handleAppMention and session keys) so a
|
|
1087
1135
|
// missing channel_type cannot silently demote a DM to an auto-reply
|
|
@@ -1139,7 +1187,7 @@ export class SlackMessagingBot {
|
|
|
1139
1187
|
// message ts as a thread session (`channel:ts`) instead of the persistent
|
|
1140
1188
|
// top-level channel session.
|
|
1141
1189
|
slackEvent.sessionKey = activeSessionKey;
|
|
1142
|
-
this.processSlackMessageIntake({
|
|
1190
|
+
const intake = this.processSlackMessageIntake({
|
|
1143
1191
|
event: slackEvent,
|
|
1144
1192
|
attachmentsPromise,
|
|
1145
1193
|
queueKey: this.resolveQueueKey(e.channel, activeSessionKey),
|
|
@@ -1147,6 +1195,7 @@ export class SlackMessagingBot {
|
|
|
1147
1195
|
addressed: isDM,
|
|
1148
1196
|
});
|
|
1149
1197
|
ack();
|
|
1198
|
+
await intake;
|
|
1150
1199
|
}
|
|
1151
1200
|
async handleSlashCommand({ body, ack, }) {
|
|
1152
1201
|
const payload = body;
|
|
@@ -1160,16 +1209,19 @@ export class SlackMessagingBot {
|
|
|
1160
1209
|
return;
|
|
1161
1210
|
if (!entry.slackRoute)
|
|
1162
1211
|
return;
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1212
|
+
try {
|
|
1213
|
+
await this.routeSlashCommand(entry.slackRoute, {
|
|
1214
|
+
command,
|
|
1215
|
+
text,
|
|
1216
|
+
channel_id,
|
|
1217
|
+
user_id,
|
|
1218
|
+
user_name,
|
|
1219
|
+
thread_ts,
|
|
1220
|
+
});
|
|
1221
|
+
}
|
|
1222
|
+
catch (err) {
|
|
1171
1223
|
log.logWarning("Slack slash command error", err instanceof Error ? err.message : String(err));
|
|
1172
|
-
}
|
|
1224
|
+
}
|
|
1173
1225
|
}
|
|
1174
1226
|
handleAppHomeOpened({ event, ack }) {
|
|
1175
1227
|
const e = event;
|
|
@@ -1242,36 +1294,6 @@ export class SlackMessagingBot {
|
|
|
1242
1294
|
: undefined;
|
|
1243
1295
|
const threadTs = container.thread_ts;
|
|
1244
1296
|
const sessionKey = resolveSlackSessionKey(channelId, threadTs);
|
|
1245
|
-
// Extension-owned actions (ext:<slug>: namespaced by api.blockkit.post)
|
|
1246
|
-
// dispatch exclusively to the extension's onAction handler — no agent
|
|
1247
|
-
// run, no chat-history entry. They never fall through to the model: an
|
|
1248
|
-
// unconsumed namespaced action means the extension is gone, and its
|
|
1249
|
-
// routing id would only confuse an agent run.
|
|
1250
|
-
const extAction = parseExtActionId(action.action_id ?? "");
|
|
1251
|
-
if (extAction) {
|
|
1252
|
-
this.getQueue(this.resolveQueueKey(channelId, sessionKey)).enqueue(async () => {
|
|
1253
|
-
const consumed = await this.handler.handleExtensionAction({
|
|
1254
|
-
address: createOfficeAddress("slack", channelId),
|
|
1255
|
-
sessionKey,
|
|
1256
|
-
conversationKind: channelId.startsWith("D") ? "direct" : "shared",
|
|
1257
|
-
slug: extAction.slug,
|
|
1258
|
-
action: {
|
|
1259
|
-
actionId: extAction.actionId,
|
|
1260
|
-
value: action.value ?? selectedOption?.value ?? selectedOption?.text?.text,
|
|
1261
|
-
selectedValues: selectedOptions?.map((option) => option.value ?? option.text?.text ?? ""),
|
|
1262
|
-
userId,
|
|
1263
|
-
userName: body.user?.username ?? body.user?.name,
|
|
1264
|
-
conversationId: channelId,
|
|
1265
|
-
messageTs: container.message_ts,
|
|
1266
|
-
threadTs,
|
|
1267
|
-
},
|
|
1268
|
-
});
|
|
1269
|
-
if (!consumed) {
|
|
1270
|
-
log.logWarning(`[${channelId}] Dropped extension action ${action.action_id}`, `no handler registered by extension "${extAction.slug}"`);
|
|
1271
|
-
}
|
|
1272
|
-
});
|
|
1273
|
-
return;
|
|
1274
|
-
}
|
|
1275
1297
|
const selectedText = selectedOption?.text?.text ?? selectedOption?.value;
|
|
1276
1298
|
const selectedTexts = selectedOptions?.map((option) => option.text?.text ?? option.value);
|
|
1277
1299
|
const valueText = selectedTexts?.length
|
|
@@ -1607,7 +1629,12 @@ export class SlackMessagingBot {
|
|
|
1607
1629
|
if (channels) {
|
|
1608
1630
|
for (const c of channels) {
|
|
1609
1631
|
if (c.id && c.name && c.is_member) {
|
|
1610
|
-
this.channels.set(c.id, {
|
|
1632
|
+
this.channels.set(c.id, {
|
|
1633
|
+
id: c.id,
|
|
1634
|
+
name: c.name,
|
|
1635
|
+
...(typeof c.is_private === "boolean" ? { isPrivate: c.is_private } : {}),
|
|
1636
|
+
...(c.is_shared || c.is_ext_shared ? { isExternallyShared: true } : {}),
|
|
1637
|
+
});
|
|
1611
1638
|
}
|
|
1612
1639
|
}
|
|
1613
1640
|
}
|