Commit Graph

93 Commits

Author SHA1 Message Date
Sebastian
19f17a7d1d fix: mutate prefixContext object instead of reassigning for closure correctness 2026-01-14 23:20:19 -05:00
Sebastian
db6c386825 feat: add dynamic template variables to messages.responsePrefix (#923)
Adds support for template variables in `messages.responsePrefix` that
resolve dynamically at runtime with the actual model used (including
after fallback).

Supported variables (case-insensitive):
- {model} - short model name (e.g., "claude-opus-4-5", "gpt-4o")
- {modelFull} - full model identifier (e.g., "anthropic/claude-opus-4-5")
- {provider} - provider name (e.g., "anthropic", "openai")
- {thinkingLevel} or {think} - thinking level ("high", "low", "off")
- {identity.name} or {identityName} - agent identity name

Example: "[{model} | think:{thinkingLevel}]" → "[claude-opus-4-5 | think:high]"

Variables show the actual model used after fallback, not the intended
model. Unresolved variables remain as literal text.

Implementation:
- New module: src/auto-reply/reply/response-prefix-template.ts
- Template interpolation in normalize-reply.ts via context provider
- onModelSelected callback in agent-runner-execution.ts
- Updated all 6 provider message handlers (web, signal, discord,
  telegram, slack, imessage)
- 27 unit tests covering all variables and edge cases
- Documentation in docs/gateway/configuration.md and JSDoc

Fixes #923
2026-01-14 23:05:08 -05:00
Peter Steinberger
d66bcad528 style(slack): satisfy oxfmt (#850) 2026-01-15 02:23:22 +00:00
Jonathan Wilkins
bdbf8b5ceb fix(slack): respect top-level requireMention config
The `channels.slack.requireMention` setting was defined in the schema
but never passed to `resolveSlackChannelConfig()`, which always
defaulted to `true`. This meant setting `requireMention: false` at the
top level had no effect—channels still required mentions.

Pass `slackCfg.requireMention` as `defaultRequireMention` to the
resolver and use it as the fallback instead of hardcoded `true`.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 02:17:27 +00:00
Peter Steinberger
77b165e7a9 feat(config): gate channel config writes 2026-01-15 01:41:15 +00:00
Peter Steinberger
4fe6b626aa fix: preserve markdown code fences 2026-01-15 00:31:07 +00:00
Peter Steinberger
a3ebd00681 refactor: unify markdown formatting pipeline 2026-01-15 00:31:07 +00:00
Peter Steinberger
a287d11771 fix(slack): drop mismatched Socket Mode events (#889)
Filter Slack Socket Mode events by api_app_id/team_id.
Refs: #828
Contributor: @roshanasingh4

Co-authored-by: Roshan Singh <roshanasingh4@users.noreply.github.com>
2026-01-14 15:54:37 +00:00
Peter Steinberger
9d28441c41 chore: migrate to oxlint and oxfmt
Co-authored-by: Christoph Nakazawa <christoph.pojer@gmail.com>
2026-01-14 15:02:19 +00:00
Peter Steinberger
ec219ea248 test(slack): rename split suites 2026-01-14 05:40:55 +00:00
Peter Steinberger
b74a102af7 refactor(src): split oversized modules 2026-01-14 01:17:56 +00:00
Peter Steinberger
ea979f0669 refactor!: rename chat providers to channels 2026-01-13 08:40:39 +00:00
Shadow
63502cd317 Slack: accept slash command names with or without leading slash
Closes #798
2026-01-12 21:27:04 -06:00
Peter Steinberger
9be1b4ca45 refactor: reuse dispatcher helper for native commands 2026-01-13 01:07:59 +00:00
Peter Steinberger
78cca26a6a fix: stream native slash tool replies 2026-01-13 00:53:30 +00:00
Peter Steinberger
da98db9a03 fix: align discord autoThread config types 2026-01-13 00:22:42 +00:00
Peter Steinberger
bbd5303be2 refactor: streamline thread reply planning 2026-01-13 00:15:29 +00:00
Peter Steinberger
4e488e9742 fix: align reply threading refs 2026-01-12 23:41:40 +00:00
Peter Steinberger
1a5e77073a docs: clarify sandbox bind mounts (#790) 2026-01-12 22:06:35 +00:00
Peter Steinberger
34318a28bc feat: auto native commands defaults 2026-01-12 21:49:44 +00:00
Peter Steinberger
0f2687c61f fix: default groupPolicy to open 2026-01-12 08:55:02 +00:00
Peter Steinberger
2bb8e0d369 test: align group policy defaults 2026-01-12 08:45:57 +00:00
Peter Steinberger
b6583cd14c fix: default groupPolicy to allowlist 2026-01-12 08:22:01 +00:00
Peter Steinberger
3e2b22c0a8 feat: improve gateway services and auto-reply commands 2026-01-11 02:27:16 +01:00
Peter Steinberger
48b6145088 fix: dedupe inbound messages across providers 2026-01-11 00:12:25 +01:00
Peter Steinberger
7b00acb144 refactor: centralize history context wrapping 2026-01-10 19:16:26 +01:00
Peter Steinberger
92caa192e9 chore: fix lint and typing 2026-01-10 19:16:25 +01:00
Peter Steinberger
263556e6e6 feat: unify provider history context 2026-01-10 19:16:25 +01:00
Lloyd
f0fe89439a feat(agent): add human-like delay between block replies
Adds `agent.humanDelay` config option to create natural rhythm between
streamed message bubbles. When enabled, introduces a random delay
(default 800-2500ms) between block replies, making multi-message
responses feel more like natural human texting.

Config example:
```json
{
  "agent": {
    "blockStreamingDefault": "on",
    "humanDelay": {
      "enabled": true,
      "minMs": 800,
      "maxMs": 2500
    }
  }
}
```

- First message sends immediately
- Subsequent messages wait a random delay before sending
- Works with iMessage, Signal, and Discord providers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-10 17:12:50 +01:00
Peter Steinberger
3d03e7acb4 test: stabilize gateway mock + lint 2026-01-10 03:14:13 +00:00
Peter Steinberger
234a828ec1 fix: relax fetch typing for Bun 2026-01-10 04:01:06 +01:00
Peter Steinberger
a5cb1a71b1 refactor: unify inline directives and media fetch 2026-01-10 03:01:04 +01:00
Peter Steinberger
43ca0e19b3 fix: remove ack reactions after reply (#633) (thanks @levifig) 2026-01-10 02:14:14 +01:00
Levi Figueira
d4b6af8d71 feat: add removeAckAfterReply option for Discord, Slack, and Telegram
Add `messages.removeAckAfterReply` config option to automatically remove
acknowledgment reactions after the bot sends a reply, reducing visual
clutter while still providing immediate feedback.

Platforms: Discord, Slack, Telegram

Implementation:
- Added removeAckAfterReply boolean field to MessagesConfig (default: false)
- Track ack reaction state in all three platform handlers
- Remove ack reaction after successful reply delivery
- Graceful error handling with verbose logging

Platform-specific:
- Discord: uses removeReactionDiscord()
- Slack: uses removeSlackReaction()
- Telegram: uses setMessageReaction() with empty array

Closes #627
2026-01-10 02:13:46 +01:00
Peter Steinberger
399d629add fix: filter NO_REPLY prefixes 2026-01-09 23:29:05 +00:00
Peter Steinberger
7bd3bf6bd6 refactor: normalize main session key handling 2026-01-09 22:30:15 +01:00
Peter Steinberger
2a9d689d80 fix(slack): mrkdwn + thread edge cases (#464) (thanks @austinm911) 2026-01-09 22:09:02 +01:00
Austin Mudd
c1cc07d4db Slack: add mrkdwn formatter for proper bold/italic/strikethrough rendering 2026-01-09 21:59:51 +01:00
Austin Mudd
ccce7cac8a fix: resolve merge conflicts and fix threading tests
- Update MessageToolOptions type to include Slack threading options
- Remove duplicate threadTs property in slack/actions.ts
- Fix replyThreadTs parameter name in monitor.ts
- Update test to correctly verify 'first' mode threading behavior:
  - 'off' mode: no threading unless already in a thread
  - 'first' mode: first reply starts a thread
- Add new test case for 'first' mode threading
2026-01-09 21:59:51 +01:00
Austin Mudd
680d8eca9d Slack: implement replyToMode threading for tool path
- Add shared hasRepliedRef state between auto-reply and tool paths
- Extract buildSlackThreadingContext helper in agent-runner.ts
- Extract resolveThreadTsFromContext helper in slack-actions.ts
- Update docs with clear replyToMode table (off/first/all)
- Add tests for first mode behavior across multiple messages
2026-01-09 21:59:51 +01:00
Austin Mudd
7ccc4ed43c Slack: expose threadTs in agent sendMessage tool for thread replies 2026-01-09 21:59:27 +01:00
Peter Steinberger
1f8e4790b5 fix(messages): restore explicit responsePrefix default 2026-01-09 19:18:34 +00:00
Jake
c289c9afc1 Config: add support for per-provider blockStreaming override 2026-01-09 18:11:27 +00:00
Peter Steinberger
a6437f084f refactor: centralize slack threading helpers 2026-01-09 16:01:53 +00:00
Peter Steinberger
7ac0229fa0 refactor(messages): centralize per-agent prefixes 2026-01-09 16:54:54 +01:00
Peter Steinberger
89d982e12c Merge pull request #578 from p6l-richard/feature/identity-based-message-prefix
fix(messages): derive messagePrefix from identity.name
2026-01-09 15:40:52 +00:00
Peter Steinberger
06411d0fdc fix: derive prefixes from routed identity (#578) (thanks @p6l-richard) 2026-01-09 16:39:32 +01:00
Peter Steinberger
aefaa86cf5 fix: honor slack reply threading (#574, thanks @bolismauro) 2026-01-09 15:38:43 +00:00
Mauro Bolis
9352c0e781 fix: honor slack reply threading 2026-01-09 15:35:54 +00:00
Peter Steinberger
947844117c feat: wire multi-agent config and routing
Co-authored-by: Mark Pors <1078320+pors@users.noreply.github.com>
2026-01-09 12:48:42 +00:00