@geminixiang/mikan 1.0.0-beta.3 → 1.0.0-beta.30
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 +563 -0
- package/README.md +60 -24
- 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 +1 -0
- package/dist/adapters/discord/bot.d.ts.map +1 -1
- package/dist/adapters/discord/bot.js +47 -65
- package/dist/adapters/discord/bot.js.map +1 -1
- package/dist/adapters/discord/context.d.ts.map +1 -1
- package/dist/adapters/discord/context.js +46 -211
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/github/bot.d.ts +86 -0
- package/dist/adapters/github/bot.d.ts.map +1 -0
- package/dist/adapters/github/bot.js +640 -0
- package/dist/adapters/github/bot.js.map +1 -0
- package/dist/adapters/github/client.d.ts +122 -0
- package/dist/adapters/github/client.d.ts.map +1 -0
- package/dist/adapters/github/client.js +314 -0
- package/dist/adapters/github/client.js.map +1 -0
- package/dist/adapters/github/cloudbuild.d.ts +19 -0
- package/dist/adapters/github/cloudbuild.d.ts.map +1 -0
- package/dist/adapters/github/cloudbuild.js +71 -0
- package/dist/adapters/github/cloudbuild.js.map +1 -0
- package/dist/adapters/github/context.d.ts +9 -0
- package/dist/adapters/github/context.d.ts.map +1 -0
- package/dist/adapters/github/context.js +98 -0
- package/dist/adapters/github/context.js.map +1 -0
- package/dist/adapters/github/gcp-auth.d.ts +28 -0
- package/dist/adapters/github/gcp-auth.d.ts.map +1 -0
- package/dist/adapters/github/gcp-auth.js +196 -0
- package/dist/adapters/github/gcp-auth.js.map +1 -0
- package/dist/adapters/github/github-ops.d.ts +90 -0
- package/dist/adapters/github/github-ops.d.ts.map +1 -0
- package/dist/adapters/github/github-ops.js +405 -0
- package/dist/adapters/github/github-ops.js.map +1 -0
- package/dist/adapters/github/ids.d.ts +34 -0
- package/dist/adapters/github/ids.d.ts.map +1 -0
- package/dist/adapters/github/ids.js +53 -0
- package/dist/adapters/github/ids.js.map +1 -0
- package/dist/adapters/github/repo.d.ts +32 -0
- package/dist/adapters/github/repo.d.ts.map +1 -0
- package/dist/adapters/github/repo.js +141 -0
- package/dist/adapters/github/repo.js.map +1 -0
- package/dist/adapters/github/tool-pack.d.ts +14 -0
- package/dist/adapters/github/tool-pack.d.ts.map +1 -0
- package/dist/adapters/github/tool-pack.js +56 -0
- package/dist/adapters/github/tool-pack.js.map +1 -0
- package/dist/adapters/github/tools/checks.d.ts +19 -0
- package/dist/adapters/github/tools/checks.d.ts.map +1 -0
- package/dist/adapters/github/tools/checks.js +105 -0
- package/dist/adapters/github/tools/checks.js.map +1 -0
- package/dist/adapters/github/tools/issue.d.ts +21 -0
- package/dist/adapters/github/tools/issue.d.ts.map +1 -0
- package/dist/adapters/github/tools/issue.js +48 -0
- package/dist/adapters/github/tools/issue.js.map +1 -0
- package/dist/adapters/github/tools/pr.d.ts +22 -0
- package/dist/adapters/github/tools/pr.d.ts.map +1 -0
- package/dist/adapters/github/tools/pr.js +48 -0
- package/dist/adapters/github/tools/pr.js.map +1 -0
- package/dist/adapters/github/tools/read.d.ts +21 -0
- package/dist/adapters/github/tools/read.d.ts.map +1 -0
- package/dist/adapters/github/tools/read.js +141 -0
- package/dist/adapters/github/tools/read.js.map +1 -0
- package/dist/adapters/github/tools/review-reply.d.ts +17 -0
- package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
- package/dist/adapters/github/tools/review-reply.js +38 -0
- package/dist/adapters/github/tools/review-reply.js.map +1 -0
- package/dist/adapters/github/tools/sync.d.ts +17 -0
- package/dist/adapters/github/tools/sync.d.ts.map +1 -0
- package/dist/adapters/github/tools/sync.js +34 -0
- package/dist/adapters/github/tools/sync.js.map +1 -0
- package/dist/adapters/github/types.d.ts +372 -0
- package/dist/adapters/github/types.d.ts.map +1 -0
- package/dist/adapters/github/types.js +2 -0
- package/dist/adapters/github/types.js.map +1 -0
- package/dist/adapters/intake.d.ts +16 -5
- package/dist/adapters/intake.d.ts.map +1 -1
- package/dist/adapters/intake.js +84 -22
- package/dist/adapters/intake.js.map +1 -1
- package/dist/adapters/progressive-renderer.d.ts +7 -0
- package/dist/adapters/progressive-renderer.d.ts.map +1 -0
- package/dist/adapters/progressive-renderer.js +383 -0
- package/dist/adapters/progressive-renderer.js.map +1 -0
- package/dist/adapters/slack/blocks.d.ts.map +1 -1
- package/dist/adapters/slack/blocks.js +111 -111
- package/dist/adapters/slack/blocks.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +10 -6
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +173 -145
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/context.d.ts.map +1 -1
- package/dist/adapters/slack/context.js +3 -14
- 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 +126 -323
- package/dist/adapters/slack/response-lifecycle.js.map +1 -1
- package/dist/adapters/slack/session.d.ts.map +1 -1
- package/dist/adapters/slack/session.js +5 -8
- package/dist/adapters/slack/session.js.map +1 -1
- package/dist/adapters/slack/tool-pack.d.ts +11 -0
- package/dist/adapters/slack/tool-pack.d.ts.map +1 -0
- package/dist/adapters/slack/tool-pack.js +45 -0
- package/dist/adapters/slack/tool-pack.js.map +1 -0
- package/dist/adapters/slack/tools/blockkit.d.ts +14 -0
- package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -0
- package/dist/adapters/slack/tools/blockkit.js +106 -0
- package/dist/adapters/slack/tools/blockkit.js.map +1 -0
- package/dist/adapters/slack/types.d.ts +37 -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 +1 -2
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +51 -63
- package/dist/adapters/telegram/bot.js.map +1 -1
- package/dist/adapters/telegram/context.d.ts.map +1 -1
- package/dist/adapters/telegram/context.js +55 -182
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/adapters/types.d.ts +86 -10
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/agent.d.ts +14 -19
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +745 -243
- package/dist/agent.js.map +1 -1
- package/dist/cli/arg-grammar.d.ts +25 -0
- package/dist/cli/arg-grammar.d.ts.map +1 -0
- package/dist/cli/arg-grammar.js +59 -0
- package/dist/cli/arg-grammar.js.map +1 -0
- package/dist/cli/boot.d.ts +5 -0
- package/dist/cli/boot.d.ts.map +1 -0
- package/dist/cli/boot.js +112 -0
- package/dist/cli/boot.js.map +1 -0
- package/dist/cli/download.d.ts.map +1 -0
- package/dist/cli/download.js.map +1 -0
- package/dist/cli/ext-dev.d.ts +2 -0
- package/dist/cli/ext-dev.d.ts.map +1 -0
- package/dist/cli/ext-dev.js +177 -0
- package/dist/cli/ext-dev.js.map +1 -0
- package/dist/cli/ext-git.d.ts +17 -0
- package/dist/cli/ext-git.d.ts.map +1 -0
- package/dist/cli/ext-git.js +107 -0
- package/dist/cli/ext-git.js.map +1 -0
- package/dist/cli/ext.d.ts +2 -0
- package/dist/cli/ext.d.ts.map +1 -0
- package/dist/cli/ext.js +222 -0
- package/dist/cli/ext.js.map +1 -0
- package/dist/cli/types.d.ts +20 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/commands/admin.d.ts.map +1 -1
- package/dist/commands/admin.js +2 -1
- package/dist/commands/admin.js.map +1 -1
- package/dist/commands/auto-reply.d.ts.map +1 -1
- package/dist/commands/auto-reply.js +2 -6
- package/dist/commands/auto-reply.js.map +1 -1
- package/dist/commands/extensions.d.ts.map +1 -1
- package/dist/commands/extensions.js +18 -8
- package/dist/commands/extensions.js.map +1 -1
- package/dist/commands/login.d.ts +2 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +35 -3
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/manifest.d.ts +30 -0
- package/dist/commands/manifest.d.ts.map +1 -0
- package/dist/commands/manifest.js +121 -0
- package/dist/commands/manifest.js.map +1 -0
- package/dist/commands/model.d.ts +2 -3
- package/dist/commands/model.d.ts.map +1 -1
- package/dist/commands/model.js +57 -20
- package/dist/commands/model.js.map +1 -1
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +10 -2
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/registry.d.ts +2 -2
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +1 -2
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/sandbox.d.ts.map +1 -1
- package/dist/commands/sandbox.js +23 -17
- package/dist/commands/sandbox.js.map +1 -1
- package/dist/commands/text.d.ts +2 -0
- package/dist/commands/text.d.ts.map +1 -0
- package/dist/commands/text.js +16 -0
- package/dist/commands/text.js.map +1 -0
- package/dist/commands/types.d.ts +70 -2
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/types.js.map +1 -1
- package/dist/config.d.ts +1 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +102 -95
- package/dist/config.js.map +1 -1
- package/dist/env-manifest.d.ts +28 -0
- package/dist/env-manifest.d.ts.map +1 -0
- package/dist/env-manifest.js +214 -0
- package/dist/env-manifest.js.map +1 -0
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +9 -73
- package/dist/events.js.map +1 -1
- package/dist/execution-resolver.d.ts +7 -6
- package/dist/execution-resolver.d.ts.map +1 -1
- package/dist/execution-resolver.js +105 -110
- package/dist/execution-resolver.js.map +1 -1
- package/dist/harness/auth.d.ts +2 -1
- package/dist/harness/auth.d.ts.map +1 -1
- package/dist/harness/auth.js +6 -0
- package/dist/harness/auth.js.map +1 -1
- package/dist/harness/event-format.d.ts +25 -0
- package/dist/harness/event-format.d.ts.map +1 -0
- package/dist/harness/event-format.js +159 -0
- package/dist/harness/event-format.js.map +1 -0
- package/dist/harness/extensions/blockkit.d.ts +19 -0
- package/dist/harness/extensions/blockkit.d.ts.map +1 -0
- package/dist/harness/extensions/blockkit.js +42 -0
- package/dist/harness/extensions/blockkit.js.map +1 -0
- package/dist/harness/extensions/loader.d.ts +25 -48
- package/dist/harness/extensions/loader.d.ts.map +1 -1
- package/dist/harness/extensions/loader.js +373 -113
- package/dist/harness/extensions/loader.js.map +1 -1
- package/dist/harness/extensions/registry.d.ts +75 -2
- package/dist/harness/extensions/registry.d.ts.map +1 -1
- package/dist/harness/extensions/registry.js +239 -0
- package/dist/harness/extensions/registry.js.map +1 -1
- package/dist/harness/extensions/types.d.ts +318 -25
- package/dist/harness/extensions/types.d.ts.map +1 -1
- package/dist/harness/extensions/types.js.map +1 -1
- package/dist/harness/index.d.ts +18 -8
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +7 -4
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/models.d.ts +7 -4
- package/dist/harness/models.d.ts.map +1 -1
- package/dist/harness/models.js +10 -0
- package/dist/harness/models.js.map +1 -1
- package/dist/harness/runner.d.ts +50 -54
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +230 -44
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session-store.d.ts +9 -5
- package/dist/harness/session-store.d.ts.map +1 -1
- package/dist/harness/session-store.js +131 -30
- package/dist/harness/session-store.js.map +1 -1
- package/dist/harness/settings.d.ts +2 -20
- package/dist/harness/settings.d.ts.map +1 -1
- package/dist/harness/settings.js +11 -0
- package/dist/harness/settings.js.map +1 -1
- package/dist/harness/skills.d.ts +2 -29
- package/dist/harness/skills.d.ts.map +1 -1
- package/dist/harness/skills.js.map +1 -1
- package/dist/harness/subagent-profiles.d.ts +8 -0
- package/dist/harness/subagent-profiles.d.ts.map +1 -0
- package/dist/harness/subagent-profiles.js +290 -0
- package/dist/harness/subagent-profiles.js.map +1 -0
- package/dist/harness/subagent-runner.d.ts +39 -0
- package/dist/harness/subagent-runner.d.ts.map +1 -0
- package/dist/harness/subagent-runner.js +615 -0
- package/dist/harness/subagent-runner.js.map +1 -0
- package/dist/harness/types.d.ts +263 -1
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/usage.d.ts +6 -0
- package/dist/harness/usage.d.ts.map +1 -0
- package/dist/harness/usage.js +32 -0
- package/dist/harness/usage.js.map +1 -0
- package/dist/index.d.ts +33 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -6
- package/dist/index.js.map +1 -1
- package/dist/main.js +253 -109
- package/dist/main.js.map +1 -1
- package/dist/observability/instrument.js +6 -4
- package/dist/observability/instrument.js.map +1 -1
- package/dist/observability/sentry.d.ts.map +1 -1
- package/dist/observability/sentry.js +3 -2
- package/dist/observability/sentry.js.map +1 -1
- package/dist/packages/admin.d.ts +17 -0
- package/dist/packages/admin.d.ts.map +1 -0
- package/dist/packages/admin.js +96 -0
- package/dist/packages/admin.js.map +1 -0
- package/dist/packages/index.d.ts +6 -0
- package/dist/packages/index.d.ts.map +1 -0
- package/dist/packages/index.js +6 -0
- package/dist/packages/index.js.map +1 -0
- package/dist/packages/inspect.d.ts +11 -0
- package/dist/packages/inspect.d.ts.map +1 -0
- package/dist/packages/inspect.js +100 -0
- package/dist/packages/inspect.js.map +1 -0
- package/dist/packages/materialize.d.ts +39 -0
- package/dist/packages/materialize.d.ts.map +1 -0
- package/dist/packages/materialize.js +300 -0
- package/dist/packages/materialize.js.map +1 -0
- package/dist/packages/resolve.d.ts +25 -0
- package/dist/packages/resolve.d.ts.map +1 -0
- package/dist/packages/resolve.js +212 -0
- package/dist/packages/resolve.js.map +1 -0
- package/dist/packages/source.d.ts +33 -0
- package/dist/packages/source.d.ts.map +1 -0
- package/dist/packages/source.js +177 -0
- package/dist/packages/source.js.map +1 -0
- package/dist/packages/types.d.ts +104 -0
- package/dist/packages/types.d.ts.map +1 -0
- package/dist/packages/types.js +2 -0
- package/dist/packages/types.js.map +1 -0
- package/dist/provisioner.d.ts.map +1 -1
- package/dist/provisioner.js +6 -6
- package/dist/provisioner.js.map +1 -1
- package/dist/runtime/conversation-runtime.d.ts +1 -1
- package/dist/runtime/conversation-runtime.d.ts.map +1 -1
- package/dist/runtime/conversation-runtime.js +481 -98
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/session-lifecycle.d.ts +28 -0
- package/dist/runtime/session-lifecycle.d.ts.map +1 -0
- package/dist/runtime/session-lifecycle.js +161 -0
- package/dist/runtime/session-lifecycle.js.map +1 -0
- package/dist/runtime/types.d.ts +45 -5
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/cloudflare.d.ts +3 -0
- package/dist/sandbox/cloudflare.d.ts.map +1 -1
- package/dist/sandbox/cloudflare.js +11 -0
- package/dist/sandbox/cloudflare.js.map +1 -1
- package/dist/sandbox/container.d.ts +4 -0
- package/dist/sandbox/container.d.ts.map +1 -1
- package/dist/sandbox/container.js +12 -2
- package/dist/sandbox/container.js.map +1 -1
- package/dist/sandbox/firecracker.d.ts +3 -0
- package/dist/sandbox/firecracker.d.ts.map +1 -1
- package/dist/sandbox/firecracker.js +11 -1
- package/dist/sandbox/firecracker.js.map +1 -1
- package/dist/sandbox/gondolin.d.ts +57 -0
- package/dist/sandbox/gondolin.d.ts.map +1 -0
- package/dist/sandbox/gondolin.js +764 -0
- package/dist/sandbox/gondolin.js.map +1 -0
- package/dist/sandbox/host.d.ts +4 -0
- package/dist/sandbox/host.d.ts.map +1 -1
- package/dist/sandbox/host.js +52 -0
- package/dist/sandbox/host.js.map +1 -1
- package/dist/sandbox/identity.d.ts +16 -0
- package/dist/sandbox/identity.d.ts.map +1 -0
- package/dist/sandbox/identity.js +42 -0
- package/dist/sandbox/identity.js.map +1 -0
- package/dist/sandbox/image.d.ts.map +1 -1
- package/dist/sandbox/image.js +1 -0
- package/dist/sandbox/image.js.map +1 -1
- package/dist/sandbox/index.d.ts +15 -4
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +25 -3
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/path-context.js +18 -8
- package/dist/sandbox/path-context.js.map +1 -1
- package/dist/sandbox/types.d.ts +65 -1
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sandbox/types.js.map +1 -1
- package/dist/sandbox/utils.d.ts +12 -0
- package/dist/sandbox/utils.d.ts.map +1 -1
- package/dist/sandbox/utils.js +38 -0
- package/dist/sandbox/utils.js.map +1 -1
- package/dist/sessions/chat-history-sync.d.ts +25 -0
- package/dist/sessions/chat-history-sync.d.ts.map +1 -0
- package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +98 -124
- package/dist/sessions/chat-history-sync.js.map +1 -0
- package/dist/sessions/conversation-log.d.ts +9 -0
- package/dist/sessions/conversation-log.d.ts.map +1 -0
- package/dist/sessions/conversation-log.js +47 -0
- package/dist/sessions/conversation-log.js.map +1 -0
- package/dist/sessions/history-line.d.ts +20 -0
- package/dist/sessions/history-line.d.ts.map +1 -0
- package/dist/sessions/history-line.js +24 -0
- package/dist/sessions/history-line.js.map +1 -0
- package/dist/sessions/policy.d.ts.map +1 -1
- package/dist/sessions/policy.js +5 -3
- package/dist/sessions/policy.js.map +1 -1
- package/dist/sessions/rotation.d.ts +2 -0
- package/dist/sessions/rotation.d.ts.map +1 -0
- package/dist/sessions/rotation.js +39 -0
- package/dist/sessions/rotation.js.map +1 -0
- package/dist/sessions/session-key.d.ts +40 -0
- package/dist/sessions/session-key.d.ts.map +1 -0
- package/dist/sessions/session-key.js +92 -0
- package/dist/sessions/session-key.js.map +1 -0
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +40 -18
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +17 -4
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/settings-mutation.d.ts +8 -0
- package/dist/settings-mutation.d.ts.map +1 -0
- package/dist/settings-mutation.js +43 -0
- package/dist/settings-mutation.js.map +1 -0
- package/dist/subagent-progress.d.ts +43 -0
- package/dist/subagent-progress.d.ts.map +1 -0
- package/dist/subagent-progress.js +220 -0
- package/dist/subagent-progress.js.map +1 -0
- package/dist/tools/bash.d.ts +3 -1
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +25 -17
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +10 -12
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/event.d.ts +1 -1
- package/dist/tools/event.d.ts.map +1 -1
- package/dist/tools/event.js +53 -43
- package/dist/tools/event.js.map +1 -1
- package/dist/tools/generate-image.d.ts +17 -0
- package/dist/tools/generate-image.d.ts.map +1 -0
- package/dist/tools/generate-image.js +63 -0
- package/dist/tools/generate-image.js.map +1 -0
- package/dist/tools/host-fn-tool.d.ts +21 -0
- package/dist/tools/host-fn-tool.d.ts.map +1 -0
- package/dist/tools/host-fn-tool.js +32 -0
- package/dist/tools/host-fn-tool.js.map +1 -0
- package/dist/tools/index.d.ts +14 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +28 -3
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/react.d.ts +15 -0
- package/dist/tools/react.d.ts.map +1 -0
- package/dist/tools/react.js +29 -0
- package/dist/tools/react.js.map +1 -0
- package/dist/tools/read.d.ts +1 -0
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +37 -31
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/sandbox.d.ts +2 -2
- package/dist/tools/sandbox.d.ts.map +1 -1
- package/dist/tools/sandbox.js +14 -9
- package/dist/tools/sandbox.js.map +1 -1
- package/dist/tools/subagent-slots.d.ts +28 -0
- package/dist/tools/subagent-slots.d.ts.map +1 -0
- package/dist/tools/subagent-slots.js +72 -0
- package/dist/tools/subagent-slots.js.map +1 -0
- package/dist/tools/subagent.d.ts +54 -0
- package/dist/tools/subagent.d.ts.map +1 -0
- package/dist/tools/subagent.js +401 -0
- package/dist/tools/subagent.js.map +1 -0
- package/dist/tools/types.d.ts +40 -6
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +2 -8
- package/dist/tools/write.js.map +1 -1
- package/dist/trigger.d.ts.map +1 -1
- package/dist/trigger.js +1 -2
- package/dist/trigger.js.map +1 -1
- package/dist/types.d.ts +232 -32
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/date.d.ts +1 -1
- package/dist/utils/date.js +1 -1
- package/dist/utils/date.js.map +1 -1
- package/dist/vault/disabled.d.ts +9 -0
- package/dist/vault/disabled.d.ts.map +1 -0
- package/dist/vault/disabled.js +22 -0
- package/dist/vault/disabled.js.map +1 -0
- package/dist/vault/index.d.ts +0 -2
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +30 -33
- package/dist/vault/index.js.map +1 -1
- package/dist/vault/injection.d.ts +10 -0
- package/dist/vault/injection.d.ts.map +1 -0
- package/dist/vault/injection.js +30 -0
- package/dist/vault/injection.js.map +1 -0
- package/dist/vault/policy.d.ts +20 -0
- package/dist/vault/policy.d.ts.map +1 -0
- package/dist/vault/policy.js +20 -0
- package/dist/vault/policy.js.map +1 -0
- package/dist/vault/types.d.ts +4 -2
- package/dist/vault/types.d.ts.map +1 -1
- package/dist/vault/types.js.map +1 -1
- package/dist/web/admin/portal.d.ts +17 -2
- package/dist/web/admin/portal.d.ts.map +1 -1
- package/dist/web/admin/portal.js +385 -155
- package/dist/web/admin/portal.js.map +1 -1
- package/dist/web/admin/types.d.ts +18 -0
- package/dist/web/admin/types.d.ts.map +1 -1
- package/dist/web/admin/types.js.map +1 -1
- package/dist/web/agent-events/portal.d.ts.map +1 -1
- package/dist/web/agent-events/portal.js +2 -1
- package/dist/web/agent-events/portal.js.map +1 -1
- package/dist/web/login/oauth.d.ts +2 -3
- package/dist/web/login/oauth.d.ts.map +1 -1
- package/dist/web/login/oauth.js +0 -31
- package/dist/web/login/oauth.js.map +1 -1
- package/dist/web/login/portal.js +1 -1
- package/dist/web/login/portal.js.map +1 -1
- package/dist/web/login/types.d.ts +0 -11
- package/dist/web/login/types.d.ts.map +1 -1
- package/dist/web/login/types.js.map +1 -1
- package/dist/web/portal-shell.d.ts +4 -0
- package/dist/web/portal-shell.d.ts.map +1 -0
- package/dist/{portal-shell.js → web/portal-shell.js} +2 -2
- package/dist/web/portal-shell.js.map +1 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +7 -0
- package/dist/web/server.js.map +1 -1
- package/dist/web/session-view/command.d.ts.map +1 -1
- package/dist/web/session-view/command.js +4 -1
- package/dist/web/session-view/command.js.map +1 -1
- package/dist/web/session-view/portal.d.ts.map +1 -1
- package/dist/web/session-view/portal.js +4 -3
- package/dist/web/session-view/portal.js.map +1 -1
- package/dist/web/session-view/service.d.ts.map +1 -1
- package/dist/web/session-view/service.js +2 -1
- package/dist/web/session-view/service.js.map +1 -1
- package/dist/web/session-view/types.d.ts +2 -1
- 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 +5 -0
- package/dist/workspace-projection/index.d.ts.map +1 -0
- package/dist/workspace-projection/index.js +71 -0
- package/dist/workspace-projection/index.js.map +1 -0
- package/dist/workspace-projection/types.d.ts +7 -0
- package/dist/workspace-projection/types.d.ts.map +1 -0
- package/dist/workspace-projection/types.js +2 -0
- package/dist/workspace-projection/types.js.map +1 -0
- package/package.json +28 -15
- package/dist/adapters/streaming.d.ts +0 -18
- package/dist/adapters/streaming.d.ts.map +0 -1
- package/dist/adapters/streaming.js +0 -44
- package/dist/adapters/streaming.js.map +0 -1
- package/dist/download.d.ts.map +0 -1
- package/dist/download.js.map +0 -1
- package/dist/model-registry.d.ts +0 -4
- package/dist/model-registry.d.ts.map +0 -1
- package/dist/model-registry.js +0 -7
- package/dist/model-registry.js.map +0 -1
- package/dist/portal-shell.d.ts +0 -4
- package/dist/portal-shell.d.ts.map +0 -1
- package/dist/portal-shell.js.map +0 -1
- package/dist/runtime/agent-run-controller.d.ts +0 -31
- package/dist/runtime/agent-run-controller.d.ts.map +0 -1
- package/dist/runtime/agent-run-controller.js +0 -195
- package/dist/runtime/agent-run-controller.js.map +0 -1
- package/dist/sessions/agent-memory-file-manager.d.ts +0 -19
- package/dist/sessions/agent-memory-file-manager.d.ts.map +0 -1
- package/dist/sessions/agent-memory-file-manager.js.map +0 -1
- package/dist/vault/routing.d.ts +0 -3
- package/dist/vault/routing.d.ts.map +0 -1
- package/dist/vault/routing.js +0 -13
- package/dist/vault/routing.js.map +0 -1
- /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
- /package/dist/{download.js → cli/download.js} +0 -0
|
@@ -1,22 +1,28 @@
|
|
|
1
1
|
import { SocketModeClient } from "@slack/socket-mode";
|
|
2
|
-
import { WebClient } from "@slack/web-api";
|
|
2
|
+
import { WebAPIRateLimitedError, WebClient } from "@slack/web-api";
|
|
3
3
|
import { existsSync, readFileSync } from "fs";
|
|
4
4
|
import { readFile } from "fs/promises";
|
|
5
5
|
import { basename, join } from "path";
|
|
6
|
+
import { COMMAND_MANIFEST } from "../../commands/manifest.js";
|
|
6
7
|
import { resolveConversationSettings } from "../../config.js";
|
|
8
|
+
import { parseExtActionId } from "../../harness/extensions/blockkit.js";
|
|
7
9
|
import * as log from "../../log.js";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
+
import { isRecord, readTextFileIfExists } from "../../utils/file-guards.js";
|
|
11
|
+
import { PRODUCT_NAME, formatForceStopped } from "../../platform-messages.js";
|
|
12
|
+
import { appendBotResponseLog, appendChannelLog, MessagingEventQueue, withRetry, } from "../shared.js";
|
|
10
13
|
import { processMessageIntake } from "../intake.js";
|
|
11
14
|
import { createSlackAdapters } from "./context.js";
|
|
12
|
-
import { hasMaterializedChatSession, registerThreadSession, } from "../../sessions/
|
|
15
|
+
import { hasMaterializedChatSession, registerThreadSession, } from "../../sessions/chat-history-sync.js";
|
|
16
|
+
import { conversationIdOf } from "../../sessions/session-key.js";
|
|
13
17
|
import { isSlackThreadSessionKey, planSlackAdapterSession, planSlackEventAnchorRun, resolveSlackSessionKey, } from "./session.js";
|
|
14
18
|
import { reportUserFacingError } from "../../observability/sentry.js";
|
|
15
19
|
import { renderSlackBlocks } from "./blocks.js";
|
|
16
20
|
const SLACK_EVENT_ANCHOR_TEXT = "Working on it...";
|
|
17
|
-
//
|
|
18
|
-
//
|
|
21
|
+
// web-api v8 throws WebAPIRateLimitedError; the duck-typed shapes cover
|
|
22
|
+
// platform `data.error === "rate_limited"` / 429 responses and older callers.
|
|
19
23
|
function slackIsRateLimited(err) {
|
|
24
|
+
if (err instanceof WebAPIRateLimitedError)
|
|
25
|
+
return true;
|
|
20
26
|
if (err.code === "rate_limited")
|
|
21
27
|
return true;
|
|
22
28
|
const data = err.data;
|
|
@@ -152,6 +158,21 @@ export class SlackMessagingBot {
|
|
|
152
158
|
return result.ts;
|
|
153
159
|
});
|
|
154
160
|
}
|
|
161
|
+
async addReaction(channel, messageTs, emoji) {
|
|
162
|
+
// Slack reaction names are colon-free short names; strip any wrapping colons.
|
|
163
|
+
const name = emoji.replace(/^:|:$/g, "");
|
|
164
|
+
await slackRetry(async () => {
|
|
165
|
+
try {
|
|
166
|
+
await this.webClient.reactions.add({ channel, timestamp: messageTs, name });
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
// Re-reacting with the same emoji is not an error worth surfacing.
|
|
170
|
+
if (err?.data?.error === "already_reacted")
|
|
171
|
+
return;
|
|
172
|
+
throw err;
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
}
|
|
155
176
|
async postEphemeral(channel, user, text, threadTs) {
|
|
156
177
|
return slackRetry(async () => {
|
|
157
178
|
await this.webClient.chat.postEphemeral({
|
|
@@ -180,6 +201,11 @@ export class SlackMessagingBot {
|
|
|
180
201
|
return result.ts;
|
|
181
202
|
});
|
|
182
203
|
}
|
|
204
|
+
async updateMessageBlocks(channel, ts, text, blocks) {
|
|
205
|
+
return slackRetry(async () => {
|
|
206
|
+
await this.webClient.chat.update({ channel, ts, text, blocks: blocks });
|
|
207
|
+
});
|
|
208
|
+
}
|
|
183
209
|
async postPrivate(conversationId, userId, text) {
|
|
184
210
|
await this.postEphemeral(conversationId, userId, text);
|
|
185
211
|
}
|
|
@@ -294,10 +320,31 @@ export class SlackMessagingBot {
|
|
|
294
320
|
...(slackBlocks ? { slackBlocks } : {}),
|
|
295
321
|
});
|
|
296
322
|
}
|
|
323
|
+
ownsBlockKitMessage(channel, ts, threadTs) {
|
|
324
|
+
const content = readTextFileIfExists(join(this.workingDir, channel, "log.jsonl"));
|
|
325
|
+
if (content === undefined)
|
|
326
|
+
return false;
|
|
327
|
+
for (const line of content.trim().split("\n").toReversed()) {
|
|
328
|
+
try {
|
|
329
|
+
const entry = JSON.parse(line);
|
|
330
|
+
if (!isRecord(entry) || entry.ts !== ts)
|
|
331
|
+
continue;
|
|
332
|
+
return (entry.isMessagingBot === true &&
|
|
333
|
+
entry.platform === "slack" &&
|
|
334
|
+
Array.isArray(entry.slackBlocks) &&
|
|
335
|
+
entry.threadTs === threadTs);
|
|
336
|
+
}
|
|
337
|
+
catch {
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return false;
|
|
342
|
+
}
|
|
297
343
|
getMessagingInfo() {
|
|
298
344
|
return {
|
|
299
345
|
name: "slack",
|
|
300
|
-
|
|
346
|
+
trustModel: "membership",
|
|
347
|
+
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.",
|
|
301
348
|
channels: this.getAllChannels().map((c) => ({ id: c.id, name: c.name })),
|
|
302
349
|
users: this.getAllUsers().map((u) => ({
|
|
303
350
|
id: u.id,
|
|
@@ -410,10 +457,17 @@ export class SlackMessagingBot {
|
|
|
410
457
|
});
|
|
411
458
|
}
|
|
412
459
|
processSlackMessageIntake(options) {
|
|
413
|
-
|
|
460
|
+
const absorbAttachmentFailure = () => {
|
|
461
|
+
void options.attachmentsPromise.catch((err) => {
|
|
462
|
+
log.logWarning("Failed to log Slack message", String(err));
|
|
463
|
+
});
|
|
464
|
+
};
|
|
465
|
+
processMessageIntake({
|
|
414
466
|
eventBase: options.event,
|
|
415
467
|
workingDir: this.workingDir,
|
|
416
468
|
isAutoReplyCandidate: options.isAutoReplyCandidate,
|
|
469
|
+
magicWord: { addressed: options.addressed, scopeFallback: "top-level" },
|
|
470
|
+
busyPolicy: "queue",
|
|
417
471
|
logEntryBase: {},
|
|
418
472
|
processAttachments: () => options.attachmentsPromise,
|
|
419
473
|
queueKey: options.queueKey,
|
|
@@ -421,8 +475,15 @@ export class SlackMessagingBot {
|
|
|
421
475
|
handler: this.handler,
|
|
422
476
|
bot: this,
|
|
423
477
|
createContext: (event) => this.createContext(event),
|
|
424
|
-
onNotTriggered: options.onNotTriggered,
|
|
425
478
|
deferAttachmentsUntilRun: true,
|
|
479
|
+
}).then((outcome) => {
|
|
480
|
+
// Slack logs eagerly via logUserMessage; when intake does not enqueue,
|
|
481
|
+
// nothing awaits the attachment download, so absorb its failure here.
|
|
482
|
+
if (outcome !== "enqueued")
|
|
483
|
+
absorbAttachmentFailure();
|
|
484
|
+
}, (err) => {
|
|
485
|
+
log.logWarning("Slack message intake failed", String(err));
|
|
486
|
+
absorbAttachmentFailure();
|
|
426
487
|
});
|
|
427
488
|
}
|
|
428
489
|
buildHomeView() {
|
|
@@ -460,7 +521,7 @@ export class SlackMessagingBot {
|
|
|
460
521
|
// Threshold for "stuck" detection (10 minutes)
|
|
461
522
|
const STUCK_THRESHOLD_MS = 10 * 60 * 1000;
|
|
462
523
|
for (const session of runningSessions) {
|
|
463
|
-
const channelId = session.sessionKey
|
|
524
|
+
const channelId = conversationIdOf(session.sessionKey);
|
|
464
525
|
const channel = this.channels.get(channelId);
|
|
465
526
|
const channelName = channel ? `#${channel.name}` : channelId;
|
|
466
527
|
const elapsed = Math.floor((Date.now() - session.startedAt) / 60000);
|
|
@@ -500,7 +561,14 @@ export class SlackMessagingBot {
|
|
|
500
561
|
{
|
|
501
562
|
type: "button",
|
|
502
563
|
text: { type: "plain_text", text: "Force Stop", emoji: true },
|
|
564
|
+
// The raw session key travels in `value` (Slack returns it
|
|
565
|
+
// verbatim); the action_id only routes and must be unique per
|
|
566
|
+
// view, so it carries a sanitized copy of the key. Never
|
|
567
|
+
// decode the key from the action_id — the `:`↔`_` rewrite is
|
|
568
|
+
// irreversible for conversation ids that contain `_` (GitHub's
|
|
569
|
+
// GH_owner_repo_number do, by design).
|
|
503
570
|
action_id: `force_stop_${session.sessionKey.replace(/:/g, "_")}`,
|
|
571
|
+
value: session.sessionKey,
|
|
504
572
|
style: "danger",
|
|
505
573
|
},
|
|
506
574
|
],
|
|
@@ -559,22 +627,6 @@ export class SlackMessagingBot {
|
|
|
559
627
|
});
|
|
560
628
|
return { type: "home", blocks: blocks };
|
|
561
629
|
}
|
|
562
|
-
resolveStopTarget(channelId, threadTs) {
|
|
563
|
-
const directTarget = resolveStopTarget({
|
|
564
|
-
handler: this.handler,
|
|
565
|
-
conversationId: channelId,
|
|
566
|
-
sessionKey: resolveSlackSessionKey(channelId, threadTs),
|
|
567
|
-
});
|
|
568
|
-
if (directTarget)
|
|
569
|
-
return directTarget;
|
|
570
|
-
if (threadTs)
|
|
571
|
-
return null;
|
|
572
|
-
return resolveOnlyScopedStopTarget(this.handler, channelId);
|
|
573
|
-
}
|
|
574
|
-
isStopText(text) {
|
|
575
|
-
const normalized = text.trim().toLowerCase();
|
|
576
|
-
return normalized === "stop" || normalized === "/stop";
|
|
577
|
-
}
|
|
578
630
|
createCommandAdapters(conversationId, userId, userName, text, ts, options = {}) {
|
|
579
631
|
const message = {
|
|
580
632
|
id: ts,
|
|
@@ -665,10 +717,23 @@ export class SlackMessagingBot {
|
|
|
665
717
|
const context = this.createCommandAdapters(conversationId, payload.user_id, userName, commandText, eventTs, isDirectMessage ? { threadTs } : { ephemeralChannelId: conversationId, threadTs });
|
|
666
718
|
return { event, context };
|
|
667
719
|
}
|
|
668
|
-
|
|
720
|
+
/**
|
|
721
|
+
* Generic slash-command route: synthesize the command text per the
|
|
722
|
+
* manifest's SlackSlashRoute data and dispatch to the handler. `/pi-new`
|
|
723
|
+
* stays bespoke (routeSlashNewCommand) because it replies in 中文 and calls
|
|
724
|
+
* handleNewCommand directly.
|
|
725
|
+
*/
|
|
726
|
+
async routeSlashCommand(route, payload) {
|
|
669
727
|
const { event, context } = this.buildSlashCommandEvent(payload, {
|
|
670
|
-
|
|
671
|
-
|
|
728
|
+
includeText: route.includeText,
|
|
729
|
+
thread: route.thread,
|
|
730
|
+
...(route.privateCommand
|
|
731
|
+
? {
|
|
732
|
+
type: payload.channel_id.startsWith("D")
|
|
733
|
+
? "dm"
|
|
734
|
+
: "private_command",
|
|
735
|
+
}
|
|
736
|
+
: {}),
|
|
672
737
|
});
|
|
673
738
|
await this.handler.handleEvent(event, this, context);
|
|
674
739
|
}
|
|
@@ -697,19 +762,19 @@ export class SlackMessagingBot {
|
|
|
697
762
|
enqueueEvent: (event) => this.enqueueEvent(event),
|
|
698
763
|
getMessagingInfo: () => this.getMessagingInfo(),
|
|
699
764
|
};
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
const
|
|
712
|
-
await this.handler.
|
|
765
|
+
const event = {
|
|
766
|
+
type: "dm",
|
|
767
|
+
conversationId,
|
|
768
|
+
conversationKind: "direct",
|
|
769
|
+
channel: conversationId,
|
|
770
|
+
ts: eventTs,
|
|
771
|
+
user: payload.user_id,
|
|
772
|
+
text: payload.command,
|
|
773
|
+
attachments: [],
|
|
774
|
+
sessionKey: conversationId,
|
|
775
|
+
};
|
|
776
|
+
const context = createSlackAdapters(event, this);
|
|
777
|
+
await this.handler.handleNewCommand(conversationId, conversationId, commandMessagingBot, context.message, context.responder, context.platform);
|
|
713
778
|
}
|
|
714
779
|
setupEventHandlers() {
|
|
715
780
|
this.socketClient.on("disconnect", (err) => {
|
|
@@ -761,26 +826,12 @@ export class SlackMessagingBot {
|
|
|
761
826
|
ack();
|
|
762
827
|
return;
|
|
763
828
|
}
|
|
764
|
-
// Check for stop command - execute immediately, don't queue!
|
|
765
|
-
if (this.isStopText(slackEvent.text)) {
|
|
766
|
-
const stopTarget = this.resolveStopTarget(e.channel, e.thread_ts);
|
|
767
|
-
if (stopTarget) {
|
|
768
|
-
this.handler.handleStop(stopTarget, e.channel, this);
|
|
769
|
-
}
|
|
770
|
-
else {
|
|
771
|
-
this.postMessage(e.channel, formatNothingRunning("slack"));
|
|
772
|
-
}
|
|
773
|
-
void attachmentsPromise.catch((err) => {
|
|
774
|
-
log.logWarning("Failed to log Slack message", String(err));
|
|
775
|
-
});
|
|
776
|
-
ack();
|
|
777
|
-
return;
|
|
778
|
-
}
|
|
779
829
|
this.processSlackMessageIntake({
|
|
780
830
|
event: slackEvent,
|
|
781
831
|
attachmentsPromise,
|
|
782
832
|
queueKey: this.resolveQueueKey(e.channel, sessionKey),
|
|
783
833
|
isAutoReplyCandidate: false,
|
|
834
|
+
addressed: true,
|
|
784
835
|
});
|
|
785
836
|
ack();
|
|
786
837
|
}
|
|
@@ -793,7 +844,13 @@ export class SlackMessagingBot {
|
|
|
793
844
|
ack();
|
|
794
845
|
return;
|
|
795
846
|
}
|
|
796
|
-
|
|
847
|
+
// API posts made with a user token carry the posting app's bot_id/app_id
|
|
848
|
+
// alongside the human `user` — bot_id alone does not make the author a
|
|
849
|
+
// bot. Only treat the message as bot-authored when the author is not a
|
|
850
|
+
// known human user (bot users have is_bot=true; unknown authors stay on
|
|
851
|
+
// the conservative bot path so loop protection holds).
|
|
852
|
+
const authorIsKnownHuman = !!e.user && this.users.get(e.user)?.isBot === false;
|
|
853
|
+
const isExternalMessagingBotMessage = e.subtype === "bot_message" || (!!e.bot_id && !authorIsKnownHuman);
|
|
797
854
|
if (isExternalMessagingBotMessage) {
|
|
798
855
|
if (e.subtype !== undefined && e.subtype !== "bot_message" && e.subtype !== "file_share") {
|
|
799
856
|
ack();
|
|
@@ -821,7 +878,11 @@ export class SlackMessagingBot {
|
|
|
821
878
|
ack();
|
|
822
879
|
return;
|
|
823
880
|
}
|
|
824
|
-
|
|
881
|
+
// message.im normally carries channel_type "im", but fall back to the
|
|
882
|
+
// D-prefix convention (used by handleAppMention and session keys) so a
|
|
883
|
+
// missing channel_type cannot silently demote a DM to an auto-reply
|
|
884
|
+
// candidate that never triggers.
|
|
885
|
+
const isDM = e.channel_type === "im" || e.channel.startsWith("D");
|
|
825
886
|
const conversationKind = isDM ? "direct" : "shared";
|
|
826
887
|
const isMessagingBotMention = e.text?.includes(`<@${this.botUserId}>`);
|
|
827
888
|
// Skip channel @mentions - already handled by app_mention event
|
|
@@ -853,59 +914,26 @@ export class SlackMessagingBot {
|
|
|
853
914
|
ack();
|
|
854
915
|
return;
|
|
855
916
|
}
|
|
856
|
-
|
|
857
|
-
if (isDM && this.isStopText(slackEvent.text)) {
|
|
858
|
-
const stopTarget = this.resolveStopTarget(e.channel, e.thread_ts);
|
|
859
|
-
if (stopTarget) {
|
|
860
|
-
this.handler.handleStop(stopTarget, e.channel, this);
|
|
861
|
-
}
|
|
862
|
-
else {
|
|
863
|
-
this.postMessage(e.channel, formatNothingRunning("slack"));
|
|
864
|
-
}
|
|
917
|
+
if (!isDM && isThreadReply) {
|
|
865
918
|
void attachmentsPromise.catch((err) => {
|
|
866
919
|
log.logWarning("Failed to log Slack message", String(err));
|
|
867
920
|
});
|
|
868
921
|
ack();
|
|
869
922
|
return;
|
|
870
923
|
}
|
|
871
|
-
const
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
// persistent top-level channel session.
|
|
878
|
-
slackEvent.sessionKey = activeSessionKey;
|
|
879
|
-
this.processSlackMessageIntake({
|
|
880
|
-
event: slackEvent,
|
|
881
|
-
attachmentsPromise,
|
|
882
|
-
queueKey: this.resolveQueueKey(e.channel, activeSessionKey),
|
|
883
|
-
isAutoReplyCandidate: false,
|
|
884
|
-
});
|
|
885
|
-
};
|
|
886
|
-
const logOnly = () => {
|
|
887
|
-
void attachmentsPromise.catch((err) => {
|
|
888
|
-
log.logWarning("Failed to log Slack message", String(err));
|
|
889
|
-
});
|
|
890
|
-
};
|
|
891
|
-
if (isDM) {
|
|
892
|
-
enqueueTriggered();
|
|
893
|
-
ack();
|
|
894
|
-
return;
|
|
895
|
-
}
|
|
896
|
-
if (isThreadReply) {
|
|
897
|
-
logOnly();
|
|
898
|
-
ack();
|
|
899
|
-
return;
|
|
900
|
-
}
|
|
901
|
-
const activeSessionKey = resolveSlackSessionKey(e.channel, e.thread_ts);
|
|
924
|
+
const activeSessionKey = slackEvent.sessionKey ?? resolveSlackSessionKey(e.channel, e.thread_ts);
|
|
925
|
+
// Auto-reply top-level channel messages start with no sessionKey because
|
|
926
|
+
// they are only candidates until the policy allows them. Persist the
|
|
927
|
+
// resolved key on the event; otherwise the runtime fallback treats the
|
|
928
|
+
// message ts as a thread session (`channel:ts`) instead of the persistent
|
|
929
|
+
// top-level channel session.
|
|
902
930
|
slackEvent.sessionKey = activeSessionKey;
|
|
903
931
|
this.processSlackMessageIntake({
|
|
904
932
|
event: slackEvent,
|
|
905
933
|
attachmentsPromise,
|
|
906
934
|
queueKey: this.resolveQueueKey(e.channel, activeSessionKey),
|
|
907
|
-
isAutoReplyCandidate:
|
|
908
|
-
|
|
935
|
+
isAutoReplyCandidate: !isDM,
|
|
936
|
+
addressed: isDM,
|
|
909
937
|
});
|
|
910
938
|
ack();
|
|
911
939
|
}
|
|
@@ -916,54 +944,20 @@ export class SlackMessagingBot {
|
|
|
916
944
|
return;
|
|
917
945
|
}
|
|
918
946
|
const { command, text, channel_id, user_id, user_name, thread_ts } = payload;
|
|
947
|
+
const entry = COMMAND_MANIFEST.find((candidate) => candidate.slackCommand === command);
|
|
948
|
+
if (!entry)
|
|
949
|
+
return;
|
|
919
950
|
let handlerPromise = null;
|
|
920
|
-
if (
|
|
921
|
-
handlerPromise = this.routeSlashLoginCommand({
|
|
922
|
-
command,
|
|
923
|
-
text,
|
|
924
|
-
channel_id,
|
|
925
|
-
user_id,
|
|
926
|
-
user_name,
|
|
927
|
-
});
|
|
928
|
-
}
|
|
929
|
-
else if (command === "/pi-new") {
|
|
951
|
+
if (entry.name === "new") {
|
|
930
952
|
handlerPromise = this.routeSlashNewCommand({ command, channel_id, user_id, user_name });
|
|
931
953
|
}
|
|
932
|
-
else if (
|
|
933
|
-
handlerPromise = this.
|
|
934
|
-
command,
|
|
935
|
-
channel_id,
|
|
936
|
-
user_id,
|
|
937
|
-
user_name,
|
|
938
|
-
thread_ts,
|
|
939
|
-
});
|
|
940
|
-
}
|
|
941
|
-
else if (command === "/pi-model") {
|
|
942
|
-
handlerPromise = this.routeSlashModelCommand({
|
|
954
|
+
else if (entry.slackRoute) {
|
|
955
|
+
handlerPromise = this.routeSlashCommand(entry.slackRoute, {
|
|
943
956
|
command,
|
|
944
957
|
text,
|
|
945
958
|
channel_id,
|
|
946
959
|
user_id,
|
|
947
960
|
user_name,
|
|
948
|
-
});
|
|
949
|
-
}
|
|
950
|
-
else if (command === "/pi-sandbox" ||
|
|
951
|
-
command === "/pi-auto-reply" ||
|
|
952
|
-
command === "/pi-extensions") {
|
|
953
|
-
handlerPromise = this.routeSlashModelCommand({
|
|
954
|
-
command,
|
|
955
|
-
text,
|
|
956
|
-
channel_id,
|
|
957
|
-
user_id,
|
|
958
|
-
user_name,
|
|
959
|
-
});
|
|
960
|
-
}
|
|
961
|
-
else if (command === "/pi-admin") {
|
|
962
|
-
handlerPromise = this.routeSlashAdminCommand({
|
|
963
|
-
command,
|
|
964
|
-
channel_id,
|
|
965
|
-
user_id,
|
|
966
|
-
user_name,
|
|
967
961
|
thread_ts,
|
|
968
962
|
});
|
|
969
963
|
}
|
|
@@ -1000,9 +994,12 @@ export class SlackMessagingBot {
|
|
|
1000
994
|
return;
|
|
1001
995
|
}
|
|
1002
996
|
ack();
|
|
1003
|
-
|
|
997
|
+
// Prefer the verbatim key from `value`; the action_id fallback only
|
|
998
|
+
// serves buttons rendered before `value` existed and misdecodes session
|
|
999
|
+
// keys whose conversation id contains "_".
|
|
1000
|
+
const sessionKey = action.value ?? action.action_id.replace("force_stop_", "").replace(/_/g, ":");
|
|
1004
1001
|
const userId = body.user?.id;
|
|
1005
|
-
const channelId = body.container?.channel_id || sessionKey
|
|
1002
|
+
const channelId = body.container?.channel_id || conversationIdOf(sessionKey);
|
|
1006
1003
|
log.logInfo(`[Force Stop] User ${userId} requested force stop for ${sessionKey}`);
|
|
1007
1004
|
// Use handler's forceStop method
|
|
1008
1005
|
this.handler.forceStop(sessionKey);
|
|
@@ -1030,6 +1027,38 @@ export class SlackMessagingBot {
|
|
|
1030
1027
|
const selectedOptions = Array.isArray(action.selected_options)
|
|
1031
1028
|
? action.selected_options
|
|
1032
1029
|
: undefined;
|
|
1030
|
+
const threadTs = container.thread_ts;
|
|
1031
|
+
const sessionKey = resolveSlackSessionKey(channelId, threadTs);
|
|
1032
|
+
// Extension-owned actions (ext:<slug>: namespaced by api.blockkit.post)
|
|
1033
|
+
// dispatch exclusively to the extension's onAction handler — no agent
|
|
1034
|
+
// run, no chat-history entry. They never fall through to the model: an
|
|
1035
|
+
// unconsumed namespaced action means the extension is gone, and its
|
|
1036
|
+
// routing id would only confuse an agent run.
|
|
1037
|
+
const extAction = parseExtActionId(action.action_id ?? "");
|
|
1038
|
+
if (extAction) {
|
|
1039
|
+
this.getQueue(this.resolveQueueKey(channelId, sessionKey)).enqueue(async () => {
|
|
1040
|
+
const consumed = await this.handler.handleExtensionAction({
|
|
1041
|
+
conversationId: channelId,
|
|
1042
|
+
sessionKey,
|
|
1043
|
+
conversationKind: channelId.startsWith("D") ? "direct" : "shared",
|
|
1044
|
+
slug: extAction.slug,
|
|
1045
|
+
action: {
|
|
1046
|
+
actionId: extAction.actionId,
|
|
1047
|
+
value: action.value ?? selectedOption?.value ?? selectedOption?.text?.text,
|
|
1048
|
+
selectedValues: selectedOptions?.map((option) => option.value ?? option.text?.text ?? ""),
|
|
1049
|
+
userId,
|
|
1050
|
+
userName: body.user?.username ?? body.user?.name,
|
|
1051
|
+
conversationId: channelId,
|
|
1052
|
+
messageTs: container.message_ts,
|
|
1053
|
+
threadTs,
|
|
1054
|
+
},
|
|
1055
|
+
});
|
|
1056
|
+
if (!consumed) {
|
|
1057
|
+
log.logWarning(`[${channelId}] Dropped extension action ${action.action_id}`, `no handler registered by extension "${extAction.slug}"`);
|
|
1058
|
+
}
|
|
1059
|
+
});
|
|
1060
|
+
return;
|
|
1061
|
+
}
|
|
1033
1062
|
const selectedText = selectedOption?.text?.text ?? selectedOption?.value;
|
|
1034
1063
|
const selectedTexts = selectedOptions?.map((option) => option.text?.text ?? option.value);
|
|
1035
1064
|
const valueText = selectedTexts?.length
|
|
@@ -1037,8 +1066,6 @@ export class SlackMessagingBot {
|
|
|
1037
1066
|
: (selectedText ?? action.value ?? action.action_id);
|
|
1038
1067
|
const text = `[Slack action] ${action.action_id}: ${valueText}`;
|
|
1039
1068
|
const ts = `action:${Date.now()}`;
|
|
1040
|
-
const threadTs = container.thread_ts;
|
|
1041
|
-
const sessionKey = resolveSlackSessionKey(channelId, threadTs);
|
|
1042
1069
|
this.logToFile(channelId, {
|
|
1043
1070
|
date: new Date().toISOString(),
|
|
1044
1071
|
ts,
|
|
@@ -1296,6 +1323,7 @@ export class SlackMessagingBot {
|
|
|
1296
1323
|
id: u.id,
|
|
1297
1324
|
userName: u.name,
|
|
1298
1325
|
displayName: u.real_name || u.name,
|
|
1326
|
+
isBot: !!u.is_bot,
|
|
1299
1327
|
});
|
|
1300
1328
|
}
|
|
1301
1329
|
}
|