Peter Steinberger
960fabdaef
refactor: trim cli helper exports
2026-05-02 07:36:54 +01:00
Peter Steinberger
42d73fd955
refactor: remove dead private helpers
2026-05-01 06:55:26 +01:00
Poo-Squirry
a1cb8d50ba
fix: allow route bindings to override DM session scope ( #71750 )
...
Co-authored-by: 따온이네 맥북프로 <tulisy@ttaon-ine-ui-MacBookPro.local >
2026-04-25 17:08:59 -04:00
Peter Steinberger
ef66798433
fix: preserve outbound thread sessions
2026-04-22 02:56:23 +01:00
Peter Steinberger
60a1f01a3e
test: use synthetic agent infra fixtures
2026-04-21 01:46:33 +01:00
Peter Steinberger
d2b67fbb68
refactor: share route binding normalization
2026-04-20 13:21:12 +01:00
Peter Steinberger
8bfa06e992
refactor: enforce plugin-owned channel boundaries
2026-04-18 22:48:27 +01:00
lukeboyett
c39314c14a
fix(agents): prefer target agent's bound Matrix account for subagent spawns ( #67508 )
...
Merged via squash.
Prepared head SHA: 9300111038
Co-authored-by: lukeboyett <46942646+lukeboyett@users.noreply.github.com >
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com >
Reviewed-by: @gumadeiras
2026-04-18 14:02:53 -04:00
Peter Steinberger
79dfb4db69
test: shorten routing cache scalability case
2026-04-17 19:30:36 +01:00
Peter Steinberger
8eb577b361
test: slim routing cache rollover coverage
2026-04-17 19:27:52 +01:00
Peter Steinberger
3a59eddd07
test: reduce hotspot fixture overhead
2026-04-17 02:37:00 +01:00
Vincent Koc
8f3e2296f9
perf(cron): use narrow bound-account lookup
2026-04-13 17:57:47 +01:00
Vincent Koc
74e7b8d47b
fix(cycles): bulk extract leaf type surfaces
2026-04-11 13:26:50 +01:00
Peter Steinberger
67dc6e82b9
refactor: dedupe misc lowercase helpers
2026-04-07 22:24:32 +01:00
Peter Steinberger
1fdb013599
refactor: dedupe routing lowercase helpers
2026-04-07 11:18:18 +01:00
Peter Steinberger
3139d2007e
refactor: dedupe lowercase empty-string readers
2026-04-07 11:18:18 +01:00
Peter Steinberger
c569e5faba
Sessions: split chat type derivation seam
2026-04-07 12:50:59 +08:00
Vignesh Natarajan
f62db7950a
fix(control-ui): keep session key helpers browser-safe
2026-04-03 20:39:36 -07:00
Peter Steinberger
ab318de8b7
test(plugins): finish moving contract coverage
2026-04-04 00:11:39 +01:00
Shakker
8bd3067e69
refactor: move built-in channel normalization to ids
2026-04-04 01:07:28 +09:00
OfflynAI
b554516f21
routing: support wildcard peer bindings (peer.id="*") for multi-agent routing ( #58609 )
...
* routing: support wildcard peer bindings (peer.id="*") for multi-agent routing
Bindings with `peer: { kind: "direct", id: "*" }` were treated as a literal
peer ID "*" instead of a wildcard. This caused the binding to be indexed
exclusively in the byPeer map under key "direct:*", which never matches
actual incoming peer IDs like "direct:12345678". The binding silently fell
through to the default agent ("main"), breaking multi-agent setups that use
wildcard peer constraints to route all DMs on a named account to a specific
agent.
Add a "wildcard-kind" peer constraint state that restricts on chat type
(direct/group/channel) without requiring an exact peer ID match. Wildcard
peer bindings now fall through to the byAccount/byChannel index tiers and
correctly match via matchesBindingScope with kind-only filtering.
Resolves #58546
Made-with: Cursor
* routing: add dedicated binding.peer.wildcard tier for clarity
Address Greptile feedback: wildcard-peer bindings now report
matchedBy: "binding.peer.wildcard" instead of "binding.account",
making logs/debugging clearer for operators.
- Add byPeerWildcard index bucket
- Add binding.peer.wildcard tier between peer.parent and guild+roles
- Update tests to expect the new matchedBy value
Made-with: Cursor
2026-03-31 21:10:18 -04:00
Gustavo Madeira Santana
bea53d7a3f
Fix: move bootstrap session grammar into plugin-owned session-key surfaces ( #58400 )
...
Merged via squash.
Prepared head SHA: b062b18b03
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com >
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com >
Reviewed-by: @gumadeiras
2026-03-31 19:41:01 -04:00
Gustavo Madeira Santana
4ea1ca4849
Sessions: parse thread suffixes by channel ( #58100 )
...
Merged via squash.
Prepared head SHA: 2829b9c5b5
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com >
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com >
Reviewed-by: @gumadeiras
2026-03-31 08:54:16 -04:00
Peter Steinberger
155915e7dc
test: dedupe routing and text suites
2026-03-28 07:31:40 +00:00
Peter Steinberger
fef688fb7a
test: dedupe utility and config suites
2026-03-28 00:26:55 +00:00
Peter Steinberger
d06413e335
refactor: share normalized account lookups
2026-03-22 19:01:52 +00:00
Peter Steinberger
6a8081a7f3
refactor(routing): centralize inbound last-route policy
2026-03-08 02:16:03 +00:00
Vignesh Natarajan
c260e207b2
fix(routing): avoid full binding rescans in resolveAgentRoute ( #36915 )
2026-03-05 16:49:29 -08:00
Bob
6a705a37f2
ACP: add persistent Discord channel and Telegram topic bindings ( #34873 )
...
* docs: add ACP persistent binding experiment plan
* docs: align ACP persistent binding spec to channel-local config
* docs: scope Telegram ACP bindings to forum topics only
* docs: lock bound /new and /reset behavior to in-place ACP reset
* ACP: add persistent discord/telegram conversation bindings
* ACP: fix persistent binding reuse and discord thread parent context
* docs: document channel-specific persistent ACP bindings
* ACP: split persistent bindings and share conversation id helpers
* ACP: defer configured binding init until preflight passes
* ACP: fix discord thread parent fallback and explicit disable inheritance
* ACP: keep bound /new and /reset in-place
* ACP: honor configured bindings in native command flows
* ACP: avoid configured fallback after runtime bind failure
* docs: refine ACP bindings experiment config examples
* acp: cut over to typed top-level persistent bindings
* ACP bindings: harden reset recovery and native command auth
* Docs: add ACP bound command auth proposal
* Tests: normalize i18n registry zh-CN assertion encoding
* ACP bindings: address review findings for reset and fallback routing
* ACP reset: gate hooks on success and preserve /new arguments
* ACP bindings: fix auth and binding-priority review findings
* Telegram ACP: gate ensure on auth and accepted messages
* ACP bindings: fix session-key precedence and unavailable handling
* ACP reset/native commands: honor fallback targets and abort on bootstrap failure
* Config schema: validate ACP binding channel and Telegram topic IDs
* Discord ACP: apply configured DM bindings to native commands
* ACP reset tails: dispatch through ACP after command handling
* ACP tails/native reset auth: fix target dispatch and restore full auth
* ACP reset detection: fallback to active ACP keys for DM contexts
* Tests: type runTurn mock input in ACP dispatch test
* ACP: dedup binding route bootstrap and reset target resolution
* reply: align ACP reset hooks with bound session key
* docs: replace personal discord ids with placeholders
* fix: add changelog entry for ACP persistent bindings (#34873 ) (thanks @dutifulbob)
---------
Co-authored-by: Onur <2453968+osolmaz@users.noreply.github.com >
2026-03-05 09:38:12 +01:00
Evgeny Zislis
8eeb049683
fix(telegram): address PR review comments
...
- Export pickFirstExistingAgentId and use it to validate topic agentId
- Properly update mainSessionKey when overriding route agent
- Fix docs example showing incorrect session key for topic 3
Fixes issue where non-existent agentId would create orphaned sessions.
Fixes issue where DM topic replies would route to wrong agent.
2026-03-04 09:35:53 +05:30
Altay
627813aba4
fix(heartbeat): scope exec wake dispatch to session key ( #32724 )
...
Merged via squash.
Prepared head SHA: 563fee0e65
Co-authored-by: altaywtf <9790196+altaywtf@users.noreply.github.com >
Co-authored-by: altaywtf <9790196+altaywtf@users.noreply.github.com >
Reviewed-by: @altaywtf
2026-03-03 14:47:40 +03:00
Sid
4ffe15c6b2
fix(telegram): warn when accounts.default is missing in multi-account setup ( #32544 )
...
Merged via squash.
Prepared head SHA: 7ebc3f65b2
Co-authored-by: Sid-Qin <201593046+Sid-Qin@users.noreply.github.com >
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com >
Reviewed-by: @gumadeiras
2026-03-03 03:27:19 -05:00
Peter Steinberger
6bf84ac28c
perf(runtime): reduce hot-path config and routing overhead
2026-03-03 00:20:46 +00:00
Peter Steinberger
ba5ae5b4f1
perf(routing): cache route and mention regex resolution
2026-03-02 23:00:49 +00:00
Peter Steinberger
9bde7f4fde
perf: cache allowlist and account-id normalization
2026-03-02 21:58:35 +00:00
Peter Steinberger
34daed1d1e
refactor(core): dedupe infra, media, pairing, and plugin helpers
2026-03-02 21:32:11 +00:00
Peter Steinberger
5a32a66aa8
perf(core): speed up routing, pairing, slack, and security scans
2026-03-02 21:07:52 +00:00
Peter Steinberger
3de7768b11
perf(routing): cache normalized agent-id lookups
2026-03-02 20:19:10 +00:00
Peter Steinberger
b28e472fa5
fix(agents): validate sessions_spawn agentId format ( #31381 )
2026-03-02 15:59:45 +00:00
Peter Steinberger
70ee256ae0
fix(routing): treat group/channel peer.kind as equivalent (land #31135 by @Sid-Qin)
...
Landed-from: #31135
Contributor: @Sid-Qin
Co-authored-by: Sid <sidqin0410@gmail.com >
2026-03-02 01:47:02 +00:00
Peter Steinberger
4b71de384c
fix(core): unify session-key normalization and plugin boundary checks
2026-02-26 12:41:23 +00:00
Glucksberg
fd7ca4c394
fix: normalize input peer.kind in resolveAgentRoute ( #22730 )
...
The input peer.kind from channel plugins was used as-is without
normalization via normalizeChatType(), while the binding side correctly
normalized. This caused "dm" !== "direct" mismatches in
matchesBindingScope, making plugins that use "dm" as peerKind fail to
match bindings configured with "direct".
Normalize both peer.kind and parentPeer.kind through normalizeChatType()
so that "dm" and "direct" are treated equivalently on both sides.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
(cherry picked from commit b0c96702f5 )
2026-02-24 04:33:50 +00:00
Peter Steinberger
f97c0922e1
fix(security): harden account-key handling against prototype pollution
2026-02-24 01:09:31 +00:00
Peter Steinberger
0183610db3
refactor: de-duplicate channel runtime and payload helpers
2026-02-23 21:25:28 +00:00
Vignesh Natarajan
d75b594e07
Agents/Replies: scope done fallback to direct sessions
2026-02-22 13:30:30 -08:00
Peter Steinberger
34ea33f057
refactor: dedupe core config and runtime helpers
2026-02-22 17:11:54 +00:00
Peter Steinberger
cc2ff68947
test: optimize gateway infra memory and security coverage
2026-02-21 21:44:50 +00:00
Onur
8178ea472d
feat: thread-bound subagents on Discord ( #21805 )
...
* docs: thread-bound subagents plan
* docs: add exact thread-bound subagent implementation touchpoints
* Docs: prioritize auto thread-bound subagent flow
* Docs: add ACP harness thread-binding extensions
* Discord: add thread-bound session routing and auto-bind spawn flow
* Subagents: add focus commands and ACP/session binding lifecycle hooks
* Tests: cover thread bindings, focus commands, and ACP unbind hooks
* Docs: add plugin-hook appendix for thread-bound subagents
* Plugins: add subagent lifecycle hook events
* Core: emit subagent lifecycle hooks and decouple Discord bindings
* Discord: handle subagent bind lifecycle via plugin hooks
* Subagents: unify completion finalizer and split registry modules
* Add subagent lifecycle events module
* Hooks: fix subagent ended context key
* Discord: share thread bindings across ESM and Jiti
* Subagents: add persistent sessions_spawn mode for thread-bound sessions
* Subagents: clarify thread intro and persistent completion copy
* test(subagents): stabilize sessions_spawn lifecycle cleanup assertions
* Discord: add thread-bound session TTL with auto-unfocus
* Subagents: fail session spawns when thread bind fails
* Subagents: cover thread session failure cleanup paths
* Session: add thread binding TTL config and /session ttl controls
* Tests: align discord reaction expectations
* Agent: persist sessionFile for keyed subagent sessions
* Discord: normalize imports after conflict resolution
* Sessions: centralize sessionFile resolve/persist helper
* Discord: harden thread-bound subagent session routing
* Rebase: resolve upstream/main conflicts
* Subagents: move thread binding into hooks and split bindings modules
* Docs: add channel-agnostic subagent routing hook plan
* Agents: decouple subagent routing from Discord
* Discord: refactor thread-bound subagent flows
* Subagents: prevent duplicate end hooks and orphaned failed sessions
* Refactor: split subagent command and provider phases
* Subagents: honor hook delivery target overrides
* Discord: add thread binding kill switches and refresh plan doc
* Discord: fix thread bind channel resolution
* Routing: centralize account id normalization
* Discord: clean up thread bindings on startup failures
* Discord: add startup cleanup regression tests
* Docs: add long-term thread-bound subagent architecture
* Docs: split session binding plan and dedupe thread-bound doc
* Subagents: add channel-agnostic session binding routing
* Subagents: stabilize announce completion routing tests
* Subagents: cover multi-bound completion routing
* Subagents: suppress lifecycle hooks on failed thread bind
* tests: fix discord provider mock typing regressions
* docs/protocol: sync slash command aliases and delete param models
* fix: add changelog entry for Discord thread-bound subagents (#21805 ) (thanks @onutc)
---------
Co-authored-by: Shadow <hi@shadowing.dev >
2026-02-21 16:14:55 +01:00
Peter Steinberger
31f83c86b2
refactor(test): dedupe agent harnesses and routing fixtures
2026-02-18 04:49:22 +00:00
Peter Steinberger
b8b43175c5
style: align formatting with oxfmt 0.33
2026-02-18 01:34:35 +00:00