@geminixiang/mikan 1.0.0-beta.2 → 1.0.0-beta.21
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 +388 -0
- package/README.md +49 -16
- 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/buffered-responder.d.ts +60 -0
- package/dist/adapters/buffered-responder.d.ts.map +1 -0
- package/dist/adapters/buffered-responder.js +201 -0
- package/dist/adapters/buffered-responder.js.map +1 -0
- 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 +36 -67
- 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 +44 -204
- 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 +24 -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 +103 -0
- package/dist/adapters/github/context.js.map +1 -0
- package/dist/adapters/github/gcp-auth.d.ts +31 -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 +24 -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 +22 -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 +22 -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 +19 -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 +350 -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 +79 -22
- package/dist/adapters/intake.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +8 -6
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +82 -134
- 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 +14 -17
- 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/streaming.d.ts +4 -0
- package/dist/adapters/streaming.d.ts.map +1 -1
- package/dist/adapters/streaming.js +11 -0
- package/dist/adapters/streaming.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 +27 -62
- 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 +37 -174
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/adapters/types.d.ts +28 -2
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/agent.d.ts +37 -14
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +359 -229
- 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 +16 -0
- package/dist/cli/boot.d.ts.map +1 -0
- package/dist/cli/boot.js +119 -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-git.d.ts +22 -0
- package/dist/cli/ext-git.d.ts.map +1 -0
- package/dist/cli/ext-git.js +76 -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 +215 -0
- package/dist/cli/ext.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 +72 -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.map +1 -1
- package/dist/commands/model.js +11 -9
- package/dist/commands/model.js.map +1 -1
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +2 -1
- package/dist/commands/new.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 +14 -1
- 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 +98 -95
- package/dist/config.js.map +1 -1
- package/dist/env-manifest.d.ts +35 -0
- package/dist/env-manifest.d.ts.map +1 -0
- package/dist/env-manifest.js +225 -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 +4 -2
- package/dist/execution-resolver.d.ts.map +1 -1
- package/dist/execution-resolver.js +54 -41
- package/dist/execution-resolver.js.map +1 -1
- package/dist/harness/event-format.d.ts +66 -0
- package/dist/harness/event-format.d.ts.map +1 -0
- package/dist/harness/event-format.js +112 -0
- package/dist/harness/event-format.js.map +1 -0
- package/dist/harness/extensions/loader.d.ts +44 -11
- package/dist/harness/extensions/loader.d.ts.map +1 -1
- package/dist/harness/extensions/loader.js +273 -84
- package/dist/harness/extensions/loader.js.map +1 -1
- package/dist/harness/extensions/registry.d.ts +48 -1
- package/dist/harness/extensions/registry.d.ts.map +1 -1
- package/dist/harness/extensions/registry.js +146 -0
- package/dist/harness/extensions/registry.js.map +1 -1
- package/dist/harness/extensions/types.d.ts +165 -22
- 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 +6 -5
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +3 -2
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/models.d.ts +5 -0
- 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 +37 -2
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +107 -23
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session-store.d.ts +4 -1
- package/dist/harness/session-store.d.ts.map +1 -1
- package/dist/harness/session-store.js +11 -2
- package/dist/harness/session-store.js.map +1 -1
- package/dist/harness/subagent-runner.d.ts +34 -0
- package/dist/harness/subagent-runner.d.ts.map +1 -0
- package/dist/harness/subagent-runner.js +339 -0
- package/dist/harness/subagent-runner.js.map +1 -0
- package/dist/harness/types.d.ts +53 -0
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/main.js +260 -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/provisioner.d.ts.map +1 -1
- package/dist/provisioner.js +2 -5
- 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 +276 -43
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/types.d.ts +36 -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 +10 -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 +11 -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 +10 -1
- package/dist/sandbox/firecracker.js.map +1 -1
- package/dist/sandbox/gondolin-bootstrap.d.ts +26 -0
- package/dist/sandbox/gondolin-bootstrap.d.ts.map +1 -0
- package/dist/sandbox/gondolin-bootstrap.js +27 -0
- package/dist/sandbox/gondolin-bootstrap.js.map +1 -0
- package/dist/sandbox/gondolin-contract.d.ts +125 -0
- package/dist/sandbox/gondolin-contract.d.ts.map +1 -0
- package/dist/sandbox/gondolin-contract.js +155 -0
- package/dist/sandbox/gondolin-contract.js.map +1 -0
- package/dist/sandbox/gondolin-fleet.d.ts +104 -0
- package/dist/sandbox/gondolin-fleet.d.ts.map +1 -0
- package/dist/sandbox/gondolin-fleet.js +330 -0
- package/dist/sandbox/gondolin-fleet.js.map +1 -0
- package/dist/sandbox/gondolin-gateway.d.ts +86 -0
- package/dist/sandbox/gondolin-gateway.d.ts.map +1 -0
- package/dist/sandbox/gondolin-gateway.js +407 -0
- package/dist/sandbox/gondolin-gateway.js.map +1 -0
- package/dist/sandbox/gondolin-inventory.d.ts +75 -0
- package/dist/sandbox/gondolin-inventory.d.ts.map +1 -0
- package/dist/sandbox/gondolin-inventory.js +257 -0
- package/dist/sandbox/gondolin-inventory.js.map +1 -0
- package/dist/sandbox/gondolin-join.d.ts +62 -0
- package/dist/sandbox/gondolin-join.d.ts.map +1 -0
- package/dist/sandbox/gondolin-join.js +261 -0
- package/dist/sandbox/gondolin-join.js.map +1 -0
- package/dist/sandbox/gondolin-nfs-advisory.d.ts +15 -0
- package/dist/sandbox/gondolin-nfs-advisory.d.ts.map +1 -0
- package/dist/sandbox/gondolin-nfs-advisory.js +60 -0
- package/dist/sandbox/gondolin-nfs-advisory.js.map +1 -0
- package/dist/sandbox/gondolin-placement.d.ts +30 -0
- package/dist/sandbox/gondolin-placement.d.ts.map +1 -0
- package/dist/sandbox/gondolin-placement.js +77 -0
- package/dist/sandbox/gondolin-placement.js.map +1 -0
- package/dist/sandbox/gondolin-recovery.d.ts +33 -0
- package/dist/sandbox/gondolin-recovery.d.ts.map +1 -0
- package/dist/sandbox/gondolin-recovery.js +39 -0
- package/dist/sandbox/gondolin-recovery.js.map +1 -0
- package/dist/sandbox/gondolin-remote.d.ts +70 -0
- package/dist/sandbox/gondolin-remote.d.ts.map +1 -0
- package/dist/sandbox/gondolin-remote.js +325 -0
- package/dist/sandbox/gondolin-remote.js.map +1 -0
- package/dist/sandbox/gondolin-worker-client.d.ts +135 -0
- package/dist/sandbox/gondolin-worker-client.d.ts.map +1 -0
- package/dist/sandbox/gondolin-worker-client.js +323 -0
- package/dist/sandbox/gondolin-worker-client.js.map +1 -0
- package/dist/sandbox/gondolin-worker-main.d.ts +2 -0
- package/dist/sandbox/gondolin-worker-main.d.ts.map +1 -0
- package/dist/sandbox/gondolin-worker-main.js +22 -0
- package/dist/sandbox/gondolin-worker-main.js.map +1 -0
- package/dist/sandbox/gondolin-worker.d.ts +17 -0
- package/dist/sandbox/gondolin-worker.d.ts.map +1 -0
- package/dist/sandbox/gondolin-worker.js +201 -0
- package/dist/sandbox/gondolin-worker.js.map +1 -0
- package/dist/sandbox/gondolin.d.ts +53 -0
- package/dist/sandbox/gondolin.d.ts.map +1 -0
- package/dist/sandbox/gondolin.js +429 -0
- package/dist/sandbox/gondolin.js.map +1 -0
- package/dist/sandbox/host.d.ts +3 -0
- package/dist/sandbox/host.d.ts.map +1 -1
- package/dist/sandbox/host.js +14 -0
- package/dist/sandbox/host.js.map +1 -1
- package/dist/sandbox/identity.d.ts +21 -0
- package/dist/sandbox/identity.d.ts.map +1 -0
- package/dist/sandbox/identity.js +36 -0
- package/dist/sandbox/identity.js.map +1 -0
- package/dist/sandbox/index.d.ts +13 -4
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +19 -3
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/types.d.ts +31 -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 +32 -0
- package/dist/sessions/chat-history-sync.d.ts.map +1 -0
- package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +40 -113
- package/dist/sessions/chat-history-sync.js.map +1 -0
- package/dist/sessions/conversation-log.d.ts +13 -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 +31 -0
- package/dist/sessions/session-key.d.ts.map +1 -0
- package/dist/sessions/session-key.js +44 -0
- package/dist/sessions/session-key.js.map +1 -0
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +6 -12
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +2 -2
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/settings-mutation.d.ts +23 -0
- package/dist/settings-mutation.d.ts.map +1 -0
- package/dist/settings-mutation.js +42 -0
- package/dist/settings-mutation.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 +24 -17
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +9 -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 +17 -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.map +1 -1
- package/dist/tools/read.js +7 -26
- 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 +13 -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 +57 -0
- package/dist/tools/subagent-slots.js.map +1 -0
- package/dist/tools/subagent.d.ts +74 -0
- package/dist/tools/subagent.d.ts.map +1 -0
- package/dist/tools/subagent.js +335 -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 +1 -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 +144 -31
- 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 +1 -32
- package/dist/vault/index.js.map +1 -1
- package/dist/vault/injection.d.ts +20 -0
- package/dist/vault/injection.d.ts.map +1 -0
- package/dist/vault/injection.js +27 -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 +0 -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 +27 -0
- package/dist/web/admin/portal.d.ts.map +1 -1
- package/dist/web/admin/portal.js +117 -154
- package/dist/web/admin/portal.js.map +1 -1
- package/dist/web/admin/types.d.ts +6 -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/package.json +7 -4
- 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,6 +1,6 @@
|
|
|
1
1
|
import * as log from "../../log.js";
|
|
2
2
|
import { createChatResponseErrorReporter, formatToolArgs, splitText, } from "../shared.js";
|
|
3
|
-
import { BufferedResponseStream } from "../streaming.js";
|
|
3
|
+
import { BufferedResponseStream, OrderedResponseOperations } from "../streaming.js";
|
|
4
4
|
import { buildMrkdwnContextBlock } from "./bot.js";
|
|
5
5
|
const MAX_MAIN_LENGTH = 35000; // Best-effort streaming cap; final responses use Slack error-driven fallback.
|
|
6
6
|
const MAX_THREAD_LENGTH = 20000;
|
|
@@ -67,7 +67,7 @@ export function createSlackResponseContext({ event, slack, sessionPlan, replyMod
|
|
|
67
67
|
let streamActive = false;
|
|
68
68
|
let streamUnavailable = false;
|
|
69
69
|
let streamedText = "";
|
|
70
|
-
|
|
70
|
+
const responseOperations = new OrderedResponseOperations();
|
|
71
71
|
const channelId = event.channel;
|
|
72
72
|
const conversationId = event.conversationId;
|
|
73
73
|
// Slack message timestamps are numeric; event-file triggers use `event:<filename>`.
|
|
@@ -227,18 +227,10 @@ export function createSlackResponseContext({ event, slack, sessionPlan, replyMod
|
|
|
227
227
|
}
|
|
228
228
|
},
|
|
229
229
|
});
|
|
230
|
-
const queueResponseOperation =
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
}
|
|
235
|
-
catch (err) {
|
|
236
|
-
log.logWarning(`Slack ${label} error`, err instanceof Error ? err.message : String(err));
|
|
237
|
-
reportResponseError(err, operation, context(err));
|
|
238
|
-
}
|
|
239
|
-
});
|
|
240
|
-
await updatePromise;
|
|
241
|
-
};
|
|
230
|
+
const queueResponseOperation = (label, operation, work, context) => responseOperations.run(work, (err) => {
|
|
231
|
+
log.logWarning(`Slack ${label} error`, err instanceof Error ? err.message : String(err));
|
|
232
|
+
reportResponseError(err, operation, context(err));
|
|
233
|
+
});
|
|
242
234
|
const responder = {
|
|
243
235
|
respond: async (text) => {
|
|
244
236
|
await queueResponseOperation("respond", "respond", async () => {
|
|
@@ -343,7 +335,13 @@ export function createSlackResponseContext({ event, slack, sessionPlan, replyMod
|
|
|
343
335
|
}
|
|
344
336
|
},
|
|
345
337
|
uploadFile: async (filePath, title) => {
|
|
346
|
-
await slack.uploadFile(channelId, filePath, title, rootTs);
|
|
338
|
+
await slack.uploadFile(channelId, filePath, title, replyInThread ? rootTs : undefined);
|
|
339
|
+
},
|
|
340
|
+
react: async (emoji) => {
|
|
341
|
+
// React to the triggering message. Event runs have no real message ts.
|
|
342
|
+
if (eventFilename)
|
|
343
|
+
return;
|
|
344
|
+
await slack.addReaction(channelId, event.ts, emoji);
|
|
347
345
|
},
|
|
348
346
|
setWorking: async (working) => {
|
|
349
347
|
await queueResponseOperation("setWorking", "set_working", async () => {
|
|
@@ -367,7 +365,7 @@ export function createSlackResponseContext({ event, slack, sessionPlan, replyMod
|
|
|
367
365
|
}, () => ({ working }));
|
|
368
366
|
},
|
|
369
367
|
deleteResponse: async () => {
|
|
370
|
-
|
|
368
|
+
await responseOperations.run(async () => {
|
|
371
369
|
// Clear assistant status first
|
|
372
370
|
if (rootTs) {
|
|
373
371
|
try {
|
|
@@ -393,7 +391,6 @@ export function createSlackResponseContext({ event, slack, sessionPlan, replyMod
|
|
|
393
391
|
messageTs = null;
|
|
394
392
|
}
|
|
395
393
|
});
|
|
396
|
-
await updatePromise;
|
|
397
394
|
},
|
|
398
395
|
};
|
|
399
396
|
return responder;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-lifecycle.js","sourceRoot":"","sources":["../../../src/adapters/slack/response-lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConversationMessage, ConversationResponder, ChatToolResult } from \"../../adapter.js\";\nimport * as log from \"../../log.js\";\nimport {\n createChatResponseErrorReporter,\n formatToolArgs,\n splitText,\n type ChatResponseErrorOperation,\n} from \"../shared.js\";\nimport { BufferedResponseStream } from \"../streaming.js\";\nimport { buildMrkdwnContextBlock, type SlackMessagingBot, type SlackEvent } from \"./bot.js\";\nimport type { SlackAdapterSessionPlan } from \"./types.js\";\n\nconst MAX_MAIN_LENGTH = 35000; // Best-effort streaming cap; final responses use Slack error-driven fallback.\nconst MAX_THREAD_LENGTH = 20000;\nconst FALLBACK_MAIN_LENGTH = 3000;\nconst WORKING_INDICATOR = \" ...\";\nconst TRUNCATION_NOTE_INCREMENTAL =\n \"\\n\\n_(message truncated, ask me to elaborate on specific parts)_\";\n\nconst formatSlackContinuation = (partNum: number): string => `_(continued ${partNum})_`;\n\nfunction isSlackMsgTooLong(err: unknown): boolean {\n const data = (err as { data?: { error?: string } } | undefined)?.data;\n const message = err instanceof Error ? err.message : String(err);\n return data?.error === \"msg_too_long\" || message.includes(\"msg_too_long\");\n}\n\nfunction fallbackLongSlackText(\n text: string,\n overflowLink?: string,\n prefixLength = FALLBACK_MAIN_LENGTH,\n): string {\n const suffix = overflowLink\n ? `\\n\\n_(message too long for Slack; continued in thread; session view: <${overflowLink}|open>)_`\n : \"\\n\\n_(message too long for Slack; continued in thread)_\";\n return `${text.slice(0, prefixLength)}${suffix}`;\n}\n\nasync function postSlackTextWithFallback(\n post: (text: string) => Promise<string | void>,\n text: string,\n overflowLink?: string,\n): Promise<{ result: string | void; text: string; prefixLength: number }> {\n let prefixLength = FALLBACK_MAIN_LENGTH;\n let lastErr: unknown;\n\n for (;;) {\n const fallbackText = fallbackLongSlackText(text, overflowLink, prefixLength);\n try {\n const result = await post(fallbackText);\n return { result, text: fallbackText, prefixLength };\n } catch (err) {\n if (!isSlackMsgTooLong(err)) throw err;\n lastErr = err;\n if (prefixLength === 0) {\n throw lastErr instanceof Error ? lastErr : new Error(String(lastErr));\n }\n prefixLength = Math.max(0, Math.floor(prefixLength / 2));\n }\n }\n}\n\nfunction formatSlackToolResult(result: ChatToolResult): string {\n const argsFormatted = formatToolArgs(result.args);\n const duration = (result.durationMs / 1000).toFixed(1);\n let text = `*${result.isError ? \"✗\" : \"✓\"} ${result.toolName}*`;\n if (result.label) text += `: ${result.label}`;\n text += ` (${duration}s)\\n`;\n if (argsFormatted) text += `\\`\\`\\`\\n${argsFormatted}\\n\\`\\`\\`\\n`;\n text += `*Result:*\\n\\`\\`\\`\\n${result.result}\\n\\`\\`\\``;\n return text;\n}\n\nexport function createSlackResponseContext({\n event,\n slack,\n sessionPlan,\n replyMode,\n message,\n}: {\n event: SlackEvent;\n slack: SlackMessagingBot;\n sessionPlan: SlackAdapterSessionPlan;\n replyMode: \"top-level\" | \"thread\";\n message: ConversationMessage;\n}): ConversationResponder {\n let messageTs: string | null = sessionPlan.initialMessageTs ?? null;\n let assistantStatusFailureWarned = false;\n const onAssistantStatusError = (label: string, err: unknown): void => {\n if (assistantStatusFailureWarned) return;\n assistantStatusFailureWarned = true;\n log.logWarning(\n `Slack setAssistantStatus failed (${label}; further occurrences suppressed for this session)`,\n err instanceof Error ? err.message : String(err),\n );\n };\n const threadMessageTs: string[] = [];\n let accumulatedText = \"\";\n let isWorking = true;\n let mainResponseLogged = false;\n let streamActive = false;\n let streamUnavailable = false;\n let streamedText = \"\";\n let updatePromise = Promise.resolve();\n\n const channelId = event.channel;\n const conversationId = event.conversationId;\n\n // Slack message timestamps are numeric; event-file triggers use `event:<filename>`.\n const eventFilename = event.ts.match(/^event:([^:]+(?:\\.json)?)/)?.[1];\n\n const { rootTs, isThreaded } = sessionPlan;\n const replyInThread = Boolean(rootTs && (isThreaded || replyMode === \"thread\"));\n\n /**\n * Post the first visible reply.\n * Default Slack behavior is now top-level channel replies.\n * If the triggering message is already inside a thread, stay in that thread.\n */\n const postFirstMessage = async (text: string): Promise<string> => {\n if (replyInThread && rootTs) {\n return slack.postInThread(channelId, rootTs, text);\n }\n return slack.postMessage(channelId, text);\n };\n\n const postDiagnosticDirect = async (\n text: string,\n options?: { style?: \"muted\" | \"error\" },\n ): Promise<void> => {\n const threadAnchor = messageTs ?? rootTs;\n if (!threadAnchor) return;\n\n for (const part of splitText(text, MAX_THREAD_LENGTH, formatSlackContinuation)) {\n if (options?.style === \"muted\") {\n const ts = await slack.postInThreadBlocks(channelId, threadAnchor, part, [\n buildMrkdwnContextBlock(part),\n ]);\n threadMessageTs.push(ts);\n } else {\n const diagnosticText = options?.style === \"error\" ? `_${part}_` : part;\n const ts = await slack.postInThread(channelId, threadAnchor, diagnosticText);\n threadMessageTs.push(ts);\n }\n }\n };\n\n const reportResponseError = createChatResponseErrorReporter(() => ({\n platform: \"slack\",\n conversationId,\n channelId,\n messageId: message.id,\n sessionKey: message.sessionKey,\n responseMessageId: messageTs,\n threadTs: rootTs,\n conversationKind: message.conversationKind,\n isThreaded,\n }));\n\n const postOrUpdateMain = async (body: string, handleMsgTooLong = true): Promise<void> => {\n const writeMain = async (text: string): Promise<string | void> => {\n if (messageTs) {\n await slack.updateMessage(channelId, messageTs, text);\n return;\n }\n if (replyInThread && rootTs) {\n messageTs = await slack.postInThread(channelId, rootTs, text);\n return messageTs;\n }\n messageTs = await postFirstMessage(text);\n return messageTs;\n };\n\n try {\n await writeMain(body);\n } catch (err) {\n if (!handleMsgTooLong || !isSlackMsgTooLong(err)) throw err;\n const fallback = await postSlackTextWithFallback(writeMain, body);\n accumulatedText = fallback.text;\n stream.setText(accumulatedText);\n }\n };\n\n const abandonActiveStream = async (): Promise<void> => {\n if (!streamActive || !messageTs) return;\n const failedStreamTs = messageTs;\n streamActive = false;\n streamedText = \"\";\n await slack.stopMessageStream(channelId, failedStreamTs).catch(() => undefined);\n if (messageTs === failedStreamTs) messageTs = null;\n };\n\n const startOrAppendStream = async (text: string, displayText: string): Promise<void> => {\n if (streamUnavailable) {\n await postOrUpdateMain(displayText);\n return;\n }\n\n try {\n if (messageTs && streamActive) {\n if (!text.startsWith(streamedText)) {\n await abandonActiveStream();\n await postOrUpdateMain(displayText);\n return;\n }\n const delta = text.slice(streamedText.length);\n if (delta) {\n await slack.appendMessageStream(channelId, messageTs, delta);\n streamedText = text;\n }\n return;\n }\n if (!replyInThread || !rootTs) {\n streamUnavailable = true;\n await postOrUpdateMain(displayText);\n return;\n }\n messageTs = await slack.startMessageStream(channelId, text, rootTs, event.user);\n streamActive = true;\n streamedText = text;\n } catch (err) {\n streamUnavailable = true;\n log.logWarning(\n \"Slack streaming unavailable; falling back to chat.update\",\n err instanceof Error ? err.message : String(err),\n );\n await abandonActiveStream();\n await postOrUpdateMain(displayText);\n }\n };\n\n const stream = new BufferedResponseStream({\n flush: async (text) => {\n accumulatedText = text;\n const mainLimit = isWorking ? MAX_MAIN_LENGTH - WORKING_INDICATOR.length : MAX_MAIN_LENGTH;\n if (accumulatedText.length > mainLimit) {\n accumulatedText =\n accumulatedText.substring(0, mainLimit - TRUNCATION_NOTE_INCREMENTAL.length) +\n TRUNCATION_NOTE_INCREMENTAL;\n stream.setText(accumulatedText);\n }\n const displayText = isWorking ? accumulatedText + WORKING_INDICATOR : accumulatedText;\n await startOrAppendStream(text, displayText);\n },\n finish: async (text) => {\n accumulatedText = text;\n isWorking = false;\n if (streamActive && messageTs) {\n try {\n if (!accumulatedText.startsWith(streamedText)) {\n await abandonActiveStream();\n await postOrUpdateMain(accumulatedText);\n return;\n }\n const delta = accumulatedText.slice(streamedText.length);\n if (delta) {\n await slack.appendMessageStream(channelId, messageTs, delta);\n streamedText = accumulatedText;\n }\n await slack.stopMessageStream(channelId, messageTs);\n streamActive = false;\n streamedText = \"\";\n return;\n } catch (err) {\n streamUnavailable = true;\n log.logWarning(\n \"Slack streaming unavailable; falling back to chat.update\",\n err instanceof Error ? err.message : String(err),\n );\n await abandonActiveStream();\n }\n }\n if (messageTs || accumulatedText) {\n await postOrUpdateMain(accumulatedText);\n }\n },\n });\n\n const queueResponseOperation = async (\n label: string,\n operation: ChatResponseErrorOperation,\n work: () => Promise<void>,\n context: (err: unknown) => Record<string, unknown>,\n ): Promise<void> => {\n updatePromise = updatePromise.then(async () => {\n try {\n await work();\n } catch (err) {\n log.logWarning(`Slack ${label} error`, err instanceof Error ? err.message : String(err));\n reportResponseError(err, operation, context(err));\n }\n });\n await updatePromise;\n };\n\n const responder: ConversationResponder = {\n respond: async (text: string) => {\n await queueResponseOperation(\n \"respond\",\n \"respond\",\n async () => {\n accumulatedText = accumulatedText ? `${accumulatedText}\\n${text}` : text;\n\n const mainLimit = isWorking\n ? MAX_MAIN_LENGTH - WORKING_INDICATOR.length\n : MAX_MAIN_LENGTH;\n if (accumulatedText.length > mainLimit) {\n accumulatedText =\n accumulatedText.substring(0, mainLimit - TRUNCATION_NOTE_INCREMENTAL.length) +\n TRUNCATION_NOTE_INCREMENTAL;\n }\n\n stream.setText(accumulatedText);\n const displayText = isWorking ? accumulatedText + WORKING_INDICATOR : accumulatedText;\n await startOrAppendStream(text, displayText);\n },\n () => ({\n phase: messageTs ? \"update\" : \"initial_post\",\n textLength: text.length,\n accumulatedLength: accumulatedText.length,\n }),\n );\n },\n\n appendResponseDelta: async (delta: string) => {\n await queueResponseOperation(\n \"appendResponseDelta\",\n \"respond\",\n async () => {\n await stream.append(delta);\n },\n () => ({ textLength: delta.length, accumulatedLength: stream.getText().length }),\n );\n },\n\n finishResponse: async (finalText?: string) => {\n await queueResponseOperation(\n \"finishResponse\",\n \"set_working\",\n async () => {\n await stream.finish(finalText);\n accumulatedText = stream.getText();\n if (messageTs && accumulatedText.trim() && !mainResponseLogged) {\n slack.logBotResponse(\n channelId,\n accumulatedText,\n messageTs,\n replyInThread ? rootTs : undefined,\n );\n mainResponseLogged = true;\n }\n if (!rootTs) return;\n await slack\n .setAssistantStatus(channelId, rootTs, \"\")\n .catch((err) => onAssistantStatusError(\"clear-on-idle\", err));\n },\n () => ({ finalTextLength: finalText?.length }),\n );\n },\n\n replaceResponse: async (text: string, options?: { createOverflowLink?: () => string }) => {\n await queueResponseOperation(\n \"replaceResponse\",\n \"replace_response\",\n async () => {\n // Lazy: only mint a token if Slack actually rejects the message.\n let overflowLink: string | undefined;\n const resolveOverflowLink = (): string | undefined => {\n if (overflowLink === undefined && options?.createOverflowLink) {\n overflowLink = options.createOverflowLink();\n }\n return overflowLink;\n };\n\n accumulatedText = text;\n stream.setText(accumulatedText);\n const displayText = isWorking ? accumulatedText + WORKING_INDICATOR : accumulatedText;\n\n try {\n if (streamActive && messageTs) {\n await slack.stopMessageStream(channelId, messageTs);\n streamActive = false;\n streamedText = \"\";\n }\n await postOrUpdateMain(displayText, false);\n } catch (err) {\n if (!isSlackMsgTooLong(err)) throw err;\n const link = resolveOverflowLink();\n const fallback = await postSlackTextWithFallback(\n async (body) => {\n await postOrUpdateMain(body);\n },\n text,\n link,\n );\n accumulatedText = fallback.text;\n const continuation = text.slice(fallback.prefixLength).trimStart();\n if (continuation) {\n await postDiagnosticDirect(`_(continued from truncated message)_\\n\\n${continuation}`);\n }\n }\n },\n () => ({\n textLength: text.length,\n hadExistingResponse: Boolean(messageTs),\n }),\n );\n },\n\n respondDiagnostic: async (text: string, options?: { style?: \"muted\" | \"error\" }) => {\n await queueResponseOperation(\n \"respondDiagnostic\",\n \"respond_diagnostic\",\n async () => {\n await postDiagnosticDirect(text, options);\n },\n () => ({\n textLength: text.length,\n style: options?.style,\n }),\n );\n },\n\n respondToolResult: async (result: ChatToolResult) => {\n await responder.respondDiagnostic(formatSlackToolResult(result));\n },\n\n setTyping: async (isTyping: boolean) => {\n if (isTyping && !messageTs && rootTs) {\n try {\n const statusText = eventFilename ? `Starting event: ${eventFilename}` : \"Thinking\";\n await slack.setAssistantStatus(channelId, rootTs, statusText);\n } catch (err) {\n // Assistant API not available — first respond() call will create the message.\n onAssistantStatusError(\"typing\", err);\n }\n }\n },\n\n uploadFile: async (filePath: string, title?: string) => {\n await slack.uploadFile(channelId, filePath, title, rootTs);\n },\n\n setWorking: async (working: boolean) => {\n await queueResponseOperation(\n \"setWorking\",\n \"set_working\",\n async () => {\n isWorking = working;\n if (messageTs) {\n const displayText = isWorking ? accumulatedText + WORKING_INDICATOR : accumulatedText;\n const updates: Promise<void>[] =\n streamActive && !isWorking\n ? [\n slack.stopMessageStream(channelId, messageTs).then(() => {\n streamActive = false;\n }),\n ]\n : [slack.updateMessage(channelId, messageTs, displayText)];\n if (!working && rootTs) {\n updates.push(\n slack\n .setAssistantStatus(channelId, rootTs, \"\")\n .catch((err) => onAssistantStatusError(\"clear-on-idle\", err)),\n );\n }\n await Promise.all(updates);\n }\n },\n () => ({ working }),\n );\n },\n\n deleteResponse: async () => {\n updatePromise = updatePromise.then(async () => {\n // Clear assistant status first\n if (rootTs) {\n try {\n await slack.setAssistantStatus(channelId, rootTs, \"\");\n } catch {\n // Ignore errors clearing status\n }\n }\n\n // Delete thread messages first (in reverse order)\n for (let i = threadMessageTs.length - 1; i >= 0; i--) {\n try {\n await slack.deleteMessage(channelId, threadMessageTs[i]);\n } catch {\n // Ignore errors deleting thread messages\n }\n }\n threadMessageTs.length = 0;\n // Then delete main message\n if (messageTs) {\n await slack.deleteMessage(channelId, messageTs);\n messageTs = null;\n }\n });\n await updatePromise;\n },\n };\n\n return responder;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"response-lifecycle.js","sourceRoot":"","sources":["../../../src/adapters/slack/response-lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConversationMessage, ConversationResponder, ChatToolResult } from \"../../adapter.js\";\nimport * as log from \"../../log.js\";\nimport {\n createChatResponseErrorReporter,\n formatToolArgs,\n splitText,\n type ChatResponseErrorOperation,\n} from \"../shared.js\";\nimport { BufferedResponseStream, OrderedResponseOperations } from \"../streaming.js\";\nimport { buildMrkdwnContextBlock, type SlackMessagingBot, type SlackEvent } from \"./bot.js\";\nimport type { SlackAdapterSessionPlan } from \"./types.js\";\n\nconst MAX_MAIN_LENGTH = 35000; // Best-effort streaming cap; final responses use Slack error-driven fallback.\nconst MAX_THREAD_LENGTH = 20000;\nconst FALLBACK_MAIN_LENGTH = 3000;\nconst WORKING_INDICATOR = \" ...\";\nconst TRUNCATION_NOTE_INCREMENTAL =\n \"\\n\\n_(message truncated, ask me to elaborate on specific parts)_\";\n\nconst formatSlackContinuation = (partNum: number): string => `_(continued ${partNum})_`;\n\nfunction isSlackMsgTooLong(err: unknown): boolean {\n const data = (err as { data?: { error?: string } } | undefined)?.data;\n const message = err instanceof Error ? err.message : String(err);\n return data?.error === \"msg_too_long\" || message.includes(\"msg_too_long\");\n}\n\nfunction fallbackLongSlackText(\n text: string,\n overflowLink?: string,\n prefixLength = FALLBACK_MAIN_LENGTH,\n): string {\n const suffix = overflowLink\n ? `\\n\\n_(message too long for Slack; continued in thread; session view: <${overflowLink}|open>)_`\n : \"\\n\\n_(message too long for Slack; continued in thread)_\";\n return `${text.slice(0, prefixLength)}${suffix}`;\n}\n\nasync function postSlackTextWithFallback(\n post: (text: string) => Promise<string | void>,\n text: string,\n overflowLink?: string,\n): Promise<{ result: string | void; text: string; prefixLength: number }> {\n let prefixLength = FALLBACK_MAIN_LENGTH;\n let lastErr: unknown;\n\n for (;;) {\n const fallbackText = fallbackLongSlackText(text, overflowLink, prefixLength);\n try {\n const result = await post(fallbackText);\n return { result, text: fallbackText, prefixLength };\n } catch (err) {\n if (!isSlackMsgTooLong(err)) throw err;\n lastErr = err;\n if (prefixLength === 0) {\n throw lastErr instanceof Error ? lastErr : new Error(String(lastErr));\n }\n prefixLength = Math.max(0, Math.floor(prefixLength / 2));\n }\n }\n}\n\nfunction formatSlackToolResult(result: ChatToolResult): string {\n const argsFormatted = formatToolArgs(result.args);\n const duration = (result.durationMs / 1000).toFixed(1);\n let text = `*${result.isError ? \"✗\" : \"✓\"} ${result.toolName}*`;\n if (result.label) text += `: ${result.label}`;\n text += ` (${duration}s)\\n`;\n if (argsFormatted) text += `\\`\\`\\`\\n${argsFormatted}\\n\\`\\`\\`\\n`;\n text += `*Result:*\\n\\`\\`\\`\\n${result.result}\\n\\`\\`\\``;\n return text;\n}\n\nexport function createSlackResponseContext({\n event,\n slack,\n sessionPlan,\n replyMode,\n message,\n}: {\n event: SlackEvent;\n slack: SlackMessagingBot;\n sessionPlan: SlackAdapterSessionPlan;\n replyMode: \"top-level\" | \"thread\";\n message: ConversationMessage;\n}): ConversationResponder {\n let messageTs: string | null = sessionPlan.initialMessageTs ?? null;\n let assistantStatusFailureWarned = false;\n const onAssistantStatusError = (label: string, err: unknown): void => {\n if (assistantStatusFailureWarned) return;\n assistantStatusFailureWarned = true;\n log.logWarning(\n `Slack setAssistantStatus failed (${label}; further occurrences suppressed for this session)`,\n err instanceof Error ? err.message : String(err),\n );\n };\n const threadMessageTs: string[] = [];\n let accumulatedText = \"\";\n let isWorking = true;\n let mainResponseLogged = false;\n let streamActive = false;\n let streamUnavailable = false;\n let streamedText = \"\";\n const responseOperations = new OrderedResponseOperations();\n\n const channelId = event.channel;\n const conversationId = event.conversationId;\n\n // Slack message timestamps are numeric; event-file triggers use `event:<filename>`.\n const eventFilename = event.ts.match(/^event:([^:]+(?:\\.json)?)/)?.[1];\n\n const { rootTs, isThreaded } = sessionPlan;\n const replyInThread = Boolean(rootTs && (isThreaded || replyMode === \"thread\"));\n\n /**\n * Post the first visible reply.\n * Default Slack behavior is now top-level channel replies.\n * If the triggering message is already inside a thread, stay in that thread.\n */\n const postFirstMessage = async (text: string): Promise<string> => {\n if (replyInThread && rootTs) {\n return slack.postInThread(channelId, rootTs, text);\n }\n return slack.postMessage(channelId, text);\n };\n\n const postDiagnosticDirect = async (\n text: string,\n options?: { style?: \"muted\" | \"error\" },\n ): Promise<void> => {\n const threadAnchor = messageTs ?? rootTs;\n if (!threadAnchor) return;\n\n for (const part of splitText(text, MAX_THREAD_LENGTH, formatSlackContinuation)) {\n if (options?.style === \"muted\") {\n const ts = await slack.postInThreadBlocks(channelId, threadAnchor, part, [\n buildMrkdwnContextBlock(part),\n ]);\n threadMessageTs.push(ts);\n } else {\n const diagnosticText = options?.style === \"error\" ? `_${part}_` : part;\n const ts = await slack.postInThread(channelId, threadAnchor, diagnosticText);\n threadMessageTs.push(ts);\n }\n }\n };\n\n const reportResponseError = createChatResponseErrorReporter(() => ({\n platform: \"slack\",\n conversationId,\n channelId,\n messageId: message.id,\n sessionKey: message.sessionKey,\n responseMessageId: messageTs,\n threadTs: rootTs,\n conversationKind: message.conversationKind,\n isThreaded,\n }));\n\n const postOrUpdateMain = async (body: string, handleMsgTooLong = true): Promise<void> => {\n const writeMain = async (text: string): Promise<string | void> => {\n if (messageTs) {\n await slack.updateMessage(channelId, messageTs, text);\n return;\n }\n if (replyInThread && rootTs) {\n messageTs = await slack.postInThread(channelId, rootTs, text);\n return messageTs;\n }\n messageTs = await postFirstMessage(text);\n return messageTs;\n };\n\n try {\n await writeMain(body);\n } catch (err) {\n if (!handleMsgTooLong || !isSlackMsgTooLong(err)) throw err;\n const fallback = await postSlackTextWithFallback(writeMain, body);\n accumulatedText = fallback.text;\n stream.setText(accumulatedText);\n }\n };\n\n const abandonActiveStream = async (): Promise<void> => {\n if (!streamActive || !messageTs) return;\n const failedStreamTs = messageTs;\n streamActive = false;\n streamedText = \"\";\n await slack.stopMessageStream(channelId, failedStreamTs).catch(() => undefined);\n if (messageTs === failedStreamTs) messageTs = null;\n };\n\n const startOrAppendStream = async (text: string, displayText: string): Promise<void> => {\n if (streamUnavailable) {\n await postOrUpdateMain(displayText);\n return;\n }\n\n try {\n if (messageTs && streamActive) {\n if (!text.startsWith(streamedText)) {\n await abandonActiveStream();\n await postOrUpdateMain(displayText);\n return;\n }\n const delta = text.slice(streamedText.length);\n if (delta) {\n await slack.appendMessageStream(channelId, messageTs, delta);\n streamedText = text;\n }\n return;\n }\n if (!replyInThread || !rootTs) {\n streamUnavailable = true;\n await postOrUpdateMain(displayText);\n return;\n }\n messageTs = await slack.startMessageStream(channelId, text, rootTs, event.user);\n streamActive = true;\n streamedText = text;\n } catch (err) {\n streamUnavailable = true;\n log.logWarning(\n \"Slack streaming unavailable; falling back to chat.update\",\n err instanceof Error ? err.message : String(err),\n );\n await abandonActiveStream();\n await postOrUpdateMain(displayText);\n }\n };\n\n const stream = new BufferedResponseStream({\n flush: async (text) => {\n accumulatedText = text;\n const mainLimit = isWorking ? MAX_MAIN_LENGTH - WORKING_INDICATOR.length : MAX_MAIN_LENGTH;\n if (accumulatedText.length > mainLimit) {\n accumulatedText =\n accumulatedText.substring(0, mainLimit - TRUNCATION_NOTE_INCREMENTAL.length) +\n TRUNCATION_NOTE_INCREMENTAL;\n stream.setText(accumulatedText);\n }\n const displayText = isWorking ? accumulatedText + WORKING_INDICATOR : accumulatedText;\n await startOrAppendStream(text, displayText);\n },\n finish: async (text) => {\n accumulatedText = text;\n isWorking = false;\n if (streamActive && messageTs) {\n try {\n if (!accumulatedText.startsWith(streamedText)) {\n await abandonActiveStream();\n await postOrUpdateMain(accumulatedText);\n return;\n }\n const delta = accumulatedText.slice(streamedText.length);\n if (delta) {\n await slack.appendMessageStream(channelId, messageTs, delta);\n streamedText = accumulatedText;\n }\n await slack.stopMessageStream(channelId, messageTs);\n streamActive = false;\n streamedText = \"\";\n return;\n } catch (err) {\n streamUnavailable = true;\n log.logWarning(\n \"Slack streaming unavailable; falling back to chat.update\",\n err instanceof Error ? err.message : String(err),\n );\n await abandonActiveStream();\n }\n }\n if (messageTs || accumulatedText) {\n await postOrUpdateMain(accumulatedText);\n }\n },\n });\n\n const queueResponseOperation = (\n label: string,\n operation: ChatResponseErrorOperation,\n work: () => Promise<void>,\n context: (err: unknown) => Record<string, unknown>,\n ): Promise<void> =>\n responseOperations.run(work, (err) => {\n log.logWarning(`Slack ${label} error`, err instanceof Error ? err.message : String(err));\n reportResponseError(err, operation, context(err));\n });\n\n const responder: ConversationResponder = {\n respond: async (text: string) => {\n await queueResponseOperation(\n \"respond\",\n \"respond\",\n async () => {\n accumulatedText = accumulatedText ? `${accumulatedText}\\n${text}` : text;\n\n const mainLimit = isWorking\n ? MAX_MAIN_LENGTH - WORKING_INDICATOR.length\n : MAX_MAIN_LENGTH;\n if (accumulatedText.length > mainLimit) {\n accumulatedText =\n accumulatedText.substring(0, mainLimit - TRUNCATION_NOTE_INCREMENTAL.length) +\n TRUNCATION_NOTE_INCREMENTAL;\n }\n\n stream.setText(accumulatedText);\n const displayText = isWorking ? accumulatedText + WORKING_INDICATOR : accumulatedText;\n await startOrAppendStream(text, displayText);\n },\n () => ({\n phase: messageTs ? \"update\" : \"initial_post\",\n textLength: text.length,\n accumulatedLength: accumulatedText.length,\n }),\n );\n },\n\n appendResponseDelta: async (delta: string) => {\n await queueResponseOperation(\n \"appendResponseDelta\",\n \"respond\",\n async () => {\n await stream.append(delta);\n },\n () => ({ textLength: delta.length, accumulatedLength: stream.getText().length }),\n );\n },\n\n finishResponse: async (finalText?: string) => {\n await queueResponseOperation(\n \"finishResponse\",\n \"set_working\",\n async () => {\n await stream.finish(finalText);\n accumulatedText = stream.getText();\n if (messageTs && accumulatedText.trim() && !mainResponseLogged) {\n slack.logBotResponse(\n channelId,\n accumulatedText,\n messageTs,\n replyInThread ? rootTs : undefined,\n );\n mainResponseLogged = true;\n }\n if (!rootTs) return;\n await slack\n .setAssistantStatus(channelId, rootTs, \"\")\n .catch((err) => onAssistantStatusError(\"clear-on-idle\", err));\n },\n () => ({ finalTextLength: finalText?.length }),\n );\n },\n\n replaceResponse: async (text: string, options?: { createOverflowLink?: () => string }) => {\n await queueResponseOperation(\n \"replaceResponse\",\n \"replace_response\",\n async () => {\n // Lazy: only mint a token if Slack actually rejects the message.\n let overflowLink: string | undefined;\n const resolveOverflowLink = (): string | undefined => {\n if (overflowLink === undefined && options?.createOverflowLink) {\n overflowLink = options.createOverflowLink();\n }\n return overflowLink;\n };\n\n accumulatedText = text;\n stream.setText(accumulatedText);\n const displayText = isWorking ? accumulatedText + WORKING_INDICATOR : accumulatedText;\n\n try {\n if (streamActive && messageTs) {\n await slack.stopMessageStream(channelId, messageTs);\n streamActive = false;\n streamedText = \"\";\n }\n await postOrUpdateMain(displayText, false);\n } catch (err) {\n if (!isSlackMsgTooLong(err)) throw err;\n const link = resolveOverflowLink();\n const fallback = await postSlackTextWithFallback(\n async (body) => {\n await postOrUpdateMain(body);\n },\n text,\n link,\n );\n accumulatedText = fallback.text;\n const continuation = text.slice(fallback.prefixLength).trimStart();\n if (continuation) {\n await postDiagnosticDirect(`_(continued from truncated message)_\\n\\n${continuation}`);\n }\n }\n },\n () => ({\n textLength: text.length,\n hadExistingResponse: Boolean(messageTs),\n }),\n );\n },\n\n respondDiagnostic: async (text: string, options?: { style?: \"muted\" | \"error\" }) => {\n await queueResponseOperation(\n \"respondDiagnostic\",\n \"respond_diagnostic\",\n async () => {\n await postDiagnosticDirect(text, options);\n },\n () => ({\n textLength: text.length,\n style: options?.style,\n }),\n );\n },\n\n respondToolResult: async (result: ChatToolResult) => {\n await responder.respondDiagnostic(formatSlackToolResult(result));\n },\n\n setTyping: async (isTyping: boolean) => {\n if (isTyping && !messageTs && rootTs) {\n try {\n const statusText = eventFilename ? `Starting event: ${eventFilename}` : \"Thinking\";\n await slack.setAssistantStatus(channelId, rootTs, statusText);\n } catch (err) {\n // Assistant API not available — first respond() call will create the message.\n onAssistantStatusError(\"typing\", err);\n }\n }\n },\n\n uploadFile: async (filePath: string, title?: string) => {\n await slack.uploadFile(channelId, filePath, title, replyInThread ? rootTs : undefined);\n },\n\n react: async (emoji: string) => {\n // React to the triggering message. Event runs have no real message ts.\n if (eventFilename) return;\n await slack.addReaction(channelId, event.ts, emoji);\n },\n\n setWorking: async (working: boolean) => {\n await queueResponseOperation(\n \"setWorking\",\n \"set_working\",\n async () => {\n isWorking = working;\n if (messageTs) {\n const displayText = isWorking ? accumulatedText + WORKING_INDICATOR : accumulatedText;\n const updates: Promise<void>[] =\n streamActive && !isWorking\n ? [\n slack.stopMessageStream(channelId, messageTs).then(() => {\n streamActive = false;\n }),\n ]\n : [slack.updateMessage(channelId, messageTs, displayText)];\n if (!working && rootTs) {\n updates.push(\n slack\n .setAssistantStatus(channelId, rootTs, \"\")\n .catch((err) => onAssistantStatusError(\"clear-on-idle\", err)),\n );\n }\n await Promise.all(updates);\n }\n },\n () => ({ working }),\n );\n },\n\n deleteResponse: async () => {\n await responseOperations.run(async () => {\n // Clear assistant status first\n if (rootTs) {\n try {\n await slack.setAssistantStatus(channelId, rootTs, \"\");\n } catch {\n // Ignore errors clearing status\n }\n }\n\n // Delete thread messages first (in reverse order)\n for (let i = threadMessageTs.length - 1; i >= 0; i--) {\n try {\n await slack.deleteMessage(channelId, threadMessageTs[i]);\n } catch {\n // Ignore errors deleting thread messages\n }\n }\n threadMessageTs.length = 0;\n // Then delete main message\n if (messageTs) {\n await slack.deleteMessage(channelId, messageTs);\n messageTs = null;\n }\n });\n },\n };\n\n return responder;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/session.ts"],"names":[],"mappings":"AAOA,YAAY,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACpG,OAAO,KAAK,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpG,UAAU,qBAAqB;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAElE;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CAMxE;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAWnF;AAMD,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,IAAI,CAAC,qBAAqB,EAAE,IAAI,GAAG,WAAW,CAAC,GACrD,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,qBAAqB,EAC5B,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1C,uBAAuB,CAUzB;AAED,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,qBAAqB,EACrE,KAAK,EAAE,CAAC,EACR,QAAQ,CAAC,EAAE,MAAM,GAChB,uBAAuB,CAAC,CAAC,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAYtD"}
|
|
@@ -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"]}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
export type { BufferedResponseStreamOptions, BufferedResponseStreamSink } from "./types.js";
|
|
2
2
|
import type { BufferedResponseStreamOptions, BufferedResponseStreamSink } from "./types.js";
|
|
3
|
+
export declare class OrderedResponseOperations {
|
|
4
|
+
private tail;
|
|
5
|
+
run(work: () => Promise<void>, onError?: (err: unknown) => Promise<void> | void): Promise<void>;
|
|
6
|
+
}
|
|
3
7
|
export declare class BufferedResponseStream {
|
|
4
8
|
private readonly minFlushIntervalMs;
|
|
5
9
|
private readonly minFlushChars;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../src/adapters/streaming.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,6BAA6B,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAC5F,OAAO,KAAK,EAAE,6BAA6B,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAE5F,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6B;IAClD,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAAK;IAExB,YAAY,IAAI,EAAE,0BAA0B,EAAE,OAAO,GAAE,6BAAkC,EAKxF;IAED,OAAO,IAAI,MAAM,CAEhB;IAED,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAG1B;IAEK,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAazC;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAI3B;IAEK,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO9C;CACF"}
|
|
1
|
+
{"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../src/adapters/streaming.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,6BAA6B,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAC5F,OAAO,KAAK,EAAE,6BAA6B,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAE5F,qBAAa,yBAAyB;IACpC,OAAO,CAAC,IAAI,CAAqB;IAEjC,GAAG,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAK9F;CACF;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6B;IAClD,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAAK;IAExB,YAAY,IAAI,EAAE,0BAA0B,EAAE,OAAO,GAAE,6BAAkC,EAKxF;IAED,OAAO,IAAI,MAAM,CAEhB;IAED,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAG1B;IAEK,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAazC;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAI3B;IAEK,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO9C;CACF"}
|
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
export class OrderedResponseOperations {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.tail = Promise.resolve();
|
|
4
|
+
}
|
|
5
|
+
run(work, onError) {
|
|
6
|
+
const operation = this.tail.then(work);
|
|
7
|
+
const handled = onError ? operation.catch(onError) : operation;
|
|
8
|
+
this.tail = handled.catch(() => undefined);
|
|
9
|
+
return handled;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
1
12
|
export class BufferedResponseStream {
|
|
2
13
|
constructor(sink, options = {}) {
|
|
3
14
|
this.text = "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../src/adapters/streaming.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,sBAAsB;IASjC,YAAY,IAAgC,EAAE,OAAO,GAAkC,EAAE;QAJjF,SAAI,GAAG,EAAE,CAAC;QACV,iBAAY,GAAG,CAAC,CAAC;QACjB,gBAAW,GAAG,CAAC,CAAC;QAGtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,GAAG,CAAC;QAC5D,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;QACjD,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACrC,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,IAAY;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa;QACxB,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;QACnB,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,CAAC;QAElC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;QAC9C,IACE,IAAI,CAAC,WAAW,KAAK,CAAC;YACtB,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,aAAa;YACvC,OAAO,IAAI,IAAI,CAAC,kBAAkB,EAClC,CAAC;YACD,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAkB;QAC7B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;CACF","sourcesContent":["export type { BufferedResponseStreamOptions, BufferedResponseStreamSink } from \"./types.js\";\nimport type { BufferedResponseStreamOptions, BufferedResponseStreamSink } from \"./types.js\";\n\nexport class BufferedResponseStream {\n private readonly minFlushIntervalMs: number;\n private readonly minFlushChars: number;\n private readonly now: () => number;\n private readonly sink: BufferedResponseStreamSink;\n private text = \"\";\n private pendingChars = 0;\n private lastFlushAt = 0;\n\n constructor(sink: BufferedResponseStreamSink, options: BufferedResponseStreamOptions = {}) {\n this.sink = sink;\n this.minFlushIntervalMs = options.minFlushIntervalMs ?? 750;\n this.minFlushChars = options.minFlushChars ?? 80;\n this.now = options.now ?? Date.now;\n }\n\n getText(): string {\n return this.text;\n }\n\n setText(text: string): void {\n this.text = text;\n this.pendingChars = 0;\n }\n\n async append(delta: string): Promise<void> {\n if (!delta) return;\n this.text += delta;\n this.pendingChars += delta.length;\n\n const elapsed = this.now() - this.lastFlushAt;\n if (\n this.lastFlushAt === 0 ||\n this.pendingChars >= this.minFlushChars ||\n elapsed >= this.minFlushIntervalMs\n ) {\n await this.flush();\n }\n }\n\n async flush(): Promise<void> {\n this.pendingChars = 0;\n this.lastFlushAt = this.now();\n await this.sink.flush(this.text);\n }\n\n async finish(finalText?: string): Promise<void> {\n if (finalText !== undefined) {\n this.text = finalText;\n }\n this.pendingChars = 0;\n this.lastFlushAt = this.now();\n await this.sink.finish(this.text);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../src/adapters/streaming.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,yBAAyB;IAAtC;QACU,SAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAQnC,CAAC;IANC,GAAG,CAAC,IAAyB,EAAE,OAAgD;QAC7E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/D,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3C,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAED,MAAM,OAAO,sBAAsB;IASjC,YAAY,IAAgC,EAAE,OAAO,GAAkC,EAAE;QAJjF,SAAI,GAAG,EAAE,CAAC;QACV,iBAAY,GAAG,CAAC,CAAC;QACjB,gBAAW,GAAG,CAAC,CAAC;QAGtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,GAAG,CAAC;QAC5D,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;QACjD,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACrC,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,IAAY;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa;QACxB,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;QACnB,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,CAAC;QAElC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;QAC9C,IACE,IAAI,CAAC,WAAW,KAAK,CAAC;YACtB,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,aAAa;YACvC,OAAO,IAAI,IAAI,CAAC,kBAAkB,EAClC,CAAC;YACD,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAkB;QAC7B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;CACF","sourcesContent":["export type { BufferedResponseStreamOptions, BufferedResponseStreamSink } from \"./types.js\";\nimport type { BufferedResponseStreamOptions, BufferedResponseStreamSink } from \"./types.js\";\n\nexport class OrderedResponseOperations {\n private tail = Promise.resolve();\n\n run(work: () => Promise<void>, onError?: (err: unknown) => Promise<void> | void): Promise<void> {\n const operation = this.tail.then(work);\n const handled = onError ? operation.catch(onError) : operation;\n this.tail = handled.catch(() => undefined);\n return handled;\n }\n}\n\nexport class BufferedResponseStream {\n private readonly minFlushIntervalMs: number;\n private readonly minFlushChars: number;\n private readonly now: () => number;\n private readonly sink: BufferedResponseStreamSink;\n private text = \"\";\n private pendingChars = 0;\n private lastFlushAt = 0;\n\n constructor(sink: BufferedResponseStreamSink, options: BufferedResponseStreamOptions = {}) {\n this.sink = sink;\n this.minFlushIntervalMs = options.minFlushIntervalMs ?? 750;\n this.minFlushChars = options.minFlushChars ?? 80;\n this.now = options.now ?? Date.now;\n }\n\n getText(): string {\n return this.text;\n }\n\n setText(text: string): void {\n this.text = text;\n this.pendingChars = 0;\n }\n\n async append(delta: string): Promise<void> {\n if (!delta) return;\n this.text += delta;\n this.pendingChars += delta.length;\n\n const elapsed = this.now() - this.lastFlushAt;\n if (\n this.lastFlushAt === 0 ||\n this.pendingChars >= this.minFlushChars ||\n elapsed >= this.minFlushIntervalMs\n ) {\n await this.flush();\n }\n }\n\n async flush(): Promise<void> {\n this.pendingChars = 0;\n this.lastFlushAt = this.now();\n await this.sink.flush(this.text);\n }\n\n async finish(finalText?: string): Promise<void> {\n if (finalText !== undefined) {\n this.text = finalText;\n }\n this.pendingChars = 0;\n this.lastFlushAt = this.now();\n await this.sink.finish(this.text);\n }\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;CA6F3B"}
|
|
@@ -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,33 +294,10 @@ 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)
|
|
@@ -325,7 +308,9 @@ export class TelegramMessagingBot {
|
|
|
325
308
|
const mc = ctx.message ? this.extractMessageContext(ctx.message) : null;
|
|
326
309
|
if (!mc)
|
|
327
310
|
return;
|
|
328
|
-
|
|
311
|
+
// The sandbox handler's grammar accepts /sandbox directly (manifest
|
|
312
|
+
// slash forms), so the user's spelling is logged and dispatched as-is.
|
|
313
|
+
const cleanedText = this.cleanText(mc.text);
|
|
329
314
|
const event = {
|
|
330
315
|
type: "command",
|
|
331
316
|
conversationId: mc.chatId,
|
|
@@ -358,25 +343,6 @@ export class TelegramMessagingBot {
|
|
|
358
343
|
return;
|
|
359
344
|
const cleanedText = this.cleanText(mc.text);
|
|
360
345
|
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
346
|
const isAutoReplyCandidate = mc.chatType !== "private" && !addressedToMessagingBot;
|
|
381
347
|
const eventBase = {
|
|
382
348
|
type: "message",
|
|
@@ -393,6 +359,11 @@ export class TelegramMessagingBot {
|
|
|
393
359
|
eventBase,
|
|
394
360
|
workingDir: this.workingDir,
|
|
395
361
|
isAutoReplyCandidate,
|
|
362
|
+
magicWord: {
|
|
363
|
+
addressed: addressedToMessagingBot || mc.chatType === "private",
|
|
364
|
+
scopeFallback: "always",
|
|
365
|
+
},
|
|
366
|
+
busyPolicy: "reject",
|
|
396
367
|
logEntryBase: {
|
|
397
368
|
date: new Date(mc.msg.date * 1000).toISOString(),
|
|
398
369
|
ts: mc.msgId,
|
|
@@ -409,12 +380,6 @@ export class TelegramMessagingBot {
|
|
|
409
380
|
handler: this.handler,
|
|
410
381
|
bot: this,
|
|
411
382
|
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
383
|
});
|
|
419
384
|
});
|
|
420
385
|
}
|