@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
package/CHANGELOG.md
CHANGED
|
@@ -9,6 +9,53 @@ any release.
|
|
|
9
9
|
|
|
10
10
|
## [Unreleased]
|
|
11
11
|
|
|
12
|
+
## [1.0.0-beta.47]
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- Integrate OpenConnector as a host-side MCP gateway: Slack Conversation offices receive scoped runtime identities, while provider OAuth connections remain in the gateway and execution audit stays attributable to the originating conversation.
|
|
17
|
+
- Preserve operating guidance supplied during MCP initialization and present it to the agent with explicit system-prompt and user-intent boundaries.
|
|
18
|
+
- Add automatic selection of a sole OpenConnector provider connection when an action omits `connectionName`; retain explicit selection when multiple accounts exist.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- Gate MCP tools by the platform trust model and enforce the untrusted package boundary.
|
|
23
|
+
- Make platform shutdown cleanup bounded and strengthen runner/session lifecycle rollback handling.
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
|
|
27
|
+
- Isolate Slack DM and thread E2E context and bound event-delivery waits.
|
|
28
|
+
|
|
29
|
+
### Tests
|
|
30
|
+
|
|
31
|
+
- Add coverage for OpenConnector token provisioning, MCP instruction propagation, connection selection, trust gating, lifecycle cleanup, and Slack isolation.
|
|
32
|
+
|
|
33
|
+
## [1.0.0-beta.46]
|
|
34
|
+
|
|
35
|
+
### Added
|
|
36
|
+
|
|
37
|
+
- Add an interactive `mikan onboard` wizard that configures one chat adapter, an LLM provider, and the sandbox, writing private environment and settings files while retaining non-interactive template generation.
|
|
38
|
+
- Derive shared workspace visibility from platform channel privacy: Slack public channels can update shared memory, private channels receive it read-only, and DMs, external channels, unknown kinds, and other platforms stay isolated unless explicitly overridden.
|
|
39
|
+
- Schedule Dream maintenance for Conversation-office memory with durable evidence checkpoints.
|
|
40
|
+
- Add an Admin MCP Marketplace with reviewed GitHub, Context7, Playwright, Sequential Thinking, and Metabase presets; Metabase installations accept an instance endpoint and API key.
|
|
41
|
+
|
|
42
|
+
### Changed
|
|
43
|
+
|
|
44
|
+
- Remove the executable extension system and its CLI/chat management surfaces; packages remain the supported path for deploying read-only skills.
|
|
45
|
+
- Remove the harness `auth.json` credential store; configure provider credentials through environment variables, onboarding, or the conversation vault.
|
|
46
|
+
- Remove Gondolin, Firecracker, and GitHub Cloud Build log integrations from the supported runtime surface.
|
|
47
|
+
- Fail closed when a sandbox backend cannot enforce an isolated office or read-only shared workspace memory; use `image:*` or explicitly select a trusted read-write projection.
|
|
48
|
+
- Consolidate runtime, session, adapter, web, and configuration ownership to reduce duplicate lifecycle and parsing rules.
|
|
49
|
+
|
|
50
|
+
### Fixed
|
|
51
|
+
|
|
52
|
+
- Preserve streamed UTF-8 output when host sandbox chunks split multi-byte characters.
|
|
53
|
+
- Re-aim migrated session lanes at the nearest surviving ancestor when the newest v3 entry contains facts but no v4 message.
|
|
54
|
+
|
|
55
|
+
### Tests
|
|
56
|
+
|
|
57
|
+
- Move CI action runtimes to Node 24 and strengthen runtime, presenter, workspace-projection, MCP marketplace, and session migration coverage.
|
|
58
|
+
|
|
12
59
|
## [1.0.0-beta.45]
|
|
13
60
|
|
|
14
61
|
### Fixed
|
package/README.md
CHANGED
|
@@ -22,15 +22,15 @@ mikan keeps the chat record, agent session, and execution runtime separate:
|
|
|
22
22
|
- **Chat / conversation data** is the platform-facing record: `log.jsonl`, attachments, and conversation files.
|
|
23
23
|
- **Session orchestration** turns platform events into agent runs, handles top-level/thread scopes, and persists structured context under `sessions/*.jsonl`.
|
|
24
24
|
- **mikan agent harness** (`src/harness/`, built on pi-agent-core and pi-ai) runs the model loop, session persistence, compaction, and calls mikan tools.
|
|
25
|
-
- **Sandbox runtime** is where tool commands execute: host, Docker container/image,
|
|
25
|
+
- **Sandbox runtime** is where tool commands execute: host, Docker container/image, or the experimental Cloudflare bridge.
|
|
26
26
|
- **Vault** provides runtime credentials as env vars and mounted secret files.
|
|
27
27
|
|
|
28
28
|
## Features
|
|
29
29
|
|
|
30
30
|
- **Multi-platform** — Slack, Telegram, Discord, and GitHub adapters
|
|
31
31
|
- **Concurrent conversations** — Slack threads, Discord replies/threads, and Telegram reply chains run as independent sessions
|
|
32
|
-
- **Conversation offices** — one office directory and one sandbox runtime per conversation,
|
|
33
|
-
- **Sandbox execution** — host, shared container, per-conversation managed container,
|
|
32
|
+
- **Conversation offices** — one office directory and one sandbox runtime per conversation, with platform-derived workspace sharing and explicit door-policy overrides
|
|
33
|
+
- **Sandbox execution** — host, shared container, per-conversation managed container, or Cloudflare bridge (experimental)
|
|
34
34
|
- **Credential vaults** — `/login` stores credentials under `--state-dir` and injects env into sandbox runs
|
|
35
35
|
- **Web session viewer** — read-only web view of the current session via `session` / `/session`
|
|
36
36
|
- **Persistent memory** — workspace-level and per-office `MEMORY.md`
|
|
@@ -118,20 +118,18 @@ Slack threads, Discord replies/threads, and Telegram reply chains are mapped to
|
|
|
118
118
|
|
|
119
119
|
## Sandbox
|
|
120
120
|
|
|
121
|
-
| Mode
|
|
122
|
-
|
|
|
123
|
-
| `host` (default)
|
|
124
|
-
| `container:<name>`
|
|
125
|
-
| `image:<image>`
|
|
126
|
-
| `
|
|
127
|
-
| `firecracker:<vm-id>:<path>` | Firecracker microVM (alpha; not recommended) |
|
|
128
|
-
| `cloudflare:<sandbox-id>` | Cloudflare Worker bridge (experimental; no auto workspace sync) |
|
|
121
|
+
| Mode | Description |
|
|
122
|
+
| ------------------------- | ----------------------------------------------------------------------------- |
|
|
123
|
+
| `host` (default) | Run on host; no vault env injection |
|
|
124
|
+
| `container:<name>` | Run in an existing shared container; everyone sharing it shares its one vault |
|
|
125
|
+
| `image:<image>` | Auto-provision one Docker container and one vault per conversation office |
|
|
126
|
+
| `cloudflare:<sandbox-id>` | Cloudflare Worker bridge (experimental; no auto workspace sync) |
|
|
129
127
|
|
|
130
|
-
Each office's data view is set by its **door policy
|
|
128
|
+
Each office's data view is set by its **door policy**. Without an explicit workspace setting, Slack follows the channel kind: public channels use trusted shared support and can update workspace `MEMORY.md`; private channels can read that shared memory but receive it read-only; DMs, external channels, unknown channel kinds, and other platforms stay isolated. The admin portal or `/pi-sandbox door <default|isolated|shared|shared-private|full>` can override that result. Door policy governs data access only; execution isolation is unaffected.
|
|
131
129
|
|
|
132
|
-
Only `image:*`
|
|
130
|
+
Only `image:*` can enforce isolated projections and read-only shared memory. `host`, `container:*`, and `cloudflare:*` therefore fail closed for isolated or private-channel projections; an admin must either use `image:*` or explicitly select a trusted read-write layout.
|
|
133
131
|
|
|
134
|
-
For routing, mounts, vault behavior, managed container details, and
|
|
132
|
+
For routing, mounts, vault behavior, managed container details, and Cloudflare notes, see [src/content/docs/sandbox.mdx](src/content/docs/sandbox.mdx).
|
|
135
133
|
|
|
136
134
|
## Chat commands
|
|
137
135
|
|
|
@@ -158,11 +156,6 @@ mikan reads global settings from `<state-dir>/settings.json`; host-only per-conv
|
|
|
158
156
|
"provider": "anthropic",
|
|
159
157
|
"model": "claude-sonnet-4-6",
|
|
160
158
|
"thinkingLevel": "off"
|
|
161
|
-
},
|
|
162
|
-
"sandbox": {
|
|
163
|
-
"workspace": {
|
|
164
|
-
"doorPolicy": "isolated"
|
|
165
|
-
}
|
|
166
159
|
}
|
|
167
160
|
}
|
|
168
161
|
```
|
package/dist/adapter.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ConversationEvent, ConversationMessage, OfficeAddress, PlatformName } from "./types.js";
|
|
2
|
-
export type { MessagingBot, ConversationContext, ConversationEvent, MessagingEventHandler,
|
|
2
|
+
export type { MessagingBot, ConversationContext, ConversationEvent, MessagingEventHandler, HandleNewCommandOptions, ConversationMessage, ConversationResponder, ChatToolResult, ConversationKind, MessagingInfo, OfficeAddress, OfficeKey, PlatformHistoryMessage, PlatformHistoryOptions, PlatformName, PlatformUserInfo, RunningSession, SubagentProgressSnapshot, } from "./types.js";
|
|
3
3
|
interface ConversationIdentityInput {
|
|
4
4
|
platform: PlatformName;
|
|
5
5
|
conversationId: string;
|
package/dist/adapter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,SAAS,EACT,sBAAsB,EACtB,sBAAsB,EACtB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAEpB,UAAU,yBAAyB;IACjC,QAAQ,EAAE,YAAY,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAYD,8EAA8E;AAC9E,wBAAgB,uBAAuB,CACrC,CAAC,SAAS,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,gBAAgB,CAAC,EAC/D,KAAK,EAAE,CAAC,GAAG,yBAAyB,GAAG,CAAC,GAAG,iBAAiB,CAG7D;AAED,6EAA6E;AAC7E,wBAAgB,yBAAyB,CACvC,CAAC,SAAS,IAAI,CAAC,mBAAmB,EAAE,SAAS,GAAG,gBAAgB,CAAC,EACjE,KAAK,EAAE,CAAC,GAAG,yBAAyB,GAAG,CAAC,GAAG,mBAAmB,CAG/D"}
|
package/dist/adapter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAmCpE,SAAS,0BAA0B,CAAC,KAAgC;IAClE,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAC1E,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CACb,qCAAqC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,KAAK,CAAC,QAAQ,EAAE,CACjG,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,uBAAuB,CAErC,KAAoC;IACpC,MAAM,OAAO,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;AACvE,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,yBAAyB,CAEvC,KAAoC;IACpC,MAAM,OAAO,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;AACvE,CAAC","sourcesContent":["import { createOfficeAddress, sameOffice } from \"./office/index.js\";\nimport type {\n ConversationEvent,\n ConversationMessage,\n OfficeAddress,\n PlatformName,\n} from \"./types.js\";\n\nexport type {\n MessagingBot,\n ConversationContext,\n ConversationEvent,\n MessagingEventHandler,\n HandleNewCommandOptions,\n ConversationMessage,\n ConversationResponder,\n ChatToolResult,\n ConversationKind,\n MessagingInfo,\n OfficeAddress,\n OfficeKey,\n PlatformHistoryMessage,\n PlatformHistoryOptions,\n PlatformName,\n PlatformUserInfo,\n RunningSession,\n SubagentProgressSnapshot,\n} from \"./types.js\";\n\ninterface ConversationIdentityInput {\n platform: PlatformName;\n conversationId: string;\n address?: OfficeAddress;\n}\n\nfunction resolveConversationAddress(input: ConversationIdentityInput): OfficeAddress {\n const address = createOfficeAddress(input.platform, input.conversationId);\n if (input.address && !sameOffice(address, input.address)) {\n throw new Error(\n `Conversation address mismatch for ${JSON.stringify(input.conversationId)} on ${input.platform}`,\n );\n }\n return address;\n}\n\n/** Normalize platform intake into one authoritative conversation identity. */\nexport function createConversationEvent<\n T extends Omit<ConversationEvent, \"address\" | \"conversationId\">,\n>(input: T & ConversationIdentityInput): T & ConversationEvent {\n const address = resolveConversationAddress(input);\n return { ...input, address, conversationId: address.conversationId };\n}\n\n/** Normalize a platform response context into one authoritative identity. */\nexport function createConversationMessage<\n T extends Omit<ConversationMessage, \"address\" | \"conversationId\">,\n>(input: T & ConversationIdentityInput): T & ConversationMessage {\n const address = resolveConversationAddress(input);\n return { ...input, address, conversationId: address.conversationId };\n}\n"]}
|
|
@@ -9,7 +9,9 @@ export declare class DiscordMessagingBot implements MessagingBot {
|
|
|
9
9
|
private token;
|
|
10
10
|
private workspace;
|
|
11
11
|
private botUserId;
|
|
12
|
+
private stopped;
|
|
12
13
|
private queues;
|
|
14
|
+
private intake;
|
|
13
15
|
private startupTime;
|
|
14
16
|
private channels;
|
|
15
17
|
private users;
|
|
@@ -18,6 +20,7 @@ export declare class DiscordMessagingBot implements MessagingBot {
|
|
|
18
20
|
workspace: Workspace;
|
|
19
21
|
});
|
|
20
22
|
start(): Promise<void>;
|
|
23
|
+
stop(): Promise<void>;
|
|
21
24
|
postMessage(channel: string, text: string): Promise<string>;
|
|
22
25
|
updateMessage(channel: string, ts: string, text: string): Promise<void>;
|
|
23
26
|
addReaction(channel: string, messageTs: string, emoji: string): Promise<void>;
|
|
@@ -46,7 +49,7 @@ export declare class DiscordMessagingBot implements MessagingBot {
|
|
|
46
49
|
* Process attachments from a Discord message.
|
|
47
50
|
* Downloads files before returning so the agent can read them immediately.
|
|
48
51
|
*/
|
|
49
|
-
processAttachments(channelId: string, attachments: Collection<string, Attachment
|
|
52
|
+
processAttachments(channelId: string, attachments: Collection<string, Attachment>): Promise<{
|
|
50
53
|
name: string;
|
|
51
54
|
localPath: string;
|
|
52
55
|
}[]>;
|
|
@@ -57,6 +60,8 @@ export declare class DiscordMessagingBot implements MessagingBot {
|
|
|
57
60
|
private resolveConversationContext;
|
|
58
61
|
private createSlashCommandAdapters;
|
|
59
62
|
private setupEventHandlers;
|
|
63
|
+
private handleInteractionCreate;
|
|
64
|
+
private handleMessageCreate;
|
|
60
65
|
private fetchTextChannel;
|
|
61
66
|
}
|
|
62
67
|
//# sourceMappingURL=bot.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/discord/bot.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/discord/bot.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import * as log from "../../log.js";
|
|
|
7
7
|
import { createOfficeAddress } from "../../office/index.js";
|
|
8
8
|
import { resolveChatSessionKey } from "../../sessions/session-key.js";
|
|
9
9
|
import { formatNothingRunning } from "../../platform-messages.js";
|
|
10
|
-
import { appendBotResponseLog, appendChannelLog, MessagingEventQueue, downloadUrlToFile, resolveOnlyScopedStopTarget, resolveStopTarget, saveIncomingAttachments, withRetry, } from "../shared.js";
|
|
10
|
+
import { appendBotResponseLog, appendChannelLog, MessagingEventQueue, MessagingIntakeTracker, downloadUrlToFile, resolveOnlyScopedStopTarget, resolveStopTarget, saveIncomingAttachments, withRetry, } from "../shared.js";
|
|
11
11
|
import { COMMAND_MANIFEST } from "../../commands/manifest.js";
|
|
12
12
|
import { processMessageIntake } from "../intake.js";
|
|
13
13
|
import { createDiscordAdapters } from "./context.js";
|
|
@@ -29,7 +29,9 @@ const discordRetry = (fn) => withRetry(fn, { isRateLimited: discordIsRateLimited
|
|
|
29
29
|
export class DiscordMessagingBot {
|
|
30
30
|
constructor(handler, config) {
|
|
31
31
|
this.botUserId = null;
|
|
32
|
+
this.stopped = false;
|
|
32
33
|
this.queues = new Map();
|
|
34
|
+
this.intake = new MessagingIntakeTracker("Discord");
|
|
33
35
|
this.startupTime = 0;
|
|
34
36
|
this.channels = new Map();
|
|
35
37
|
this.users = new Map();
|
|
@@ -50,8 +52,13 @@ export class DiscordMessagingBot {
|
|
|
50
52
|
// Public API (implements MessagingBot)
|
|
51
53
|
// ==========================================================================
|
|
52
54
|
async start() {
|
|
55
|
+
this.stopped = false;
|
|
53
56
|
await new Promise((resolve, reject) => {
|
|
54
57
|
this.client.once(Events.ClientReady, async (readyClient) => {
|
|
58
|
+
if (this.stopped) {
|
|
59
|
+
resolve();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
55
62
|
this.botUserId = readyClient.user.id;
|
|
56
63
|
this.startupTime = Date.now();
|
|
57
64
|
log.logConnected("Discord");
|
|
@@ -86,6 +93,16 @@ export class DiscordMessagingBot {
|
|
|
86
93
|
this.client.login(this.token).catch(reject);
|
|
87
94
|
});
|
|
88
95
|
}
|
|
96
|
+
async stop() {
|
|
97
|
+
this.stopped = true;
|
|
98
|
+
try {
|
|
99
|
+
this.client.destroy();
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
await this.intake.close();
|
|
103
|
+
await Promise.all([...this.queues.values()].map((queue) => queue.close()));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
89
106
|
async postMessage(channel, text) {
|
|
90
107
|
return discordRetry(async () => {
|
|
91
108
|
const ch = await this.fetchTextChannel(channel);
|
|
@@ -106,6 +123,8 @@ export class DiscordMessagingBot {
|
|
|
106
123
|
});
|
|
107
124
|
}
|
|
108
125
|
enqueueEvent(event) {
|
|
126
|
+
if (this.stopped)
|
|
127
|
+
return false;
|
|
109
128
|
const conversationId = event.conversationId;
|
|
110
129
|
const queue = this.getQueue(conversationId);
|
|
111
130
|
if (queue.size() >= 5) {
|
|
@@ -113,11 +132,10 @@ export class DiscordMessagingBot {
|
|
|
113
132
|
return false;
|
|
114
133
|
}
|
|
115
134
|
log.logInfo(`Enqueueing event for ${conversationId}: ${event.text.substring(0, 50)}`);
|
|
116
|
-
queue.enqueue(() => {
|
|
135
|
+
return queue.enqueue(() => {
|
|
117
136
|
const context = createDiscordAdapters(event, this);
|
|
118
137
|
return this.handler.handleEvent(event, this, context);
|
|
119
138
|
});
|
|
120
|
-
return true;
|
|
121
139
|
}
|
|
122
140
|
getMessagingInfo() {
|
|
123
141
|
return {
|
|
@@ -218,7 +236,7 @@ export class DiscordMessagingBot {
|
|
|
218
236
|
* Process attachments from a Discord message.
|
|
219
237
|
* Downloads files before returning so the agent can read them immediately.
|
|
220
238
|
*/
|
|
221
|
-
async processAttachments(channelId, attachments
|
|
239
|
+
async processAttachments(channelId, attachments) {
|
|
222
240
|
const items = [];
|
|
223
241
|
for (const attachment of attachments.values()) {
|
|
224
242
|
if (!attachment.name) {
|
|
@@ -354,161 +372,167 @@ export class DiscordMessagingBot {
|
|
|
354
372
|
return { address: message.address, message, responder, platform };
|
|
355
373
|
}
|
|
356
374
|
setupEventHandlers() {
|
|
357
|
-
this.client.on(Events.InteractionCreate,
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
375
|
+
this.client.on(Events.InteractionCreate, (interaction) => {
|
|
376
|
+
void this.intake.run(() => this.handleInteractionCreate(interaction));
|
|
377
|
+
});
|
|
378
|
+
this.client.on(Events.MessageCreate, (message) => {
|
|
379
|
+
void this.intake.run(() => this.handleMessageCreate(message));
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
async handleInteractionCreate(interaction) {
|
|
383
|
+
if (!interaction.isChatInputCommand())
|
|
384
|
+
return;
|
|
385
|
+
const manifestEntry = COMMAND_MANIFEST.find((entry) => entry.discord && entry.name === interaction.commandName);
|
|
386
|
+
if (!manifestEntry)
|
|
387
|
+
return;
|
|
388
|
+
const isDM = !interaction.inGuild();
|
|
389
|
+
const { conversationId, threadTs } = this.resolveConversationContext({
|
|
390
|
+
channelId: interaction.channelId,
|
|
391
|
+
inGuild: interaction.inGuild(),
|
|
392
|
+
isThread: interaction.channel?.isThread() ?? false,
|
|
393
|
+
parentChannelId: interaction.channel && "parentId" in interaction.channel
|
|
394
|
+
? interaction.channel.parentId
|
|
395
|
+
: null,
|
|
396
|
+
});
|
|
397
|
+
const sessionKey = resolveChatSessionKey({
|
|
398
|
+
conversationId,
|
|
399
|
+
conversationKind: isDM ? "direct" : "shared",
|
|
400
|
+
messageId: interaction.id,
|
|
401
|
+
persistentTopLevel: true,
|
|
402
|
+
threadTs,
|
|
403
|
+
});
|
|
404
|
+
const commandArg = manifestEntry.arg
|
|
405
|
+
? interaction.options.getString(manifestEntry.arg.name)?.trim()
|
|
406
|
+
: undefined;
|
|
407
|
+
const commandText = commandArg
|
|
408
|
+
? `/${interaction.commandName} ${commandArg}`
|
|
409
|
+
: `/${interaction.commandName}`;
|
|
410
|
+
this.logToFile(conversationId, {
|
|
411
|
+
date: new Date(interaction.createdTimestamp).toISOString(),
|
|
412
|
+
ts: interaction.id,
|
|
413
|
+
...(threadTs ? { threadTs } : {}),
|
|
414
|
+
user: interaction.user.id,
|
|
415
|
+
userName: interaction.user.username,
|
|
416
|
+
text: commandText,
|
|
417
|
+
attachments: [],
|
|
418
|
+
isMessagingBot: false,
|
|
419
|
+
});
|
|
420
|
+
const context = this.createSlashCommandAdapters(interaction, commandText, sessionKey, conversationId);
|
|
421
|
+
try {
|
|
422
|
+
// Magic words are conversation-intake controls, not command handlers;
|
|
423
|
+
// the manifest's metadata routes them (today only `stop`).
|
|
424
|
+
if (manifestEntry.magicWord) {
|
|
425
|
+
const stopTarget = this.resolveStopTarget(conversationId, sessionKey);
|
|
426
|
+
if (stopTarget) {
|
|
427
|
+
await this.handler.handleStop(createOfficeAddress("discord", conversationId), stopTarget, this);
|
|
428
|
+
await context.responder.respond("Stopped the current conversation.");
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
await context.responder.respond(formatNothingRunning("discord"));
|
|
432
|
+
}
|
|
362
433
|
return;
|
|
363
|
-
|
|
364
|
-
const
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
isThread: interaction.channel?.isThread() ?? false,
|
|
368
|
-
parentChannelId: interaction.channel && "parentId" in interaction.channel
|
|
369
|
-
? interaction.channel.parentId
|
|
370
|
-
: null,
|
|
371
|
-
});
|
|
372
|
-
const sessionKey = resolveChatSessionKey({
|
|
434
|
+
}
|
|
435
|
+
const event = createConversationEvent({
|
|
436
|
+
platform: "discord",
|
|
437
|
+
type: "dm",
|
|
373
438
|
conversationId,
|
|
374
439
|
conversationKind: isDM ? "direct" : "shared",
|
|
375
|
-
messageId: interaction.id,
|
|
376
|
-
persistentTopLevel: true,
|
|
377
|
-
threadTs,
|
|
378
|
-
});
|
|
379
|
-
const commandArg = manifestEntry.arg
|
|
380
|
-
? interaction.options.getString(manifestEntry.arg.name)?.trim()
|
|
381
|
-
: undefined;
|
|
382
|
-
const commandText = commandArg
|
|
383
|
-
? `/${interaction.commandName} ${commandArg}`
|
|
384
|
-
: `/${interaction.commandName}`;
|
|
385
|
-
this.logToFile(conversationId, {
|
|
386
|
-
date: new Date(interaction.createdTimestamp).toISOString(),
|
|
387
440
|
ts: interaction.id,
|
|
388
|
-
|
|
441
|
+
thread_ts: threadTs,
|
|
442
|
+
sessionKey,
|
|
389
443
|
user: interaction.user.id,
|
|
390
|
-
userName: interaction.user.username,
|
|
391
444
|
text: commandText,
|
|
392
445
|
attachments: [],
|
|
393
|
-
isMessagingBot: false,
|
|
394
446
|
});
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
await context.responder.respond("Stopped the current conversation.");
|
|
404
|
-
}
|
|
405
|
-
else {
|
|
406
|
-
await context.responder.respond(formatNothingRunning("discord"));
|
|
407
|
-
}
|
|
408
|
-
return;
|
|
409
|
-
}
|
|
410
|
-
const event = createConversationEvent({
|
|
411
|
-
platform: "discord",
|
|
412
|
-
type: "dm",
|
|
413
|
-
conversationId,
|
|
414
|
-
conversationKind: isDM ? "direct" : "shared",
|
|
415
|
-
ts: interaction.id,
|
|
416
|
-
thread_ts: threadTs,
|
|
417
|
-
sessionKey,
|
|
418
|
-
user: interaction.user.id,
|
|
419
|
-
text: commandText,
|
|
420
|
-
attachments: [],
|
|
447
|
+
await this.handler.handleEvent(event, this, context);
|
|
448
|
+
}
|
|
449
|
+
catch (err) {
|
|
450
|
+
log.logWarning("Discord slash command error", err instanceof Error ? err.message : String(err));
|
|
451
|
+
if (!interaction.replied && !interaction.deferred) {
|
|
452
|
+
await interaction.reply({
|
|
453
|
+
content: `${interaction.commandName} command failed. Please try again later.`,
|
|
454
|
+
ephemeral: !isDM,
|
|
421
455
|
});
|
|
422
|
-
await this.handler.handleEvent(event, this, context);
|
|
423
|
-
}
|
|
424
|
-
catch (err) {
|
|
425
|
-
log.logWarning("Discord slash command error", err instanceof Error ? err.message : String(err));
|
|
426
|
-
if (!interaction.replied && !interaction.deferred) {
|
|
427
|
-
await interaction.reply({
|
|
428
|
-
content: `${interaction.commandName} command failed. Please try again later.`,
|
|
429
|
-
ephemeral: !isDM,
|
|
430
|
-
});
|
|
431
|
-
}
|
|
432
456
|
}
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
async handleMessageCreate(msg) {
|
|
460
|
+
// Skip messages from before startup
|
|
461
|
+
if (msg.createdTimestamp < this.startupTime)
|
|
462
|
+
return;
|
|
463
|
+
// Skip bot messages
|
|
464
|
+
if (msg.author.bot)
|
|
465
|
+
return;
|
|
466
|
+
const isDM = msg.channel.type === 1; // ChannelType.DM = 1
|
|
467
|
+
const isInThread = msg.channel.isThread();
|
|
468
|
+
const referencedMsgId = msg.reference?.messageId;
|
|
469
|
+
const isThreadReply = isInThread || !!referencedMsgId;
|
|
470
|
+
const isMentioned = msg.mentions.users.has(this.botUserId ?? "");
|
|
471
|
+
const isAutoReplyCandidate = !isDM && !isMentioned && !isThreadReply;
|
|
472
|
+
const { conversationId, threadTs } = this.resolveConversationContext({
|
|
473
|
+
channelId: msg.channelId,
|
|
474
|
+
inGuild: !isDM,
|
|
475
|
+
isThread: isInThread,
|
|
476
|
+
parentChannelId: "parentId" in msg.channel ? msg.channel.parentId : null,
|
|
477
|
+
referencedMsgId,
|
|
433
478
|
});
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
const
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
const eventBase = createConversationEvent({
|
|
478
|
-
platform: "discord",
|
|
479
|
-
type: isDM ? "dm" : "mention",
|
|
480
|
-
conversationId,
|
|
481
|
-
conversationKind,
|
|
479
|
+
const userId = msg.author.id;
|
|
480
|
+
const userName = msg.author.username;
|
|
481
|
+
const msgId = msg.id;
|
|
482
|
+
// Track user
|
|
483
|
+
this.users.set(userId, {
|
|
484
|
+
id: userId,
|
|
485
|
+
userName,
|
|
486
|
+
displayName: msg.member?.displayName ?? userName,
|
|
487
|
+
});
|
|
488
|
+
// Track channel
|
|
489
|
+
if (!this.channels.has(conversationId) && "name" in msg.channel) {
|
|
490
|
+
const ch = msg.channel;
|
|
491
|
+
this.channels.set(conversationId, { id: conversationId, name: ch.name });
|
|
492
|
+
}
|
|
493
|
+
const conversationKind = isDM ? "direct" : "shared";
|
|
494
|
+
const sessionKey = resolveChatSessionKey({
|
|
495
|
+
conversationId,
|
|
496
|
+
conversationKind,
|
|
497
|
+
messageId: msgId,
|
|
498
|
+
persistentTopLevel: true,
|
|
499
|
+
threadTs,
|
|
500
|
+
});
|
|
501
|
+
const cleanedText = this.stripMessagingBotMention(msg.content);
|
|
502
|
+
const eventBase = createConversationEvent({
|
|
503
|
+
platform: "discord",
|
|
504
|
+
type: isDM ? "dm" : "mention",
|
|
505
|
+
conversationId,
|
|
506
|
+
conversationKind,
|
|
507
|
+
ts: msgId,
|
|
508
|
+
thread_ts: threadTs,
|
|
509
|
+
sessionKey,
|
|
510
|
+
user: userId,
|
|
511
|
+
userName,
|
|
512
|
+
text: cleanedText,
|
|
513
|
+
});
|
|
514
|
+
await processMessageIntake({
|
|
515
|
+
eventBase,
|
|
516
|
+
office: this.workspace.office(eventBase.address),
|
|
517
|
+
isAutoReplyCandidate,
|
|
518
|
+
magicWord: { addressed: !isAutoReplyCandidate, scopeFallback: "top-level" },
|
|
519
|
+
busyPolicy: "queue",
|
|
520
|
+
logEntryBase: {
|
|
521
|
+
date: msg.createdAt.toISOString(),
|
|
482
522
|
ts: msgId,
|
|
483
|
-
|
|
484
|
-
sessionKey,
|
|
523
|
+
...(!isDM && threadTs ? { threadTs } : {}),
|
|
485
524
|
user: userId,
|
|
486
525
|
userName,
|
|
487
526
|
text: cleanedText,
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
ts: msgId,
|
|
498
|
-
...(!isDM && threadTs ? { threadTs } : {}),
|
|
499
|
-
user: userId,
|
|
500
|
-
userName,
|
|
501
|
-
text: cleanedText,
|
|
502
|
-
isMessagingBot: false,
|
|
503
|
-
},
|
|
504
|
-
log: (entry) => this.logToFile(conversationId, entry),
|
|
505
|
-
processAttachments: () => this.processAttachments(conversationId, msg.attachments, msgId),
|
|
506
|
-
queueKey: sessionKey,
|
|
507
|
-
enqueue: (queueKey, work) => this.getQueue(queueKey).enqueue(work),
|
|
508
|
-
handler: this.handler,
|
|
509
|
-
bot: this,
|
|
510
|
-
createContext: (event) => createDiscordAdapters(event, this),
|
|
511
|
-
});
|
|
527
|
+
isMessagingBot: false,
|
|
528
|
+
},
|
|
529
|
+
log: (entry) => this.logToFile(conversationId, entry),
|
|
530
|
+
processAttachments: () => this.processAttachments(conversationId, msg.attachments),
|
|
531
|
+
queueKey: sessionKey,
|
|
532
|
+
enqueue: (queueKey, work) => this.getQueue(queueKey).enqueue(work),
|
|
533
|
+
handler: this.handler,
|
|
534
|
+
bot: this,
|
|
535
|
+
createContext: (event) => createDiscordAdapters(event, this),
|
|
512
536
|
});
|
|
513
537
|
}
|
|
514
538
|
async fetchTextChannel(channelId) {
|