@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,17 +1,14 @@
|
|
|
1
1
|
import { resolveChatSessionKey } from "../../sessions/policy.js";
|
|
2
|
+
import { conversationIdOf, makeThreadSessionKey, threadSuffixOf, } from "../../sessions/session-key.js";
|
|
2
3
|
export function formatSlackSessionKey(ref) {
|
|
3
|
-
return ref.kind === "channel" ? ref.channelId :
|
|
4
|
+
return ref.kind === "channel" ? ref.channelId : makeThreadSessionKey(ref.channelId, ref.threadTs);
|
|
4
5
|
}
|
|
5
6
|
export function parseSlackSessionKey(sessionKey) {
|
|
6
|
-
const
|
|
7
|
-
if (
|
|
7
|
+
const threadTs = threadSuffixOf(sessionKey);
|
|
8
|
+
if (threadTs === null) {
|
|
8
9
|
return { kind: "channel", channelId: sessionKey };
|
|
9
10
|
}
|
|
10
|
-
return {
|
|
11
|
-
kind: "thread",
|
|
12
|
-
channelId: sessionKey.slice(0, separator),
|
|
13
|
-
threadTs: sessionKey.slice(separator + 1),
|
|
14
|
-
};
|
|
11
|
+
return { kind: "thread", channelId: conversationIdOf(sessionKey), threadTs };
|
|
15
12
|
}
|
|
16
13
|
export function isSlackThreadSessionKey(sessionKey) {
|
|
17
14
|
return parseSlackSessionKey(sessionKey).kind === "thread";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/adapters/slack/session.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/adapters/slack/session.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,GACf,MAAM,+BAA+B,CAAC;AAWvC,MAAM,UAAU,qBAAqB,CAAC,GAAoB;IACxD,OAAO,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,UAAkB;IACrD,MAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;IACpD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,UAAkB;IACxD,OAAO,oBAAoB,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAAiB,EAAE,QAAiB;IACzE,MAAM,gBAAgB,GAAqB,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC3F,MAAM,UAAU,GAAG,qBAAqB,CAAC;QACvC,cAAc,EAAE,SAAS;QACzB,gBAAgB;QAChB,SAAS,EAAE,SAAS;QACpB,QAAQ;QACR,kBAAkB,EAAE,IAAI;QACxB,kBAAkB,EAAE,IAAI;KACzB,CAAC,CAAC;IACH,OAAO,qBAAqB,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAsB;IAC9C,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,KAAsD;IAEtD,OAAO,KAAK,CAAC,SAAS,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,KAA4B,EAC5B,OAAO,GAAkC,EAAE;IAE3C,MAAM,UAAU,GACd,KAAK,CAAC,UAAU,IAAI,sBAAsB,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAEpF,OAAO;QACL,UAAU;QACV,MAAM,EAAE,OAAO,CAAC,gBAAgB,IAAI,0BAA0B,CAAC,KAAK,CAAC;QACrE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,KAAQ,EACR,QAAiB;IAEjB,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACjC,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;IAED,OAAO;QACL,KAAK,EAAE;YACL,GAAG,KAAK;YACR,UAAU,EAAE,sBAAsB,CAAC,KAAK,CAAC,cAAc,EAAE,QAAQ,CAAC;SACnE;QACD,gBAAgB,EAAE,QAAQ;KAC3B,CAAC;AACJ,CAAC","sourcesContent":["import type { ConversationKind } from \"../../adapter.js\";\nimport { resolveChatSessionKey } from \"../../sessions/policy.js\";\nimport {\n conversationIdOf,\n makeThreadSessionKey,\n threadSuffixOf,\n} from \"../../sessions/session-key.js\";\nexport type { SlackAdapterSessionPlan, SlackEventAnchorRunPlan, SlackSessionRef } from \"./types.js\";\nimport type { SlackAdapterSessionPlan, SlackEventAnchorRunPlan, SlackSessionRef } from \"./types.js\";\n\ninterface SlackSessionEventLike {\n conversationId: string;\n ts: string;\n thread_ts?: string;\n sessionKey?: string;\n}\n\nexport function formatSlackSessionKey(ref: SlackSessionRef): string {\n return ref.kind === \"channel\" ? ref.channelId : makeThreadSessionKey(ref.channelId, ref.threadTs);\n}\n\nexport function parseSlackSessionKey(sessionKey: string): SlackSessionRef {\n const threadTs = threadSuffixOf(sessionKey);\n if (threadTs === null) {\n return { kind: \"channel\", channelId: sessionKey };\n }\n return { kind: \"thread\", channelId: conversationIdOf(sessionKey), threadTs };\n}\n\nexport function isSlackThreadSessionKey(sessionKey: string): boolean {\n return parseSlackSessionKey(sessionKey).kind === \"thread\";\n}\n\nexport function resolveSlackSessionKey(channelId: string, threadTs?: string): string {\n const conversationKind: ConversationKind = channelId.startsWith(\"D\") ? \"direct\" : \"shared\";\n const sessionKey = resolveChatSessionKey({\n conversationId: channelId,\n conversationKind,\n messageId: channelId,\n threadTs,\n persistentTopLevel: true,\n scopeDirectThreads: true,\n });\n return formatSlackSessionKey(parseSlackSessionKey(sessionKey));\n}\n\nfunction isSlackMessageTs(ts: string | undefined): ts is string {\n return typeof ts === \"string\" && /^\\d+\\.\\d+$/.test(ts);\n}\n\nexport function resolveSlackResponseRootTs(\n event: Pick<SlackSessionEventLike, \"ts\" | \"thread_ts\">,\n): string | undefined {\n return event.thread_ts ?? (isSlackMessageTs(event.ts) ? event.ts : undefined);\n}\n\nexport function planSlackAdapterSession(\n event: SlackSessionEventLike,\n options: { initialMessageTs?: string } = {},\n): SlackAdapterSessionPlan {\n const sessionKey =\n event.sessionKey ?? resolveSlackSessionKey(event.conversationId, event.thread_ts);\n\n return {\n sessionKey,\n rootTs: options.initialMessageTs ?? resolveSlackResponseRootTs(event),\n initialMessageTs: options.initialMessageTs,\n isThreaded: !!event.thread_ts,\n };\n}\n\nexport function planSlackEventAnchorRun<T extends SlackSessionEventLike>(\n event: T,\n anchorTs?: string,\n): SlackEventAnchorRunPlan<T & { sessionKey?: string }> {\n if (!anchorTs || event.thread_ts) {\n return { event };\n }\n\n return {\n event: {\n ...event,\n sessionKey: resolveSlackSessionKey(event.conversationId, anchorTs),\n },\n initialMessageTs: anchorTs,\n };\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { PlatformToolPack } from "../../tools/types.js";
|
|
2
|
+
export type { PlatformSlackOps } from "./types.js";
|
|
3
|
+
import type { PlatformSlackOps } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Slack capability pack: tools that post platform-native surfaces (Block Kit)
|
|
6
|
+
* the response renderer deliberately does not produce. bindRun enables the
|
|
7
|
+
* tools only for slack-named conversations so multi-platform processes stay
|
|
8
|
+
* safe.
|
|
9
|
+
*/
|
|
10
|
+
export declare function createSlackToolPack(ops: PlatformSlackOps): PlatformToolPack;
|
|
11
|
+
//# sourceMappingURL=tool-pack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-pack.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/tool-pack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,GAAG,gBAAgB,CAuC3E"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { createSlackBlockKitTool } from "./tools/blockkit.js";
|
|
2
|
+
/**
|
|
3
|
+
* Slack capability pack: tools that post platform-native surfaces (Block Kit)
|
|
4
|
+
* the response renderer deliberately does not produce. bindRun enables the
|
|
5
|
+
* tools only for slack-named conversations so multi-platform processes stay
|
|
6
|
+
* safe.
|
|
7
|
+
*/
|
|
8
|
+
export function createSlackToolPack(ops) {
|
|
9
|
+
const { tool: blockkitTool, setSlackBlockKitOps } = createSlackBlockKitTool();
|
|
10
|
+
const ownedMessageTs = new Set();
|
|
11
|
+
let boundTarget;
|
|
12
|
+
return {
|
|
13
|
+
tools: [blockkitTool],
|
|
14
|
+
bindRun({ conversationId, platformName, threadTs }) {
|
|
15
|
+
if (platformName !== "slack") {
|
|
16
|
+
setSlackBlockKitOps(null);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const target = `${conversationId}:${threadTs ?? "top-level"}`;
|
|
20
|
+
if (boundTarget !== target) {
|
|
21
|
+
ownedMessageTs.clear();
|
|
22
|
+
boundTarget = target;
|
|
23
|
+
}
|
|
24
|
+
setSlackBlockKitOps({
|
|
25
|
+
postBlocks: async (args) => {
|
|
26
|
+
if (args.threadTs !== undefined && args.threadTs !== threadTs) {
|
|
27
|
+
throw new Error("slack_blockkit cannot post outside the active conversation thread");
|
|
28
|
+
}
|
|
29
|
+
const result = await ops.postBlocks(conversationId, { ...args, threadTs });
|
|
30
|
+
ownedMessageTs.add(result.ts);
|
|
31
|
+
return result;
|
|
32
|
+
},
|
|
33
|
+
updateBlocks: async (args) => {
|
|
34
|
+
if (!ownedMessageTs.has(args.ts) &&
|
|
35
|
+
!ops.ownsBlockKitMessage(conversationId, args.ts, threadTs)) {
|
|
36
|
+
throw new Error("slack_blockkit can only update messages posted by this tool");
|
|
37
|
+
}
|
|
38
|
+
await ops.updateBlocks(conversationId, { ...args, threadTs });
|
|
39
|
+
ownedMessageTs.add(args.ts);
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=tool-pack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-pack.js","sourceRoot":"","sources":["../../../src/adapters/slack/tool-pack.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAI9D;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAqB;IACvD,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,mBAAmB,EAAE,GAAG,uBAAuB,EAAE,CAAC;IAC9E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,IAAI,WAA+B,CAAC;IAEpC,OAAO;QACL,KAAK,EAAE,CAAC,YAAY,CAAC;QACrB,OAAO,CAAC,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE;YAChD,IAAI,YAAY,KAAK,OAAO,EAAE,CAAC;gBAC7B,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAC1B,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,GAAG,cAAc,IAAI,QAAQ,IAAI,WAAW,EAAE,CAAC;YAC9D,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;gBAC3B,cAAc,CAAC,KAAK,EAAE,CAAC;gBACvB,WAAW,GAAG,MAAM,CAAC;YACvB,CAAC;YACD,mBAAmB,CAAC;gBAClB,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;oBACzB,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;wBAC9D,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;oBACvF,CAAC;oBACD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAC3E,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAC9B,OAAO,MAAM,CAAC;gBAChB,CAAC;gBACD,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;oBAC3B,IACE,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC5B,CAAC,GAAG,CAAC,mBAAmB,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,EAC3D,CAAC;wBACD,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;oBACjF,CAAC;oBACD,MAAM,GAAG,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAC9D,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC9B,CAAC;aACF,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { PlatformToolPack } from \"../../tools/types.js\";\nimport { createSlackBlockKitTool } from \"./tools/blockkit.js\";\nexport type { PlatformSlackOps } from \"./types.js\";\nimport type { PlatformSlackOps } from \"./types.js\";\n\n/**\n * Slack capability pack: tools that post platform-native surfaces (Block Kit)\n * the response renderer deliberately does not produce. bindRun enables the\n * tools only for slack-named conversations so multi-platform processes stay\n * safe.\n */\nexport function createSlackToolPack(ops: PlatformSlackOps): PlatformToolPack {\n const { tool: blockkitTool, setSlackBlockKitOps } = createSlackBlockKitTool();\n const ownedMessageTs = new Set<string>();\n let boundTarget: string | undefined;\n\n return {\n tools: [blockkitTool],\n bindRun({ conversationId, platformName, threadTs }) {\n if (platformName !== \"slack\") {\n setSlackBlockKitOps(null);\n return;\n }\n const target = `${conversationId}:${threadTs ?? \"top-level\"}`;\n if (boundTarget !== target) {\n ownedMessageTs.clear();\n boundTarget = target;\n }\n setSlackBlockKitOps({\n postBlocks: async (args) => {\n if (args.threadTs !== undefined && args.threadTs !== threadTs) {\n throw new Error(\"slack_blockkit cannot post outside the active conversation thread\");\n }\n const result = await ops.postBlocks(conversationId, { ...args, threadTs });\n ownedMessageTs.add(result.ts);\n return result;\n },\n updateBlocks: async (args) => {\n if (\n !ownedMessageTs.has(args.ts) &&\n !ops.ownsBlockKitMessage(conversationId, args.ts, threadTs)\n ) {\n throw new Error(\"slack_blockkit can only update messages posted by this tool\");\n }\n await ops.updateBlocks(conversationId, { ...args, threadTs });\n ownedMessageTs.add(args.ts);\n },\n });\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AgentTool } from "@earendil-works/pi-agent-core";
|
|
2
|
+
export type { SlackBlockKitOps } from "../types.js";
|
|
3
|
+
import type { SlackBlockKitOps } from "../types.js";
|
|
4
|
+
declare const blockkitSchema: import("@sinclair/typebox").TObject<{
|
|
5
|
+
blocks: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnknown>;
|
|
6
|
+
text: import("@sinclair/typebox").TString;
|
|
7
|
+
thread_ts: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
8
|
+
update_ts: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function createSlackBlockKitTool(): {
|
|
11
|
+
tool: AgentTool<typeof blockkitSchema>;
|
|
12
|
+
setSlackBlockKitOps: (ops: SlackBlockKitOps | null) => void;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=blockkit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blockkit.d.ts","sourceRoot":"","sources":["../../../../src/adapters/slack/tools/blockkit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAMpD,QAAA,MAAM,cAAc;;;;;EAoBlB,CAAC;AAyCH,wBAAgB,uBAAuB,IAAI;IACzC,IAAI,EAAE,SAAS,CAAC,OAAO,cAAc,CAAC,CAAC;IACvC,mBAAmB,EAAE,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,KAAK,IAAI,CAAC;CAC7D,CAgEA"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
/** Slack's own ceilings: 50 blocks per message, and a payload well under 64KB. */
|
|
3
|
+
const MAX_BLOCKS = 50;
|
|
4
|
+
const MAX_ARGUMENT_BYTES = 64 * 1024;
|
|
5
|
+
const blockkitSchema = Type.Object({
|
|
6
|
+
blocks: Type.Array(Type.Unknown(), {
|
|
7
|
+
maxItems: MAX_BLOCKS,
|
|
8
|
+
description: `Slack Block Kit blocks (max ${MAX_BLOCKS}). Use {type:'markdown', text} for prose, {type:'table'} for tables, and actions/section blocks for buttons and select menus.`,
|
|
9
|
+
}),
|
|
10
|
+
text: Type.String({
|
|
11
|
+
description: "Plain-text fallback shown in notifications and screen readers",
|
|
12
|
+
}),
|
|
13
|
+
thread_ts: Type.Optional(Type.String({
|
|
14
|
+
description: "Optional active-thread TS. Posts are always constrained to the current conversation thread.",
|
|
15
|
+
})),
|
|
16
|
+
update_ts: Type.Optional(Type.String({
|
|
17
|
+
description: "Update a message previously posted by slack_blockkit in this conversation instead of posting a new one.",
|
|
18
|
+
})),
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* Reject a runaway payload before schema validation sees it.
|
|
22
|
+
*
|
|
23
|
+
* `prepareArguments` runs ahead of validation, which reports a failure by
|
|
24
|
+
* embedding the entire argument object in its message. A malformed multi-
|
|
25
|
+
* hundred-KB `blocks` array therefore lands in the session twice — once as the
|
|
26
|
+
* call, once echoed back as the result — and every later reader pays for it.
|
|
27
|
+
* Only a bounded result belongs there, so the size complaint stays short and
|
|
28
|
+
* never quotes what it rejected.
|
|
29
|
+
*/
|
|
30
|
+
function guardBlockKitArguments(args) {
|
|
31
|
+
if (!args || typeof args !== "object")
|
|
32
|
+
return args;
|
|
33
|
+
const bytes = Buffer.byteLength(JSON.stringify(args) ?? "", "utf-8");
|
|
34
|
+
if (bytes > MAX_ARGUMENT_BYTES) {
|
|
35
|
+
throw new Error(`slack_blockkit arguments are ${Math.round(bytes / 1024)}KB, over the ${MAX_ARGUMENT_BYTES / 1024}KB limit. ` +
|
|
36
|
+
"Post a short message and attach the long content as a file instead.");
|
|
37
|
+
}
|
|
38
|
+
const blocks = args.blocks;
|
|
39
|
+
if (Array.isArray(blocks) && blocks.length > MAX_BLOCKS) {
|
|
40
|
+
throw new Error(`slack_blockkit accepts at most ${MAX_BLOCKS} blocks, got ${blocks.length}.`);
|
|
41
|
+
}
|
|
42
|
+
return args;
|
|
43
|
+
}
|
|
44
|
+
function formatSlackApiError(err) {
|
|
45
|
+
const data = err?.data;
|
|
46
|
+
if (!data?.error)
|
|
47
|
+
return err instanceof Error ? err : new Error(String(err));
|
|
48
|
+
const details = data.response_metadata?.messages?.length
|
|
49
|
+
? `\n${data.response_metadata.messages.join("\n")}`
|
|
50
|
+
: "";
|
|
51
|
+
return new Error(`Slack rejected the request: ${data.error}${details}\nFix the blocks JSON and retry.`);
|
|
52
|
+
}
|
|
53
|
+
export function createSlackBlockKitTool() {
|
|
54
|
+
let boundOps = null;
|
|
55
|
+
const tool = {
|
|
56
|
+
name: "slack_blockkit",
|
|
57
|
+
label: "slack_blockkit",
|
|
58
|
+
description: "Post an interactive Slack Block Kit message (buttons, select menus, custom layouts) to the current conversation, or update one previously posted with this tool. Normal replies already render Markdown — use this only when you need interactive elements or a layout Markdown cannot express. When a user clicks a button or picks an option, you receive a new message '[Slack action] <action_id>: <value>' — choose descriptive action_ids and values so the interaction tells you what to do. Returns the message ts; pass it back as update_ts to edit the message later (e.g. refreshing vote tallies). After handling an interaction, update the message via update_ts to replace the buttons with the outcome (e.g. '✅ approved') — buttons stay clickable otherwise and repeated clicks re-trigger the action. If Slack rejects the blocks, the error includes its validation messages — fix the JSON and retry.",
|
|
59
|
+
parameters: blockkitSchema,
|
|
60
|
+
prepareArguments: guardBlockKitArguments,
|
|
61
|
+
execute: async (_toolCallId, { blocks, text, thread_ts, update_ts, }, signal) => {
|
|
62
|
+
const ops = boundOps;
|
|
63
|
+
if (!ops) {
|
|
64
|
+
throw new Error("slack_blockkit is only available in Slack conversations");
|
|
65
|
+
}
|
|
66
|
+
if (signal?.aborted) {
|
|
67
|
+
throw new Error("Operation aborted");
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
if (update_ts) {
|
|
71
|
+
await ops.updateBlocks({ ts: update_ts, text, blocks: blocks });
|
|
72
|
+
return {
|
|
73
|
+
content: [
|
|
74
|
+
{ type: "text", text: `Updated Block Kit message (ts: ${update_ts}).` },
|
|
75
|
+
],
|
|
76
|
+
details: undefined,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const { ts } = await ops.postBlocks({
|
|
80
|
+
text,
|
|
81
|
+
blocks: blocks,
|
|
82
|
+
threadTs: thread_ts,
|
|
83
|
+
});
|
|
84
|
+
return {
|
|
85
|
+
content: [
|
|
86
|
+
{
|
|
87
|
+
type: "text",
|
|
88
|
+
text: `Posted Block Kit message (ts: ${ts}). Interactive elements will arrive as "[Slack action] <action_id>: <value>" messages; pass ts back as update_ts to edit this message.`,
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
details: undefined,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
throw formatSlackApiError(err);
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
return {
|
|
100
|
+
tool,
|
|
101
|
+
setSlackBlockKitOps: (ops) => {
|
|
102
|
+
boundOps = ops;
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=blockkit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blockkit.js","sourceRoot":"","sources":["../../../../src/adapters/slack/tools/blockkit.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport { Type } from \"@sinclair/typebox\";\nexport type { SlackBlockKitOps } from \"../types.js\";\nimport type { SlackBlockKitOps } from \"../types.js\";\n\n/** Slack's own ceilings: 50 blocks per message, and a payload well under 64KB. */\nconst MAX_BLOCKS = 50;\nconst MAX_ARGUMENT_BYTES = 64 * 1024;\n\nconst blockkitSchema = Type.Object({\n blocks: Type.Array(Type.Unknown(), {\n maxItems: MAX_BLOCKS,\n description: `Slack Block Kit blocks (max ${MAX_BLOCKS}). Use {type:'markdown', text} for prose, {type:'table'} for tables, and actions/section blocks for buttons and select menus.`,\n }),\n text: Type.String({\n description: \"Plain-text fallback shown in notifications and screen readers\",\n }),\n thread_ts: Type.Optional(\n Type.String({\n description:\n \"Optional active-thread TS. Posts are always constrained to the current conversation thread.\",\n }),\n ),\n update_ts: Type.Optional(\n Type.String({\n description:\n \"Update a message previously posted by slack_blockkit in this conversation instead of posting a new one.\",\n }),\n ),\n});\n\n/**\n * Reject a runaway payload before schema validation sees it.\n *\n * `prepareArguments` runs ahead of validation, which reports a failure by\n * embedding the entire argument object in its message. A malformed multi-\n * hundred-KB `blocks` array therefore lands in the session twice — once as the\n * call, once echoed back as the result — and every later reader pays for it.\n * Only a bounded result belongs there, so the size complaint stays short and\n * never quotes what it rejected.\n */\nfunction guardBlockKitArguments(args: unknown): unknown {\n if (!args || typeof args !== \"object\") return args;\n const bytes = Buffer.byteLength(JSON.stringify(args) ?? \"\", \"utf-8\");\n if (bytes > MAX_ARGUMENT_BYTES) {\n throw new Error(\n `slack_blockkit arguments are ${Math.round(bytes / 1024)}KB, over the ${MAX_ARGUMENT_BYTES / 1024}KB limit. ` +\n \"Post a short message and attach the long content as a file instead.\",\n );\n }\n const blocks = (args as { blocks?: unknown }).blocks;\n if (Array.isArray(blocks) && blocks.length > MAX_BLOCKS) {\n throw new Error(`slack_blockkit accepts at most ${MAX_BLOCKS} blocks, got ${blocks.length}.`);\n }\n return args;\n}\n\nfunction formatSlackApiError(err: unknown): Error {\n const data = (\n err as { data?: { error?: string; response_metadata?: { messages?: string[] } } } | undefined\n )?.data;\n if (!data?.error) return err instanceof Error ? err : new Error(String(err));\n const details = data.response_metadata?.messages?.length\n ? `\\n${data.response_metadata.messages.join(\"\\n\")}`\n : \"\";\n return new Error(\n `Slack rejected the request: ${data.error}${details}\\nFix the blocks JSON and retry.`,\n );\n}\n\nexport function createSlackBlockKitTool(): {\n tool: AgentTool<typeof blockkitSchema>;\n setSlackBlockKitOps: (ops: SlackBlockKitOps | null) => void;\n} {\n let boundOps: SlackBlockKitOps | null = null;\n\n const tool: AgentTool<typeof blockkitSchema> = {\n name: \"slack_blockkit\",\n label: \"slack_blockkit\",\n description:\n \"Post an interactive Slack Block Kit message (buttons, select menus, custom layouts) to the current conversation, or update one previously posted with this tool. Normal replies already render Markdown — use this only when you need interactive elements or a layout Markdown cannot express. When a user clicks a button or picks an option, you receive a new message '[Slack action] <action_id>: <value>' — choose descriptive action_ids and values so the interaction tells you what to do. Returns the message ts; pass it back as update_ts to edit the message later (e.g. refreshing vote tallies). After handling an interaction, update the message via update_ts to replace the buttons with the outcome (e.g. '✅ approved') — buttons stay clickable otherwise and repeated clicks re-trigger the action. If Slack rejects the blocks, the error includes its validation messages — fix the JSON and retry.\",\n parameters: blockkitSchema,\n prepareArguments: guardBlockKitArguments as (args: unknown) => typeof blockkitSchema.static,\n execute: async (\n _toolCallId: string,\n {\n blocks,\n text,\n thread_ts,\n update_ts,\n }: { blocks: unknown[]; text: string; thread_ts?: string; update_ts?: string },\n signal?: AbortSignal,\n ) => {\n const ops = boundOps;\n if (!ops) {\n throw new Error(\"slack_blockkit is only available in Slack conversations\");\n }\n if (signal?.aborted) {\n throw new Error(\"Operation aborted\");\n }\n\n try {\n if (update_ts) {\n await ops.updateBlocks({ ts: update_ts, text, blocks: blocks as object[] });\n return {\n content: [\n { type: \"text\" as const, text: `Updated Block Kit message (ts: ${update_ts}).` },\n ],\n details: undefined,\n };\n }\n const { ts } = await ops.postBlocks({\n text,\n blocks: blocks as object[],\n threadTs: thread_ts,\n });\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Posted Block Kit message (ts: ${ts}). Interactive elements will arrive as \"[Slack action] <action_id>: <value>\" messages; pass ts back as update_ts to edit this message.`,\n },\n ],\n details: undefined,\n };\n } catch (err) {\n throw formatSlackApiError(err);\n }\n },\n };\n\n return {\n tool,\n setSlackBlockKitOps: (ops) => {\n boundOps = ops;\n },\n };\n}\n"]}
|
|
@@ -23,6 +23,8 @@ export interface SlackUser {
|
|
|
23
23
|
id: string;
|
|
24
24
|
userName: string;
|
|
25
25
|
displayName: string;
|
|
26
|
+
/** From users.list is_bot; absent when the entry predates the flag. */
|
|
27
|
+
isBot?: boolean;
|
|
26
28
|
}
|
|
27
29
|
export interface SlackChannel {
|
|
28
30
|
id: string;
|
|
@@ -81,4 +83,39 @@ export interface SlackBlockActionBody {
|
|
|
81
83
|
name?: string;
|
|
82
84
|
};
|
|
83
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Host-side Slack operations for the Slack tool pack, keyed by conversation.
|
|
88
|
+
* main.ts implements these against the running SlackMessagingBot.
|
|
89
|
+
*/
|
|
90
|
+
export interface PlatformSlackOps {
|
|
91
|
+
postBlocks(conversationId: string, args: {
|
|
92
|
+
text: string;
|
|
93
|
+
blocks: object[];
|
|
94
|
+
threadTs?: string;
|
|
95
|
+
}): Promise<{
|
|
96
|
+
ts: string;
|
|
97
|
+
}>;
|
|
98
|
+
updateBlocks(conversationId: string, args: {
|
|
99
|
+
ts: string;
|
|
100
|
+
text: string;
|
|
101
|
+
blocks: object[];
|
|
102
|
+
threadTs?: string;
|
|
103
|
+
}): Promise<void>;
|
|
104
|
+
ownsBlockKitMessage(conversationId: string, ts: string, threadTs?: string): boolean;
|
|
105
|
+
}
|
|
106
|
+
/** Conversation-bound Slack Block Kit operations, provided by the host. */
|
|
107
|
+
export interface SlackBlockKitOps {
|
|
108
|
+
postBlocks(args: {
|
|
109
|
+
text: string;
|
|
110
|
+
blocks: object[];
|
|
111
|
+
threadTs?: string;
|
|
112
|
+
}): Promise<{
|
|
113
|
+
ts: string;
|
|
114
|
+
}>;
|
|
115
|
+
updateBlocks(args: {
|
|
116
|
+
ts: string;
|
|
117
|
+
text: string;
|
|
118
|
+
blocks: object[];
|
|
119
|
+
}): Promise<void>;
|
|
120
|
+
}
|
|
84
121
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtF,8EAA8E;IAC9E,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,yGAAyG;IACzG,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/adapters/slack/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ConversationKind } from \"../../adapter.js\";\nimport type { Attachment } from \"../../store.js\";\n\nexport interface SlackEvent {\n type: \"mention\" | \"dm\";\n conversationId: string;\n conversationKind: ConversationKind;\n channel: string;\n ts: string;\n thread_ts?: string;\n user: string;\n text: string;\n files?: Array<{ name?: string; url_private_download?: string; url_private?: string }>;\n /** Processed attachments with local paths (populated after logUserMessage) */\n attachments?: Attachment[];\n /** Session key passed through to ConversationEvent so handleEvent uses the correct persistent session */\n sessionKey?: string;\n}\n\nexport interface SlackUser {\n id: string;\n userName: string;\n displayName: string;\n}\n\nexport interface SlackChannel {\n id: string;\n name: string;\n}\n\nexport interface SlackAdapterOptions {\n initialMessageTs?: string;\n replyMode?: \"top-level\" | \"thread\";\n}\n\nexport type SlackSessionRef =\n | { kind: \"channel\"; channelId: string }\n | { kind: \"thread\"; channelId: string; threadTs: string };\n\nexport interface SlackAdapterSessionPlan {\n sessionKey: string;\n rootTs?: string;\n initialMessageTs?: string;\n isThreaded: boolean;\n}\n\nexport interface SlackEventAnchorRunPlan<T = SlackEvent> {\n event: T;\n initialMessageTs?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Block action payload shapes (subset used by handleBlockAction /\n// handleSlackInteraction — @slack/types does not export these)\n// ---------------------------------------------------------------------------\n\nexport interface SlackBlockAction {\n action_id: string;\n block_id?: string;\n type?: string;\n value?: string;\n selected_option?: { text?: { text?: string }; value?: string };\n selected_options?: Array<{ text?: { text?: string }; value?: string }>;\n}\n\nexport interface SlackBlockActionBody {\n actions?: SlackBlockAction[];\n container?: { channel_id?: string; thread_ts?: string; message_ts?: string };\n user?: { id?: string; username?: string; name?: string };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/adapters/slack/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ConversationKind } from \"../../adapter.js\";\nimport type { Attachment } from \"../../store.js\";\n\nexport interface SlackEvent {\n type: \"mention\" | \"dm\";\n conversationId: string;\n conversationKind: ConversationKind;\n channel: string;\n ts: string;\n thread_ts?: string;\n user: string;\n text: string;\n files?: Array<{ name?: string; url_private_download?: string; url_private?: string }>;\n /** Processed attachments with local paths (populated after logUserMessage) */\n attachments?: Attachment[];\n /** Session key passed through to ConversationEvent so handleEvent uses the correct persistent session */\n sessionKey?: string;\n}\n\nexport interface SlackUser {\n id: string;\n userName: string;\n displayName: string;\n /** From users.list is_bot; absent when the entry predates the flag. */\n isBot?: boolean;\n}\n\nexport interface SlackChannel {\n id: string;\n name: string;\n}\n\nexport interface SlackAdapterOptions {\n initialMessageTs?: string;\n replyMode?: \"top-level\" | \"thread\";\n}\n\nexport type SlackSessionRef =\n | { kind: \"channel\"; channelId: string }\n | { kind: \"thread\"; channelId: string; threadTs: string };\n\nexport interface SlackAdapterSessionPlan {\n sessionKey: string;\n rootTs?: string;\n initialMessageTs?: string;\n isThreaded: boolean;\n}\n\nexport interface SlackEventAnchorRunPlan<T = SlackEvent> {\n event: T;\n initialMessageTs?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Block action payload shapes (subset used by handleBlockAction /\n// handleSlackInteraction — @slack/types does not export these)\n// ---------------------------------------------------------------------------\n\nexport interface SlackBlockAction {\n action_id: string;\n block_id?: string;\n type?: string;\n value?: string;\n selected_option?: { text?: { text?: string }; value?: string };\n selected_options?: Array<{ text?: { text?: string }; value?: string }>;\n}\n\nexport interface SlackBlockActionBody {\n actions?: SlackBlockAction[];\n container?: { channel_id?: string; thread_ts?: string; message_ts?: string };\n user?: { id?: string; username?: string; name?: string };\n}\n\n/**\n * Host-side Slack operations for the Slack tool pack, keyed by conversation.\n * main.ts implements these against the running SlackMessagingBot.\n */\nexport interface PlatformSlackOps {\n postBlocks(\n conversationId: string,\n args: { text: string; blocks: object[]; threadTs?: string },\n ): Promise<{ ts: string }>;\n updateBlocks(\n conversationId: string,\n args: { ts: string; text: string; blocks: object[]; threadTs?: string },\n ): Promise<void>;\n ownsBlockKitMessage(conversationId: string, ts: string, threadTs?: string): boolean;\n}\n\n/** Conversation-bound Slack Block Kit operations, provided by the host. */\nexport interface SlackBlockKitOps {\n postBlocks(args: { text: string; blocks: object[]; threadTs?: string }): Promise<{ ts: string }>;\n updateBlocks(args: { ts: string; text: string; blocks: object[] }): Promise<void>;\n}\n"]}
|
|
@@ -16,6 +16,7 @@ export declare class TelegramMessagingBot implements MessagingBot {
|
|
|
16
16
|
});
|
|
17
17
|
start(): Promise<void>;
|
|
18
18
|
postMessage(channel: string, text: string): Promise<string>;
|
|
19
|
+
addReaction(channel: string, messageTs: string, emoji: string): Promise<void>;
|
|
19
20
|
updateMessage(channel: string, ts: string, text: string): Promise<void>;
|
|
20
21
|
enqueueEvent(event: ConversationEvent): boolean;
|
|
21
22
|
getMessagingInfo(): MessagingInfo;
|
|
@@ -44,8 +45,6 @@ export declare class TelegramMessagingBot implements MessagingBot {
|
|
|
44
45
|
private extractMessageContext;
|
|
45
46
|
private isAddressedToMessagingBot;
|
|
46
47
|
private cleanText;
|
|
47
|
-
private isStopText;
|
|
48
|
-
private resolveStopTarget;
|
|
49
48
|
private setupEventHandlers;
|
|
50
49
|
}
|
|
51
50
|
//# sourceMappingURL=bot.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/telegram/bot.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EAErB,aAAa,EACd,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/telegram/bot.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EAErB,aAAa,EACd,MAAM,kBAAkB,CAAC;AA8B1B,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAuBhD,qBAAa,oBAAqB,YAAW,YAAY;IACvD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,WAAW,CAAa;IAEhC,YAAY,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAQxF;IAMK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAmB3B;IAEK,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGhE;IAEK,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASlF;IAEK,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB5E;IAED,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAe9C;IAED,gBAAgB,IAAI,aAAa,CAShC;IAMK,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBlE;IAEK,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIlE;IAEK,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBvF;IAEK,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvE;IAEK,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9C;IAEK,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMjF;IAED,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE9C;IAED,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAE9D;IAED;;;;OAIG;IACG,kBAAkB,CACtB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,GACf,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAyBhD;IAED;;OAEG;YACW,mBAAmB;IAwCjC,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,qBAAqB;IAsC7B,OAAO,CAAC,yBAAyB;IAMjC,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,kBAAkB;CAoH3B"}
|
|
@@ -3,8 +3,8 @@ import { basename, join } from "path";
|
|
|
3
3
|
import { Bot as GrammyMessagingBot, InputFile } from "grammy";
|
|
4
4
|
import * as log from "../../log.js";
|
|
5
5
|
import { resolveChatSessionKey } from "../../sessions/policy.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { appendBotResponseLog, appendChannelLog, MessagingEventQueue, downloadUrlToFile, withRetry, } from "../shared.js";
|
|
7
|
+
import { telegramCommandMenu } from "../../commands/manifest.js";
|
|
8
8
|
import { processMessageIntake } from "../intake.js";
|
|
9
9
|
import { createTelegramAdapters } from "./context.js";
|
|
10
10
|
import { escapeTelegramHtml } from "./html.js";
|
|
@@ -43,14 +43,9 @@ export class TelegramMessagingBot {
|
|
|
43
43
|
this.botUserId = String(me.id);
|
|
44
44
|
this.botUsername = me.username ?? null;
|
|
45
45
|
this.startupTime = Date.now();
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
{ command: "model", description: "Switch this conversation's LLM model" },
|
|
50
|
-
{ command: "sandbox", description: "Show or boost sandbox limits" },
|
|
51
|
-
{ command: "stop", description: "Stop ongoing conversation" },
|
|
52
|
-
{ command: "new", description: "Reset conversation history and start fresh" },
|
|
53
|
-
]);
|
|
46
|
+
// Menu registration derives from the command manifest; routing is
|
|
47
|
+
// separate (native handlers below + intake/dispatch for the rest).
|
|
48
|
+
await this.client.api.setMyCommands(telegramCommandMenu());
|
|
54
49
|
this.setupEventHandlers();
|
|
55
50
|
// Start polling in background (bot.start() runs indefinitely)
|
|
56
51
|
this.client.start().catch((err) => {
|
|
@@ -63,6 +58,16 @@ export class TelegramMessagingBot {
|
|
|
63
58
|
const result = await this.postMessageRaw(parseInt(channel), text);
|
|
64
59
|
return String(result);
|
|
65
60
|
}
|
|
61
|
+
async addReaction(channel, messageTs, emoji) {
|
|
62
|
+
// Telegram reactions are set via setMessageReaction with a Unicode emoji.
|
|
63
|
+
// Short names (Slack style) won't resolve; callers should pass an emoji.
|
|
64
|
+
const name = emoji.replace(/^:|:$/g, "");
|
|
65
|
+
await telegramRetry(async () => {
|
|
66
|
+
await this.client.api.setMessageReaction(parseInt(channel), parseInt(messageTs), [
|
|
67
|
+
{ type: "emoji", emoji: name },
|
|
68
|
+
]);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
66
71
|
async updateMessage(channel, ts, text) {
|
|
67
72
|
return telegramRetry(async () => {
|
|
68
73
|
try {
|
|
@@ -101,7 +106,8 @@ export class TelegramMessagingBot {
|
|
|
101
106
|
getMessagingInfo() {
|
|
102
107
|
return {
|
|
103
108
|
name: "telegram",
|
|
104
|
-
|
|
109
|
+
trustModel: "membership",
|
|
110
|
+
formattingGuide: '## Telegram Formatting (HTML mode)\nBold: <b>text</b>, Italic: <i>text</i>, Code: <code>code</code>, Pre: <pre>code</pre>\nLinks: <a href="url">text</a>\nDo NOT use Markdown asterisks or backtick syntax.\nDo NOT use <table> tags — they are unsupported. Use <pre> with ASCII art for tables instead.',
|
|
105
111
|
channels: [],
|
|
106
112
|
users: [],
|
|
107
113
|
};
|
|
@@ -288,44 +294,46 @@ export class TelegramMessagingBot {
|
|
|
288
294
|
return text.trim();
|
|
289
295
|
return text.replace(new RegExp(`@${this.botUsername}`, "gi"), "").trim();
|
|
290
296
|
}
|
|
291
|
-
isStopText(text) {
|
|
292
|
-
return /^\/?stop(?:@\w+)?$/i.test(text.trim());
|
|
293
|
-
}
|
|
294
|
-
resolveStopTarget(mc) {
|
|
295
|
-
const directTarget = resolveStopTarget({
|
|
296
|
-
handler: this.handler,
|
|
297
|
-
conversationId: mc.chatId,
|
|
298
|
-
sessionKey: mc.sessionKey,
|
|
299
|
-
});
|
|
300
|
-
if (directTarget)
|
|
301
|
-
return directTarget;
|
|
302
|
-
return resolveOnlyScopedStopTarget(this.handler, mc.chatId);
|
|
303
|
-
}
|
|
304
297
|
setupEventHandlers() {
|
|
305
298
|
// --- Slash commands (registered before catch-all so grammY intercepts them) ---
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
if (!mc)
|
|
309
|
-
return;
|
|
310
|
-
const stopTarget = this.resolveStopTarget(mc);
|
|
311
|
-
if (stopTarget) {
|
|
312
|
-
await this.handler.handleStop(stopTarget, mc.chatId, this);
|
|
313
|
-
}
|
|
314
|
-
else {
|
|
315
|
-
await this.postMessage(mc.chatId, formatNothingRunning("telegram"));
|
|
316
|
-
}
|
|
317
|
-
});
|
|
299
|
+
// `/stop` is deliberately NOT registered here: it is a magic word owned by
|
|
300
|
+
// conversation intake, so the catch-all below must receive it.
|
|
318
301
|
this.client.command("new", async (ctx) => {
|
|
319
302
|
const mc = ctx.message ? this.extractMessageContext(ctx.message) : null;
|
|
320
303
|
if (!mc)
|
|
321
304
|
return;
|
|
322
|
-
|
|
305
|
+
const commandText = this.cleanText(mc.text);
|
|
306
|
+
const event = {
|
|
307
|
+
type: "command",
|
|
308
|
+
conversationId: mc.chatId,
|
|
309
|
+
conversationKind: mc.conversationKind,
|
|
310
|
+
ts: mc.msgId,
|
|
311
|
+
thread_ts: mc.threadTs,
|
|
312
|
+
sessionKey: mc.sessionKey,
|
|
313
|
+
user: mc.userId,
|
|
314
|
+
userName: mc.userName,
|
|
315
|
+
text: commandText,
|
|
316
|
+
attachments: [],
|
|
317
|
+
};
|
|
318
|
+
this.logToFile(mc.chatId, {
|
|
319
|
+
date: new Date(mc.msg.date * 1000).toISOString(),
|
|
320
|
+
ts: mc.msgId,
|
|
321
|
+
...(mc.conversationKind === "shared" && mc.threadTs ? { threadTs: mc.threadTs } : {}),
|
|
322
|
+
user: mc.userId,
|
|
323
|
+
userName: mc.userName,
|
|
324
|
+
text: commandText,
|
|
325
|
+
attachments: [],
|
|
326
|
+
isMessagingBot: false,
|
|
327
|
+
});
|
|
328
|
+
await this.handler.handleEvent(event, this, createTelegramAdapters(event, this));
|
|
323
329
|
});
|
|
324
330
|
this.client.command("sandbox", async (ctx) => {
|
|
325
331
|
const mc = ctx.message ? this.extractMessageContext(ctx.message) : null;
|
|
326
332
|
if (!mc)
|
|
327
333
|
return;
|
|
328
|
-
|
|
334
|
+
// The sandbox handler's grammar accepts /sandbox directly (manifest
|
|
335
|
+
// slash forms), so the user's spelling is logged and dispatched as-is.
|
|
336
|
+
const cleanedText = this.cleanText(mc.text);
|
|
329
337
|
const event = {
|
|
330
338
|
type: "command",
|
|
331
339
|
conversationId: mc.chatId,
|
|
@@ -358,25 +366,6 @@ export class TelegramMessagingBot {
|
|
|
358
366
|
return;
|
|
359
367
|
const cleanedText = this.cleanText(mc.text);
|
|
360
368
|
const addressedToMessagingBot = this.isAddressedToMessagingBot(mc.text, mc.chatType);
|
|
361
|
-
if (this.isStopText(cleanedText)) {
|
|
362
|
-
this.logToFile(mc.chatId, {
|
|
363
|
-
date: new Date(mc.msg.date * 1000).toISOString(),
|
|
364
|
-
ts: mc.msgId,
|
|
365
|
-
user: mc.userId,
|
|
366
|
-
userName: mc.userName,
|
|
367
|
-
text: cleanedText,
|
|
368
|
-
attachments: [],
|
|
369
|
-
isMessagingBot: false,
|
|
370
|
-
});
|
|
371
|
-
const stopTarget = this.resolveStopTarget(mc);
|
|
372
|
-
if (stopTarget) {
|
|
373
|
-
await this.handler.handleStop(stopTarget, mc.chatId, this);
|
|
374
|
-
}
|
|
375
|
-
else if (addressedToMessagingBot || mc.chatType === "private") {
|
|
376
|
-
await this.postMessage(mc.chatId, formatNothingRunning("telegram"));
|
|
377
|
-
}
|
|
378
|
-
return;
|
|
379
|
-
}
|
|
380
369
|
const isAutoReplyCandidate = mc.chatType !== "private" && !addressedToMessagingBot;
|
|
381
370
|
const eventBase = {
|
|
382
371
|
type: "message",
|
|
@@ -393,6 +382,11 @@ export class TelegramMessagingBot {
|
|
|
393
382
|
eventBase,
|
|
394
383
|
workingDir: this.workingDir,
|
|
395
384
|
isAutoReplyCandidate,
|
|
385
|
+
magicWord: {
|
|
386
|
+
addressed: addressedToMessagingBot || mc.chatType === "private",
|
|
387
|
+
scopeFallback: "always",
|
|
388
|
+
},
|
|
389
|
+
busyPolicy: "reject",
|
|
396
390
|
logEntryBase: {
|
|
397
391
|
date: new Date(mc.msg.date * 1000).toISOString(),
|
|
398
392
|
ts: mc.msgId,
|
|
@@ -409,12 +403,6 @@ export class TelegramMessagingBot {
|
|
|
409
403
|
handler: this.handler,
|
|
410
404
|
bot: this,
|
|
411
405
|
createContext: (event) => createTelegramAdapters(event, this),
|
|
412
|
-
beforeEnqueue: async () => {
|
|
413
|
-
if (!this.handler.isRunning(mc.sessionKey))
|
|
414
|
-
return true;
|
|
415
|
-
await this.postMessage(mc.chatId, formatAlreadyWorking("telegram", "/stop"));
|
|
416
|
-
return false;
|
|
417
|
-
},
|
|
418
406
|
});
|
|
419
407
|
});
|
|
420
408
|
}
|