Peter Steinberger
fd768334a9
refactor: fast-lane directives helpers
2026-01-12 22:34:13 +00:00
Peter Steinberger
27d940f5b6
refactor: reuse streaming text normalizer across callbacks
2026-01-12 22:27:56 +00:00
Peter Steinberger
7ba72aeb6c
fix: make pw download tests platform-safe
2026-01-12 22:27:19 +00:00
Peter Steinberger
29b7b2068a
refactor: centralize streaming text normalization
2026-01-12 22:17:14 +00:00
Peter Steinberger
f4ab057807
fix: start typing on partial deltas
2026-01-12 22:16:29 +00:00
Peter Steinberger
99fea64823
fix: fast-lane directives bypass queue dedupe
2026-01-12 21:44:19 +00:00
Peter Steinberger
490cb834e5
style: italicize reasoning output
2026-01-12 21:24:36 +00:00
Peter Steinberger
7dc44b04c1
fix: close memory index and refresh protocol outputs
2026-01-12 18:49:24 +00:00
Peter Steinberger
ffbcd83d1e
chore: log elevated and reasoning toggles
2026-01-12 18:37:44 +00:00
Peter Steinberger
60823fd9bd
feat(model): fuzzy /model matching
2026-01-12 07:57:53 +00:00
Peter Steinberger
e1150f1b93
test: expand memory flush coverage
2026-01-12 07:42:03 +00:00
Peter Steinberger
097e66391f
fix(auto-reply): show config models in /model
2026-01-12 07:31:20 +00:00
Peter Steinberger
5b44825cb3
fix: skip memory flush on read-only workspace
2026-01-12 06:33:27 +00:00
Peter Steinberger
1ffb0fe787
fix: handle inline status for allowlisted senders
2026-01-12 06:33:27 +00:00
Peter Steinberger
0f257f792a
fix: fast-path slash commands
2026-01-12 06:10:17 +00:00
Peter Steinberger
2da2057a37
feat(model): add /model picker
2026-01-12 06:02:39 +00:00
Peter Steinberger
7dbb21be8e
feat: add pre-compaction memory flush
2026-01-12 05:29:18 +00:00
The Admiral
c64bcd047b
fix: flush block reply coalescer on tool boundaries
...
When block streaming is enabled with verbose=off, tool blocks are hidden
but their boundary information was lost. Text segments before and after
tool execution would get coalesced into a single message because the
coalescer had no signal that a tool had executed between them.
This adds an onBlockReplyFlush callback that fires on tool_execution_start,
allowing the block reply pipeline to flush pending text before the tool
runs. This preserves natural message boundaries even when tools are hidden.
Fixes the issue where:
text → [hidden tool] → text → rendered as one merged message
Now correctly renders as:
text → [hidden tool] → text → two separate messages
Co-diagnosed-by: Krill (Discord assistant)
2026-01-12 02:52:48 +00:00
Peter Steinberger
9c8967ef5d
style: biome fixes
2026-01-12 00:32:47 +00:00
Peter Steinberger
67743325ee
fix: reset session after compaction overflow
2026-01-12 00:28:16 +00:00
Peter Steinberger
7acd26a2fc
Move provider to a plugin-architecture ( #661 )
...
* refactor: introduce provider plugin registry
* refactor: move provider CLI to plugins
* docs: add provider plugin implementation notes
* refactor: shift provider runtime logic into plugins
* refactor: add plugin defaults and summaries
* docs: update provider plugin notes
* feat(commands): add /commands slash list
* Auto-reply: tidy help message
* Auto-reply: fix status command lint
* Tests: align google shared expectations
* Auto-reply: tidy help message
* Auto-reply: fix status command lint
* refactor: move provider routing into plugins
* test: align agent routing expectations
* docs: update provider plugin notes
* refactor: route replies via provider plugins
* docs: note route-reply plugin hooks
* refactor: extend provider plugin contract
* refactor: derive provider status from plugins
* refactor: unify gateway provider control
* refactor: use plugin metadata in auto-reply
* fix: parenthesize cron target selection
* refactor: derive gateway methods from plugins
* refactor: generalize provider logout
* refactor: route provider logout through plugins
* refactor: move WhatsApp web login methods into plugin
* refactor: generalize provider log prefixes
* refactor: centralize default chat provider
* refactor: derive provider lists from registry
* refactor: move provider reload noops into plugins
* refactor: resolve web login provider via alias
* refactor: derive CLI provider options from plugins
* refactor: derive prompt provider list from plugins
* style: apply biome lint fixes
* fix: resolve provider routing edge cases
* docs: update provider plugin refactor notes
* fix(gateway): harden agent provider routing
* refactor: move provider routing into plugins
* refactor: move provider CLI to plugins
* refactor: derive provider lists from registry
* fix: restore slash command parsing
* refactor: align provider ids for schema
* refactor: unify outbound target resolution
* fix: keep outbound labels stable
* feat: add msteams to cron surfaces
* fix: clean up lint build issues
* refactor: localize chat provider alias normalization
* refactor: drive gateway provider lists from plugins
* docs: update provider plugin notes
* style: format message-provider
* fix: avoid provider registry init cycles
* style: sort message-provider imports
* fix: relax provider alias map typing
* refactor: move provider routing into plugins
* refactor: add plugin pairing/config adapters
* refactor: route pairing and provider removal via plugins
* refactor: align auto-reply provider typing
* test: stabilize telegram media mocks
* docs: update provider plugin refactor notes
* refactor: pluginize outbound targets
* refactor: pluginize provider selection
* refactor: generalize text chunk limits
* docs: update provider plugin notes
* refactor: generalize group session/config
* fix: normalize provider id for room detection
* fix: avoid provider init in system prompt
* style: formatting cleanup
* refactor: normalize agent delivery targets
* test: update outbound delivery labels
* chore: fix lint regressions
* refactor: extend provider plugin adapters
* refactor: move elevated/block streaming defaults to plugins
* refactor: defer outbound send deps to plugins
* docs: note plugin-driven streaming/elevated defaults
* refactor: centralize webchat provider constant
* refactor: add provider setup adapters
* refactor: delegate provider add config to plugins
* docs: document plugin-driven provider add
* refactor: add plugin state/binding metadata
* refactor: build agent provider status from plugins
* docs: note plugin-driven agent bindings
* refactor: centralize internal provider constant usage
* fix: normalize WhatsApp targets for groups and E.164 (#631 ) (thanks @imfing)
* refactor: centralize default chat provider
* refactor: centralize WhatsApp target normalization
* refactor: move provider routing into plugins
* refactor: normalize agent delivery targets
* chore: fix lint regressions
* fix: normalize WhatsApp targets for groups and E.164 (#631 ) (thanks @imfing)
* feat: expand provider plugin adapters
* refactor: route auto-reply via provider plugins
* fix: align WhatsApp target normalization
* fix: normalize WhatsApp targets for groups and E.164 (#631 ) (thanks @imfing)
* refactor: centralize WhatsApp target normalization
* feat: add /config chat config updates
* docs: add /config get alias
* feat(commands): add /commands slash list
* refactor: centralize default chat provider
* style: apply biome lint fixes
* chore: fix lint regressions
* fix: clean up whatsapp allowlist typing
* style: format config command helpers
* refactor: pluginize tool threading context
* refactor: normalize session announce targets
* docs: note new plugin threading and announce hooks
* refactor: pluginize message actions
* docs: update provider plugin actions notes
* fix: align provider action adapters
* refactor: centralize webchat checks
* style: format message provider helpers
* refactor: move provider onboarding into adapters
* docs: note onboarding provider adapters
* feat: add msteams onboarding adapter
* style: organize onboarding imports
* fix: normalize msteams allowFrom types
* feat: add plugin text chunk limits
* refactor: use plugin chunk limit fallbacks
* feat: add provider mention stripping hooks
* style: organize provider plugin type imports
* refactor: generalize health snapshots
* refactor: update macOS health snapshot handling
* docs: refresh health snapshot notes
* style: format health snapshot updates
* refactor: drive security warnings via plugins
* docs: note provider security adapter
* style: format provider security adapters
* refactor: centralize provider account defaults
* refactor: type gateway client identity constants
* chore: regen gateway protocol swift
* fix: degrade health on failed provider probe
* refactor: centralize pairing approve hint
* docs: add plugin CLI command references
* refactor: route auth and tool sends through plugins
* docs: expand provider plugin hooks
* refactor: document provider docking touchpoints
* refactor: normalize internal provider defaults
* refactor: streamline outbound delivery wiring
* refactor: make provider onboarding plugin-owned
* refactor: support provider-owned agent tools
* refactor: move telegram draft chunking into telegram module
* refactor: infer provider tool sends via extractToolSend
* fix: repair plugin onboarding imports
* refactor: de-dup outbound target normalization
* style: tidy plugin and agent imports
* refactor: data-drive provider selection line
* fix: satisfy lint after provider plugin rebase
* test: deflake gateway-cli coverage
* style: format gateway-cli coverage test
* refactor(provider-plugins): simplify provider ids
* test(pairing-cli): avoid provider-specific ternary
* style(macos): swiftformat HealthStore
* refactor(sandbox): derive provider tool denylist
* fix(sandbox): avoid plugin init in defaults
* refactor(provider-plugins): centralize provider aliases
* style(test): satisfy biome
* refactor(protocol): v3 providers.status maps
* refactor(ui): adapt to protocol v3
* refactor(macos): adapt to protocol v3
* test: update providers.status v3 fixtures
* refactor(gateway): map provider runtime snapshot
* test(gateway): update reload runtime snapshot
* refactor(whatsapp): normalize heartbeat provider id
* docs(refactor): update provider plugin notes
* style: satisfy biome after rebase
* fix: describe sandboxed elevated in prompt
* feat(gateway): add agent image attachments + live probe
* refactor: derive CLI provider options from plugins
* fix(gateway): harden agent provider routing
* fix(gateway): harden agent provider routing
* refactor: align provider ids for schema
* fix(protocol): keep agent provider string
* fix(gateway): harden agent provider routing
* fix(protocol): keep agent provider string
* refactor: normalize agent delivery targets
* refactor: support provider-owned agent tools
* refactor(config): provider-keyed elevated allowFrom
* style: satisfy biome
* fix(gateway): appease provider narrowing
* style: satisfy biome
* refactor(reply): move group intro hints into plugin
* fix(reply): avoid plugin registry init cycle
* refactor(providers): add lightweight provider dock
* refactor(gateway): use typed client id in connect
* refactor(providers): document docks and avoid init cycles
* refactor(providers): make media limit helper generic
* fix(providers): break plugin registry import cycles
* style: satisfy biome
* refactor(status-all): build providers table from plugins
* refactor(gateway): delegate web login to provider plugin
* refactor(provider): drop web alias
* refactor(provider): lazy-load monitors
* style: satisfy lint/format
* style: format status-all providers table
* style: swiftformat gateway discovery model
* test: make reload plan plugin-driven
* fix: avoid token stringification in status-all
* refactor: make provider IDs explicit in status
* feat: warn on signal/imessage provider runtime errors
* test: cover gateway provider runtime warnings in status
* fix: add runtime kind to provider status issues
* test: cover health degradation on probe failure
* fix: keep routeReply lightweight
* style: organize routeReply imports
* refactor(web): extract auth-store helpers
* refactor(whatsapp): lazy login imports
* refactor(outbound): route replies via plugin outbound
* docs: update provider plugin notes
* style: format provider status issues
* fix: make sandbox scope warning wrap-safe
* refactor: load outbound adapters from provider plugins
* docs: update provider plugin outbound notes
* style(macos): fix swiftformat lint
* docs: changelog for provider plugins
* fix(macos): satisfy swiftformat
* fix(macos): open settings via menu action
* style: format after rebase
* fix(macos): open Settings via menu action
---------
Co-authored-by: LK <luke@kyohere.com>
Co-authored-by: Luke K (pr-0f3t) <2609441+lc0rp@users.noreply.github.com>
Co-authored-by: Xin <xin@imfing.com>
2026-01-11 11:45:25 +00:00
Peter Steinberger
a3747b1ee3
fix: add compaction headroom for memory writes
2026-01-11 11:25:15 +00:00
Peter Steinberger
76c5bff7d6
test: cover whoami command
2026-01-11 04:20:34 +01:00
Peter Steinberger
36a21ae9b0
fix: improve telegram configuration safety
2026-01-11 03:57:52 +01:00
Anton Sotkov
7a518166bb
fix: persist reasoning across session resets
2026-01-11 03:51:51 +01:00
Peter Steinberger
2d74119a08
test: cover auto-reply command gating
2026-01-11 02:27:16 +01:00
Peter Steinberger
e0bf86f06c
feat: improve gateway services and auto-reply commands
2026-01-11 02:27:16 +01:00
Peter Steinberger
d8f1124d59
feat: add CLI backend fallback
2026-01-11 00:55:22 +00:00
Peter Steinberger
7c76561569
fix: dedupe inbound messages across providers
2026-01-11 00:12:25 +01:00
Peter Steinberger
686b3f884c
fix: expose WhatsApp sender ids in group context
2026-01-10 21:09:08 +01:00
Peter Steinberger
cf192f8551
style: biome format
2026-01-10 19:47:17 +00:00
Peter Steinberger
9f9098406c
feat(sandbox): add sandbox explain inspector
2026-01-10 20:28:43 +01:00
Peter Steinberger
82f71d25e5
refactor: centralize history context wrapping
2026-01-10 19:16:26 +01:00
Peter Steinberger
b977ae19af
chore: fix lint and typing
2026-01-10 19:16:25 +01:00
Peter Steinberger
d41372b9d9
feat: unify provider history context
2026-01-10 19:16:25 +01:00
Peter Steinberger
6480ef369f
fix: telegram draft chunking defaults ( #667 ) (thanks @rubyrunsstuff)
2026-01-10 18:30:06 +01:00
Peter Steinberger
a54706a063
fix: throttle cli credential sync
2026-01-10 17:44:03 +01:00
Peter Steinberger
e3cd431551
fix(auto-reply): RawBody commands + locked session updates ( #643 )
2026-01-10 17:32:31 +01:00
Peter Steinberger
fb03149df4
fix: finalize human delay config typing ( #446 ) (thanks @tony-freedomology)
2026-01-10 17:15:27 +01:00
Lloyd
ab994d2c63
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
b99eb4c9f3
fix(auto-reply): apply native commands to target session
2026-01-10 16:48:53 +01:00
Peter Steinberger
70c1732dd1
refactor: centralize messaging dedupe helpers
2026-01-10 16:02:56 +01:00
Peter Steinberger
66db6c749d
fix: persist elevated off override
2026-01-10 05:23:46 +01:00
Peter Steinberger
34664601e0
fix(auto-reply): default audioAsVoice to false
2026-01-10 02:25:19 +00:00
Peter Steinberger
003cda73e8
style: fix biome formatting
2026-01-10 02:11:43 +00:00
Peter Steinberger
afe6f182ca
feat: show effective config in /debug
2026-01-10 03:10:14 +01:00
Peter Steinberger
5a6ae2624e
docs: add /config get alias
2026-01-10 03:10:14 +01:00
Peter Steinberger
8b579c91a5
feat: add /config chat config updates
2026-01-10 03:01:27 +01:00
Peter Steinberger
f28a4a34ad
refactor: unify inline directives and media fetch
2026-01-10 03:01:04 +01:00
Peter Steinberger
4075895c4c
refactor: consolidate reply/media helpers
2026-01-10 02:41:16 +01:00
Peter Steinberger
a29f5dda2e
test(live): gateway smoke across profile-key models
2026-01-10 01:09:41 +00:00
Peter Steinberger
623d1e11f1
refactor: centralize session agent resolution
2026-01-10 01:57:54 +01:00
Peter Steinberger
f4b3869f45
Merge pull request #490 from jarvis-medmatic/feat/audio-as-voice-tag
...
feat(telegram): `[[audio_as_voice]]` tag support
2026-01-10 00:52:02 +00:00
Peter Steinberger
c56b2f4bc1
fix: honor audio_as_voice streaming + parse tests ( #490 ) (thanks @jarvis-medmatic)
2026-01-10 01:50:33 +01:00
Peter Steinberger
cb10682d3e
fix(openai): avoid invalid reasoning replay
2026-01-10 00:45:10 +00:00
Jarvis
5fedfd8d15
chore: format audioAsVoice updates
...
Co-authored-by: Manuel Hettich <17690367+ManuelHettich@users.noreply.github.com>
2026-01-10 01:44:57 +01:00
Jarvis
05a99aa49b
feat(telegram): buffer audio blocks for [[audio_as_voice]] tag support
...
- Add [[audio_as_voice]] detection to splitMediaFromOutput()
- Pass audioAsVoice through onBlockReply callback chain
- Buffer audio blocks during streaming, flush at end with correct flag
- Non-audio media still streams immediately
- Fix: emit payloads with audioAsVoice flag even if text is empty
Co-authored-by: Manuel Hettich <17690367+ManuelHettich@users.noreply.github.com>
2026-01-10 01:41:18 +01:00
Peter Steinberger
5898304fa0
fix: abort runs between tool calls
2026-01-10 01:26:25 +01:00
Peter Steinberger
1fd7a6e310
fix: keep telegram streamMode draft-only ( #619 ) (thanks @rubyrunsstuff)
2026-01-10 01:14:40 +01:00
Ruby
b4fbf2fe0d
fix: enable block streaming for Telegram when streamMode is 'block'
...
- Fix disableBlockStreaming logic in telegram/bot.ts to properly enable
block streaming when telegram.streamMode is 'block' regardless of
blockStreamingDefault setting
- Set minChars default to 1 for Telegram block mode so chunks send
immediately on newlines/sentences instead of waiting for 800 chars
- Skip coalescing for Telegram block mode when not explicitly configured
to reduce chunk batching delays
- Fix newline preference to wait for actual newlines instead of breaking
on any whitespace when buffer is under maxChars
Fixes issue where all Telegram messages were batched into one message
at the end instead of streaming as separate messages during generation.
2026-01-10 01:11:41 +01:00
Peter Steinberger
097550c299
fix: centralize verbose overrides and tool stream gating
2026-01-10 00:52:24 +01:00
Peter Steinberger
96e17d407a
fix: filter NO_REPLY prefixes
2026-01-09 23:29:05 +00:00
Peter Steinberger
a9a70ea278
fix: persist verbose off and gate tool stream
2026-01-10 00:22:28 +01:00
Peter Steinberger
79af03ba5e
fix(auto-reply): tighten block streaming defaults
2026-01-09 22:41:10 +01:00
Peter Steinberger
53f51786f2
fix: default block streaming coalesce idle to 1s
2026-01-09 22:31:19 +01:00
Peter Steinberger
6c7a27c010
refactor: normalize main session key handling
2026-01-09 22:30:15 +01:00
Peter Steinberger
c37b77855b
Merge pull request #464 from austinm911/fix/slack-thread-replies
...
feat(slack): implement configurable reply threading
2026-01-09 21:10:39 +00:00
Peter Steinberger
84046cbad8
fix(slack): mrkdwn + thread edge cases ( #464 ) (thanks @austinm911)
2026-01-09 22:09:02 +01:00
Austin Mudd
b4663ed11c
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
Peter Steinberger
42a0089b3b
fix: require explicit system event session keys
2026-01-09 21:59:01 +01:00
Peter Steinberger
d3a0114b6b
fix: dedupe followup queue by message id ( #600 ) (thanks @samratjha96)
2026-01-09 20:44:11 +01:00
Samrat Jha
9185fdc896
fix(queue): deduplicate followup queue entries to prevent duplicate responses
...
## Problem
When messages arrived while the agent was busy processing a previous message,
the same message could be enqueued multiple times into the followup queue.
This happened because Discord's event system can emit the same message multiple
times (e.g., during reconnects or due to slow listener processing), and the
followup queue had no deduplication logic.
This caused the bot to respond to the same user message 2-4+ times.
## Solution
Add simple exact-match deduplication in `enqueueFollowupRun()`: if a prompt
is already in the queue, skip adding it again. Extracted into a small
`isPromptAlreadyQueued()` helper for clarity.
## Testing
- Added test cases for deduplication (same prompt rejected, different accepted)
- Manually verified on Discord: single response per message even when multiple
events fire during slow agent processing
2026-01-09 20:40:18 +01:00
Peter Steinberger
2977b296e6
feat(messages): add whatsapp messagePrefix and responsePrefix auto
2026-01-09 19:29:04 +00:00
Peter Steinberger
72b0777341
fix(messages): restore explicit responsePrefix default
2026-01-09 19:18:34 +00:00
Peter Steinberger
fd15704c77
fix(auto-reply): coalesce block replies and document streaming toggles ( #536 ) (thanks @mcinteerj)
2026-01-09 18:19:55 +00:00
Luke
401f2a77e3
Merge branch 'main' into commands-list-clean
2026-01-09 11:46:08 -05:00
Peter Steinberger
1478473537
refactor(commands): canonicalize text command aliases
2026-01-09 17:22:46 +01:00
Peter Steinberger
d372fac9c6
refactor: streamline reply tag parsing
2026-01-09 17:14:40 +01:00
Peter Steinberger
cef13aa705
Merge pull request #586 from clawdbot/temp/landpr-492
...
fix(commands): wire /usage alias to /status
2026-01-09 16:14:11 +00:00
Peter Steinberger
68ad27e31c
fix(commands): wire /usage to status ( #492 ) (thanks @lc0rp)
2026-01-09 17:10:53 +01:00
Luke
4658f937cc
Merge branch 'main' into commands-list-clean
2026-01-09 11:06:06 -05:00
Peter Steinberger
67af3c3291
Merge pull request #560 from mcinteerj/fix/reply-tags-whitespace
...
Auto-Reply: relax regex for reply tags to allow whitespace
2026-01-09 16:05:17 +00:00
Luke
98b875cd0f
Merge branch 'main' into commands-list-clean
2026-01-09 11:04:23 -05:00
Peter Steinberger
7d9300e0f5
fix: allow whitespace in reply tags ( #560 ) (thanks @mcinteerj)
2026-01-09 17:03:44 +01:00
Jake
4381b03412
Auto-Reply: relax regex for reply tags to allow whitespace
2026-01-09 17:01:58 +01:00
Peter Steinberger
d099dabf37
refactor: centralize slack threading helpers
2026-01-09 16:01:53 +00:00
Peter Steinberger
be48233bc4
chore: format
2026-01-09 16:55:51 +01:00
Peter Steinberger
c643ce2a7a
feat: add /debug runtime overrides
2026-01-09 16:55:16 +01:00
Peter Steinberger
36bdec0f2c
refactor(messages): centralize per-agent prefixes
2026-01-09 16:54:54 +01:00
Peter Steinberger
1eecce9a15
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
66bbb723c5
fix: derive prefixes from routed identity ( #578 ) (thanks @p6l-richard)
2026-01-09 16:39:32 +01:00
Peter Steinberger
facf5c09a0
fix: honor slack reply threading ( #574 , thanks @bolismauro)
2026-01-09 15:38:43 +00:00
Mauro Bolis
96149d1f71
fix: honor slack reply threading
2026-01-09 15:35:54 +00:00
Peter Steinberger
922ca2ee1c
fix(status): surface provider usage errors
2026-01-09 15:34:58 +00:00
Josh Palmer
25babbfdc4
🤖 codex: fix duplicate agentDir (no-issue)
2026-01-09 16:23:34 +01:00
Peter Steinberger
07430eb33d
Merge pull request #569 from bjesuiter/ui-build-default-to-relative-path
...
fix(ui): default to relative paths for control UI assets
2026-01-09 14:47:46 +00:00
Peter Steinberger
d77dee50c9
Merge pull request #570 from azade-c/feat/sessions-label
...
feat(sessions): expose label in sessions.list and support label lookup in sessions_send
2026-01-09 14:44:23 +00:00
Peter Steinberger
c4c0f1349a
fix: keep build green after main rebase ( #570 ) (thanks @azade-c)
2026-01-09 15:40:36 +01:00
Peter Steinberger
d17141b859
fix(status): show usage for token auth profiles
2026-01-09 14:36:46 +00:00
Peter Steinberger
1afa48fcdf
style(models): biome format auth order
2026-01-09 14:36:46 +00:00
Peter Steinberger
59d942c9ec
fix: unblock CI on main ( #569 ) (thanks @bjesuiter)
2026-01-09 15:32:55 +01:00
Peter Steinberger
56e77f6843
fix: sessions label lookup and persistence ( #570 ) (thanks @azade-c)
2026-01-09 15:32:49 +01:00
Azade
3133c7c84e
feat(sessions): expose label in sessions.list and support label lookup in sessions_send
...
- Add `label` field to session entries and expose it in `sessions.list`
- Display label column in the web UI sessions table
- Support `label` parameter in `sessions_send` for lookup by label instead of sessionKey
- `sessions.patch`: Accept and store `label` field
- `sessions.list`: Return `label` in session entries
- `sessions_spawn`: Pass label through to registry and announce flow
- `sessions_send`: Accept optional `label` param, lookup session by label if sessionKey not provided
- `agent` method: Accept `label` and `spawnedBy` params (stored in session entry)
- Add `label` column to sessions table in web UI
- Changed session store writes to merge with existing entry (`{ ...existing, ...new }`)
to preserve fields like `label` that might be set separately
We attempted to implement label persistence "properly" by passing the label
through the `agent` call and storing it during session initialization. However,
the auto-reply flow has multiple write points that overwrite the session entry,
and making all of them merge-aware proved unreliable.
The working solution patches the label in the `finally` block of
`runSubagentAnnounceFlow`, after all other session writes complete.
This is a workaround but robust - the patch happens at the very end,
just before potential cleanup.
A future refactor could make session writes consistently merge-based,
which would allow the cleaner approach of setting label at spawn time.
```typescript
// Spawn with label
sessions_spawn({ task: "...", label: "my-worker" })
// Later, find by label
sessions_send({ label: "my-worker", message: "continue..." })
// Or use sessions_list to see labels
sessions_list() // includes label field in response
```
2026-01-09 15:32:49 +01:00
Peter Steinberger
3e400ff9f2
feat(models): add per-agent auth order overrides
2026-01-09 14:07:45 +00:00
Peter Steinberger
b21e62f072
style: format gateway discovery
2026-01-09 13:55:28 +01:00
Peter Steinberger
c2d185aab7
fix: normalize routed replies
2026-01-09 13:55:27 +01:00
Peter Steinberger
7b81d97ec2
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
Onur
2ab5890eab
wip
2026-01-09 11:06:49 +01:00
Onur
d6256a388e
feat(msteams): wire up proactive messaging in routeReply for queued replies
2026-01-09 11:06:49 +01:00
Onur
1c73d45106
feat(msteams): wire agent integration for Teams messages
...
- Integrate dispatchReplyFromConfig() for full agent routing
- Add msteams to TextChunkProvider and OriginatingChannelType
- Add msteams case to route-reply (proactive not yet supported)
- Strip @mention HTML tags from Teams messages
- Fix session key to exclude messageid suffix
- Add typing indicator support
- Add proper logging for debugging
2026-01-09 11:05:34 +01:00
Luke
aa64abe84c
Merge branch 'main' into commands-list-clean
2026-01-09 03:12:08 -05:00
Peter Steinberger
37cbcc97d3
feat: support token auth profiles
2026-01-09 08:13:04 +01:00
Peter Steinberger
0a026fea1c
fix: disable restart by default
2026-01-09 05:49:30 +00:00
Peter Steinberger
8e35ad5484
style: format after gate
2026-01-09 05:27:54 +00:00
Peter Steinberger
7842109609
fix: report auth label from configured order
2026-01-09 05:17:27 +00:00
Peter Steinberger
9114331218
fix: serialize claude cli runs
2026-01-09 04:58:21 +00:00
Luke
a4806e9417
Merge branch 'main' into commands-list-clean
2026-01-08 23:21:31 -05:00
Peter Steinberger
64fc5fa9fc
fix: allow default model outside allowlist
2026-01-09 04:18:30 +00:00
Luke K (pr-0f3t)
1309cee124
Auto-reply: fix status command lint
2026-01-08 22:51:35 -05:00
Peter Steinberger
8e27ea7371
feat: add raw stream logging flags
2026-01-09 03:45:21 +00:00
Luke
b97a9235e0
Merge branch 'main' into commands-list-clean
2026-01-08 22:19:52 -05:00
Peter Steinberger
3e19f82af2
fix: repair status reply call
2026-01-09 03:18:20 +00:00
Peter Steinberger
d8a23cf5ab
fix: restore emoji-rich status output
2026-01-09 03:15:33 +00:00
Peter Steinberger
b3b84ffefa
fix: fallback /model list when catalog is unavailable
2026-01-09 03:56:19 +01:00
Luke
e52a2888cc
Merge branch 'main' into commands-list-clean
2026-01-08 21:47:09 -05:00
Peter Steinberger
0cbc5fea93
fix: keep status for directive-only messages
2026-01-09 03:46:00 +01:00
Peter Steinberger
dc81d0a649
fix: improve /status auth label
2026-01-09 03:39:02 +01:00
Peter Steinberger
3c79d5c711
fix: keep /status usage filtering
2026-01-09 03:31:02 +01:00
Peter Steinberger
151523f47b
feat: add usage cost reporting
2026-01-09 02:29:54 +00:00
Peter Steinberger
1a295d9460
fix: improve status usage filtering and directives
2026-01-09 03:18:47 +01:00
Peter Steinberger
468889abef
fix: refine status usage and elevated directives
2026-01-09 03:09:56 +01:00
Luke
c678216ac2
Merge branch 'main' into commands-list-clean
2026-01-08 20:58:26 -05:00
Peter Steinberger
455723375e
fix: show directive options on query
2026-01-09 01:40:44 +01:00
Luke
daafa9e3bc
Merge branch 'main' into commands-list-clean
2026-01-08 19:33:56 -05:00
Peter Steinberger
f666f60731
fix: preserve inline directive spacing tests (thanks @joshp123) ( #539 )
2026-01-09 00:37:40 +01:00
Josh Palmer
43545a4864
🤖 codex: preserve spacing after inline directives (issue-telegram-inline-spacing)
2026-01-09 00:37:40 +01:00
Peter Steinberger
014667e00b
fix: tighten group elevated targeting
2026-01-08 22:57:18 +01:00
Luke
a574ae5415
Merge branch 'main' into commands-list-clean
2026-01-08 15:35:17 -05:00
Keith the Silly Goose
7866203c5c
fix(status): include provider prefix in model display
...
The /status command was showing 'anthropic/claude-sonnet-4-5' even when
using 'google-antigravity/claude-sonnet-4-5' because buildStatusMessage
received only the model name without the provider prefix.
When resolveConfiguredModelRef parsed a model string without a slash,
it fell back to DEFAULT_PROVIDER ('anthropic'), causing the misleading
display.
Fix: Pass the full 'provider/model' string to buildStatusMessage so
the provider is correctly extracted and displayed.
🪿 Investigated and submitted by Keith the Silly Goose
2026-01-08 20:11:37 +01:00
Josh Palmer
cc94db458c
🤖 codex: fix block reply ordering ( #503 )
...
What: serialize block reply sends, make typing non-blocking, add timeout fallback + abort-aware routing, and add regression tests.
Why: prevent out-of-order streamed blocks while keeping final fallback on timeouts.
Tests: ./node_modules/.bin/vitest run src/auto-reply/reply.block-streaming.test.ts src/auto-reply/reply/route-reply.test.ts
Tests: corepack pnpm lint && corepack pnpm build (pass). corepack pnpm test (ran locally; failure observed during run).
Co-authored-by: Josh Palmer <joshp123@users.noreply.github.com>
2026-01-08 19:30:24 +01:00
LK
559e175b38
feat(commands): add /commands slash list
2026-01-08 16:23:36 +01:00
Peter Steinberger
bce3cc992f
fix: group /model list output
2026-01-08 09:44:59 +01:00
Peter Steinberger
8930ec32cb
feat: add slack multi-account routing
2026-01-08 08:49:16 +01:00
Peter Steinberger
d1ceb3aa60
feat: add logs cli and restart hints
2026-01-08 06:56:34 +00:00
Peter Steinberger
6a81652ebf
fix(typing): keep tool-start ttl mode-safe ( #452 , thanks @thesash)
2026-01-08 06:18:35 +00:00
Sash Catanzarite
29c5ed54b2
feat(typing): trigger indicator on tool start events
...
Add signalToolStart to TypingSignaler and call it from onAgentEvent
when tools begin executing. This keeps the typing indicator visible
during long-running tool operations.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-08 06:18:35 +00:00
Sash Catanzarite
a6a550032a
fix(typing): refresh TTL on every startTypingLoop call
...
Previously, startTypingLoop would return early if the typing timer was
already running, which meant the TTL would never get refreshed during
long tool executions. This caused the typing indicator to stop after
2 minutes even if tools were still running.
Now we refresh the TTL at the start of startTypingLoop, before the
early-return checks. This keeps typing alive during long operations.
2026-01-08 05:45:46 +01:00
Peter Steinberger
15379dedf0
fix(telegram): voice-note tag defaults ( #188 , thanks @manmal)
2026-01-08 03:15:08 +00:00
Manuel Maly
2972fce02c
fix: flip audio default to file (backward compat)
...
- Default: sendAudio (file with metadata) - preserves old behavior
- Opt-in: [[audio_as_voice]] tag for voice bubble
This is non-breaking - existing integrations keep working.
2026-01-08 03:15:08 +00:00
Manuel Maly
262f8a8d45
feat(telegram): add [[audio_as_file]] tag support
...
Allow agents to specify audio mode via inline tag:
- Default: voice bubble (sendVoice)
- [[audio_as_file]]: audio file with metadata (sendAudio)
The tag is stripped from the final message text.
Example agent response:
Here's a podcast episode! [[audio_as_file]]
MEDIA:https://example.com/episode.mp3
2026-01-08 03:15:08 +00:00
Peter Steinberger
8aa3efb9e8
refactor: tidy directive parsing + queue status
2026-01-08 03:47:52 +01:00
Peter Steinberger
fbeb9e6775
fix(ci): stabilize windows tests
2026-01-08 02:44:19 +00:00
Peter Steinberger
780385e31f
fix(auto-reply): handle /think no-arg
2026-01-08 03:39:05 +01:00
Peter Steinberger
ad5c87c193
fix: relax slash command parsing
2026-01-08 03:24:18 +01:00
Lutro
36b443f4f3
Telegram: fix /think command to show current level when no arg
2026-01-08 03:24:18 +01:00
Peter Steinberger
a450390f7c
refactor: share reply payload threading/dedupe
2026-01-08 01:09:23 +00:00
Peter Steinberger
05b8679c8b
feat: add providers CLI and multi-account onboarding
2026-01-08 01:55:59 +01:00
Peter Steinberger
17d052bcda
fix: polish reply threading + tool dedupe (thanks @mneves75) ( #326 )
2026-01-08 00:50:47 +00:00
mneves75
33e2d53be3
feat(telegram): wire replyToMode config, add forum topic support, fix messaging tool duplicates
...
Changes:
- Default replyToMode from "off" to "first" for better threading UX
- Add messageThreadId and replyToMessageId params for forum topic support
- Add messaging tool duplicate detection to suppress redundant block replies
- Add sendMessage action to telegram tool schema
- Add @grammyjs/types devDependency for proper TypeScript typing
- Remove @ts-nocheck and fix all type errors in send.ts
- Add comprehensive docs/telegram.md documentation
- Add PR-326-REVIEW.md with John Carmack-level code review
Test coverage:
- normalizeTextForComparison: 5 cases
- isMessagingToolDuplicate: 7 cases
- sendMessageTelegram thread params: 5 cases
- handleTelegramAction sendMessage: 4 cases
- Forum topic isolation: 4 cases
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 00:50:47 +00:00
Peter Steinberger
b2de667b11
fix: persist topic session files
2026-01-07 22:56:50 +00:00
Peter Steinberger
434c25331e
refactor: centralize typing mode signals
2026-01-07 22:18:11 +00:00
Peter Steinberger
bac1608933
feat: add typing mode controls
2026-01-07 21:58:54 +00:00
Azade
e41540e4ff
feat(commands): add dynamic /<alias> model switching
2026-01-07 20:41:41 +00:00
Peter Steinberger
0d021391a9
fix: scope thread sessions and discord starter fetch
2026-01-07 19:42:50 +01:00
Shadow
7e5cef29a0
Threads: add Slack/Discord thread sessions
2026-01-07 19:30:30 +01:00
Peter Steinberger
1011640a13
refactor: drop autoReply, add topic requireMention
...
Co-authored-by: kitze <kristijan.mkd@gmail.com>
2026-01-07 12:07:15 +01:00
Peter Steinberger
eef90b47a3
chore: satisfy lint
2026-01-07 11:49:01 +01:00
Peter Steinberger
43c6bb7595
feat: add channel/topic overrides for skills + auto-reply
2026-01-07 11:44:37 +01:00
Peter Steinberger
61f720b945
feat: add skill filter + group system prompt plumbing
2026-01-07 11:44:37 +01:00
Peter Steinberger
9bf6684366
feat: add provider usage tracking
2026-01-07 11:42:46 +01:00
Peter Steinberger
a700f9896d
feat: telegram draft streaming
2026-01-07 11:08:32 +01:00
Peter Steinberger
e8420bd047
fix: refine bootstrap injections
2026-01-07 10:04:23 +00:00
Tobias Bischoff
412990a139
Reduce prompt token overhead with leaner context injections
2026-01-07 10:04:23 +00:00
Peter Steinberger
7973fd4caf
feat: add agents command
2026-01-07 10:03:53 +01:00
Peter Steinberger
dc941b7e57
fix: refresh status output
2026-01-07 07:22:06 +01:00
Peter Steinberger
1673a221f8
feat: add /reasoning reasoning visibility
2026-01-07 06:17:31 +01:00
Peter Steinberger
cb2a72f8a9
test(routing): add route-reply coverage
2026-01-07 05:07:53 +00:00
Peter Steinberger
3668388912
fix(routing): harden originating reply routing
2026-01-07 05:02:34 +00:00
Josh Lehman
5414da9fd4
fix(routing): handle cross-provider messages in collect mode
...
When queued messages come from different providers (Slack + Telegram),
process them individually instead of collecting into a single prompt.
This ensures each reply routes back to its originating provider.
- Add hasCrossProviderItems() to detect multi-provider queues
- Skip collect mode when cross-provider detected
- Preserve originatingChannel/originatingTo when collecting same-provider
2026-01-07 04:51:33 +00:00
Josh Lehman
2d67ec5bfa
fix(routing): only route to originating channel when cross-provider
...
When OriginatingChannel matches Surface (same provider), use normal
dispatcher. Only route via routeReply() when they differ, ensuring
cross-provider messages (e.g., Telegram queued while Slack active)
get routed back to their origin.
2026-01-07 04:51:33 +00:00
Josh Lehman
9d50ebad7d
feat(routing): route replies to originating channel
...
Implement reply routing based on OriginatingChannel/OriginatingTo fields.
This ensures replies go back to the provider where the message originated
instead of using the session's lastChannel.
Changes:
- Add OriginatingChannel/OriginatingTo fields to MsgContext (templating.ts)
- Add originatingChannel/originatingTo fields to FollowupRun (queue.ts)
- Create route-reply.ts with provider-agnostic router
- Update all providers (Telegram, Slack, Discord, Signal, iMessage)
to pass originating channel info
- Update reply.ts to pass originating channel to followupRun
- Update followup-runner.ts to use route-reply for originating channels
This addresses the issue where messages from one provider (e.g., Slack)
would receive replies on a different provider (e.g., Telegram) because
the queue used the last active dispatcher instead of the originating one.
2026-01-07 04:51:33 +00:00
Peter Steinberger
e0efcda77f
fix(commands): wire /stop across chat commands
2026-01-06 23:11:57 +00:00
Peter Steinberger
fec7f37271
merge upstream/main
2026-01-06 23:09:01 +01:00
Peter Steinberger
86b56b2308
fix: harden gemini session reset
2026-01-06 23:06:01 +01:00
Peter Steinberger
96164b5955
fix: improve socket error handling
2026-01-06 22:43:29 +01:00
Emanuel Stadler
fb17a32283
feat: enhance error handling for socket connection errors
...
- Added `isError` property to `EmbeddedPiRunResult` and reply items to indicate error states.
- Updated error handling in `runReplyAgent` to provide more informative messages for specific socket connection errors.
2026-01-06 22:19:37 +01:00
Peter Steinberger
84c8209158
fix(slack): clear assistant thread status after replies
2026-01-06 21:41:30 +01:00
Shadow
9b22e1f6e9
feat(commands): unify chat commands ( #275 )
...
* Chat commands: registry, access groups, Carbon
* Chat commands: clear native commands on disable
* fix(commands): align command surface typing
* docs(changelog): note commands registry (PR #275 )
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-01-06 20:17:56 +00:00
Peter Steinberger
31dbc62bdd
fix(telegram): prevent stuck typing after tool runs
2026-01-06 18:56:43 +00:00
Abhi
bdf597eb95
fix(telegram): stop typing after tool results ( #322 )
...
Thanks @AbhisekBasu1.
2026-01-06 18:54:08 +00:00
Peter Steinberger
2f24ea492b
fix: restore Anthropic token accounting
2026-01-06 18:52:01 +00:00
Peter Steinberger
dbfa316d19
feat: multi-agent routing + multi-account providers
2026-01-06 18:33:37 +00:00
VAC
eadb923000
fix: auto-recover from Gemini session corruption
...
Detect the Gemini API error 'function call turn comes immediately after
a user turn or after a function response turn' which indicates corrupted
session history.
When detected:
- Delete the corrupted transcript file
- Remove the session entry from the store
- Return a user-friendly message asking them to retry
This prevents the error loop where every subsequent message fails with
the same error until manual intervention.
Fixes #296
2026-01-06 07:25:15 -05:00
Peter Steinberger
b5c604b7b7
fix: require slash for control commands
2026-01-06 07:05:17 +01:00
Shadow
88cb13dc82
Auto-reply: fix typing stop race ( #270 )
2026-01-05 22:57:04 -06:00
Peter Steinberger
ea6ee16461
chore: fix lint warnings
2026-01-06 05:41:24 +01:00
Peter Steinberger
13eb9c9ee9
refactor: centralize reply dispatch
2026-01-06 04:55:00 +01:00
Peter Steinberger
5946f4c341
test: extend typing idle coverage
2026-01-06 03:42:33 +00:00
Peter Steinberger
58186aa56e
test: cover typing idle gate
2026-01-06 03:28:47 +00:00
Peter Steinberger
ca8f66f844
refactor: unify group allowlist policy
2026-01-06 04:27:51 +01:00