nathandenherder
06efbd231f
fix: resolve ChatStreamer import path and TypeScript narrowing issue
...
- Import ChatStreamer from @slack/web-api/dist/chat-stream.js (not re-exported from index)
- Fix TypeScript control flow narrowing for streamSession used in closure
2026-02-07 15:03:12 -05:00
nathandenherder
6945fbf100
feat(slack): add native text streaming support
...
Adds support for Slack's Agents & AI Apps text streaming APIs
(chat.startStream, chat.appendStream, chat.stopStream) to deliver
LLM responses as a single updating message instead of separate
messages per block.
Changes:
- New src/slack/streaming.ts with stream lifecycle helpers using
the SDK's ChatStreamer (client.chatStream())
- New 'streaming' config option on SlackAccountConfig
- Updated dispatch.ts to route block replies through the stream
when enabled, with graceful fallback to normal delivery
- Docs in docs/channels/slack.md covering setup and requirements
The streaming integration works by intercepting the deliver callback
in the reply dispatcher. When streaming is enabled and a thread
context exists, the first text delivery starts a stream, subsequent
deliveries append to it, and the stream is finalized after dispatch
completes. Media payloads and error cases fall back to normal
message delivery.
Refs:
- https://docs.slack.dev/ai/developing-ai-apps#streaming
- https://docs.slack.dev/reference/methods/chat.startStream
- https://docs.slack.dev/reference/methods/chat.appendStream
- https://docs.slack.dev/reference/methods/chat.stopStream
2026-02-07 15:03:12 -05:00
mudrii
5d82c82313
feat: per-channel responsePrefix override ( #9001 )
...
* feat: per-channel responsePrefix override
Add responsePrefix field to all channel config types and Zod schemas,
enabling per-channel and per-account outbound response prefix overrides.
Resolution cascade (most specific wins):
L1: channels.<ch>.accounts.<id>.responsePrefix
L2: channels.<ch>.responsePrefix
L3: (reserved for channels.defaults)
L4: messages.responsePrefix (existing global)
Semantics:
- undefined -> inherit from parent level
- empty string -> explicitly no prefix (stops cascade)
- "auto" -> derive [identity.name] from routed agent
Changes:
- Core logic: resolveResponsePrefix() in identity.ts accepts
optional channel/accountId and walks the cascade
- resolveEffectiveMessagesConfig() passes channel context through
- Types: responsePrefix added to WhatsApp, Telegram, Discord, Slack,
Signal, iMessage, Google Chat, MS Teams, Feishu, BlueBubbles configs
- Zod schemas: responsePrefix added for config validation
- All channel handlers wired: telegram, discord, slack, signal,
imessage, line, heartbeat runner, route-reply, native commands
- 23 new tests covering backward compat, channel/account levels,
full cascade, auto keyword, empty string stops, unknown fallthrough
Fully backward compatible - no existing config is affected.
Fixes #8857
* fix: address CI lint + review feedback
- Replace Record<string, any> with proper typed helpers (no-explicit-any)
- Add curly braces to single-line if returns (eslint curly)
- Fix JSDoc: 'Per-channel' → 'channel/account' on shared config types
- Extract getChannelConfig() helper for type-safe dynamic key access
* fix: finish responsePrefix overrides (#9001 ) (thanks @mudrii)
* fix: normalize prefix wiring and types (#9001 ) (thanks @mudrii)
---------
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
2026-02-04 16:16:34 -05:00
Peter Steinberger
35eb40a700
fix(security): separate untrusted channel metadata from system prompt (thanks @KonstantinMirin)
2026-02-03 23:02:45 -08:00
cpojer
935a0e5708
chore: Enable typescript/no-explicit-any rule.
2026-02-02 16:18:09 +09:00
cpojer
f06dd8df06
chore: Enable "experimentalSortImports" in Oxfmt and reformat all imorts.
2026-02-01 10:03:47 +09:00
cpojer
5ceff756e1
chore: Enable "curly" rule to avoid single-statement if confusion/errors.
2026-01-31 16:19:20 +09:00
Peter Steinberger
9a7160786a
refactor: rename to openclaw
2026-01-30 03:16:21 +01:00
Peter Steinberger
6d16a658e5
refactor: rename clawdbot to moltbot with legacy compat
2026-01-27 12:21:02 +00:00
Shadow
7e4e24445e
Slack: clear ack reaction after streaming replies ( #2044 )
...
Co-authored-by: Shaurya Pratap Singh <fancyboi999@users.noreply.github.com>
2026-01-25 21:28:46 -06:00
Peter Steinberger
4b6cdd1d3c
fix: normalize session keys and outbound mirroring
2026-01-24 11:57:11 +00:00
Peter Steinberger
d905ca0e02
fix: enforce explicit mention gating across channels
2026-01-24 11:09:33 +00:00
Peter Steinberger
bf4544784a
fix: stabilize typing + summary merge
2026-01-23 23:34:30 +00:00
Peter Steinberger
aeb6b2ffad
refactor: standardize channel logging
2026-01-23 23:34:30 +00:00
Peter Steinberger
1113f17d4c
refactor: share reply prefix context
2026-01-23 23:34:30 +00:00
Peter Steinberger
8252ae2da1
refactor: unify typing callbacks
2026-01-23 23:33:32 +00:00
Peter Steinberger
d82ecaf9dc
refactor: centralize inbound session updates
2026-01-23 23:33:32 +00:00
Peter Steinberger
521ea4ae5b
refactor: unify pending history helpers
2026-01-23 23:33:32 +00:00
Peter Steinberger
cb8c8fee9a
refactor: centralize ack reaction removal
2026-01-23 23:32:14 +00:00
Peter Steinberger
2e0a835e07
fix: unify inbound dispatch pipeline
2026-01-23 22:58:54 +00:00
Peter Steinberger
02bd6e4a24
refactor: centralize ack reaction gating
2026-01-23 22:24:31 +00:00
Travis Irby
578ac9f1a9
hydrate files from thread root message on replies
...
When replying to a Slack thread, files attached to the root message were
not being fetched. The existing `resolveSlackThreadStarter()` fetched the
root message text via `conversations.replies` but ignored the `files[]`
array in the response.
Changes:
- Add `files` to `SlackThreadStarter` type and extract from API response
- Download thread starter files when the reply message has no attachments
- Add verbose log for thread starter file hydration
Fixes issue where asking about a PDF in a thread reply would fail because
the model never received the file content from the root message.
2026-01-23 05:10:36 +00:00
Peter Steinberger
45c1ccdfcf
refactor: unify threading contexts
2026-01-21 20:35:12 +00:00
Peter Steinberger
88d76d4be5
refactor(channels): centralize match metadata
2026-01-21 18:21:19 +00:00
Peter Steinberger
65dd73b4c3
fix: clean up slack threading landings ( #1360 ) (thanks @SocialNerd42069)
2026-01-21 06:29:36 +00:00
SocialNerd42069
0d6e78b718
fix(slack): respect verbose setting and preserve thread context for tool notifications
...
Fixes two bugs in Slack tool notification delivery:
1. Tool notifications ignored verbose=false - normalized verbose values so
boolean false/'false' are properly treated as 'off'
2. Thread context lost - Slack outbound adapter now falls back to threadId
when replyToId is missing, and MessageThreadId is set for thread replies
Closes #1333
2026-01-21 06:29:36 +00:00
Peter Steinberger
02ca148583
fix: preserve subagent thread routing ( #1241 )
...
Thanks @gnarco.
Co-authored-by: gnarco <gnarco@users.noreply.github.com>
2026-01-20 17:22:07 +00:00
Peter Steinberger
690bb192e6
style: format code
2026-01-18 19:36:46 +00:00
Peter Steinberger
744d1329cb
feat: make inbound envelopes configurable
...
Co-authored-by: Shiva Prasad <shiv19@users.noreply.github.com>
2026-01-18 18:50:37 +00:00
Peter Steinberger
0d9172d761
fix: persist session origin metadata
2026-01-18 03:41:51 +00:00
Peter Steinberger
34590d2144
feat: persist session origin metadata across connectors
2026-01-18 02:42:10 +00:00
Peter Steinberger
f73dbdbaea
refactor: unify channel config matching and gating
...
Co-authored-by: thewilloftheshadow <thewilloftheshadow@users.noreply.github.com>
2026-01-18 01:24:00 +00:00
Peter Steinberger
a5aa48beea
feat: add dm allowlist match metadata logs
...
Co-authored-by: thewilloftheshadow <thewilloftheshadow@users.noreply.github.com>
2026-01-18 00:14:44 +00:00
Peter Steinberger
6b784a9771
style: oxfmt
2026-01-17 10:26:08 +00:00
Peter Steinberger
69ba2765de
refactor(security): harden CommandAuthorized plumbing
2026-01-17 10:19:34 +00:00
Peter Steinberger
1f3a09b43b
fix: persist deliveryContext on last-route updates
...
Co-authored-by: Adam Holt <mail@adamholt.co.nz>
2026-01-17 06:54:31 +00:00
Peter Steinberger
6a3ed5c850
fix(security): gate slash/control commands
2026-01-17 06:49:34 +00:00
Peter Steinberger
37a2eee837
refactor: drop legacy session store keys
2026-01-17 06:48:44 +00:00
Peter Steinberger
e59d8c5436
style: oxfmt format
2026-01-17 05:48:56 +00:00
Peter Steinberger
a624878973
fix(security): gate slash commands by sender
2026-01-17 05:25:42 +00:00
Peter Steinberger
f7089cde54
fix: unify inbound sender labels
2026-01-17 05:21:09 +00:00
Peter Steinberger
bc49c20434
fix: finalize inbound contexts
2026-01-17 05:06:39 +00:00
Peter Steinberger
a2b5b1f0cb
refactor: normalize inbound context
2026-01-17 04:05:33 +00:00
Peter Steinberger
3af391eec7
refactor: centralize group sender identity
2026-01-17 03:32:48 +00:00
Peter Steinberger
e31251293b
fix: scope history injection to pending-only
2026-01-16 23:52:42 +00:00
Peter Steinberger
76d3d58b5c
chore: oxfmt
2026-01-16 22:33:47 +00:00
Peter Steinberger
05d149a49b
fix: treat reply-to-bot as implicit mention across channels
2026-01-16 21:51:01 +00:00
Peter Steinberger
c269d5f258
fix: isolate Slack thread sessions ( #758 )
2026-01-15 08:11:03 +00:00
Peter Steinberger
f3519d895c
fix: normalize slack channel types for sessions
2026-01-15 08:00:20 +00:00
Sebastian
113eea5047
fix: mutate prefixContext object instead of reassigning for closure correctness
2026-01-14 23:20:19 -05:00