Ayaan Zaidi
2c8ed54ddb
feat(heartbeat): default delivery to the configured owner, never groups ( #121988 )
...
Unset heartbeat.target now resolves "owner": elected heartbeat notifications deliver to the operator's DM resolved from commands.ownerAllowFrom or the channel allowFrom (first concrete entry; wildcards and channel-scoped wildcards excluded; configured owners exhausted across channels before any channel-local fallback). Delivery requires the channel's own classifier to positively prove a direct destination — every bundled messaging plugin now ships an inferTargetChatType contract — and unproven or group-shaped destinations fail closed to the visible no-route state. The first implicitly-routed delivery carries a one-line self-explanation naming the target: "none" opt-out. Explicit target "last" remains as the follow-the-conversation opt-in. Refines the unreleased #121892 default before it ships; refs #121880 .
Co-authored-by: Ayaan Zaidi <hi@obviy.us >
Co-authored-by: Claude Fable 5 <noreply@anthropic.com >
2026-08-11 13:18:22 +00:00
Peter Steinberger
40dbc7a65a
test(plugin-sdk): remove repo-local test helper fossils ( #121190 )
2026-08-09 11:44:18 -07:00
Peter Steinberger
48639663b0
chore(release): prepare 2026.8.1 ( #120375 )
2026-08-07 18:44:12 -07:00
Peter Steinberger
f9d9d1225a
refactor(channels): own the lifecycle status contract in SDK patch factories ( #118795 )
...
* refactor(sdk): add channel lifecycle patch factories
* refactor(channels): adopt lifecycle patches in a-m
* refactor(channels): adopt lifecycle patches in n-z
* refactor(runtime): lifecycle-own ambient registries
* test(slack): assert lifecycle factory fields
* fix(sdk): preserve lifecycle patch extras types
* test(zalouser): widen lifecycle status sink
* test(irc): avoid shadowed status patch
* fix(zalo): reuse account-agnostic media route
* fix(gateway): accept explicit channel ready recovery
* test(qa): assert terminal Slack block fact
* test(qa): restore Slack blocked lifecycle scenario
* test(gateway): lock explicit lifecycle recovery contract
2026-08-03 12:39:48 -07:00
Jesse Merhi
68be0e3378
feat: enable rich setup controls in custodian chat ( #114631 )
...
* feat(protocol): carry the awaited wizard step on the chat result
* fix(system-agent): strip sensitive wizard prefill from chat results
* fix(wizard): keep setup secrets server-side
* test(wizard): preserve prompt mock typing
* fix(ui): add reveal toggle to wizard secrets
* refactor(ui): adopt Carapace sensitive input
* fix(ui): hide revealed sensitive input mask
* test(twitch): cover environment-only setup
* feat(custodian): render rich wizard steps
* fix(custodian): validate wizard text replies
* feat(custodian): submit typed wizard answers
* refactor(gateway): isolate custodian chat turns
* fix(gateway): accept session engine adapter
* fix(ui): narrow wizard control values
* refactor: simplify rich wizard answer flow
* fix(custodian): recover evicted wizard sessions
* docs: note custodian rich setup controls
* test(gateway): split wizard answer coverage
2026-08-03 22:18:27 +10:00
Peter Steinberger
4c66ed5615
feat(channels): lifecycle wave 2 — fifteen more channels publish recorded lifecycle ( #118298 )
...
* feat(channels): publish lifecycle from existing status sinks
* feat(channels): thread lifecycle through provider monitors
* fix(mattermost): keep lifecycle status helper private
* fix(matrix): preserve terminal lifecycle during startup cleanup
* fix(matrix): reject invalid tokens during startup
* test(mattermost): drop unused vi import
2026-08-02 17:30:56 -07:00
Peter Steinberger
846bef946d
fix(channels): tighten probe and delivery lifecycles ( #117812 )
...
* fix(channels): tighten probe and delivery lifecycles
* test(zalo): type probe fetch mocks
2026-08-01 22:12:24 -07:00
Peter Steinberger
568ea29d2e
refactor(plugins): inherit shared package boundary settings ( #117474 )
2026-08-01 09:11:09 -07:00
Ayaan Gazali
11069c3df5
fix(channels): config validation rejects documented channels.<id>.configWrites on 13 channels ( #117206 )
2026-08-01 15:33:16 +08:00
Peter Steinberger
9e4381eb1c
refactor(channels): unify bundled channel setup contracts ( #117106 )
...
* refactor(channels): canonicalize bundled setup contracts
* test(matrix): use scoped environment fixtures
2026-07-31 16:57:29 -07:00
Peter Steinberger
986e5d1758
refactor(channels): share ingress retention defaults ( #115824 )
2026-07-29 06:24:30 -04:00
Peter Steinberger
bde6b166c0
refactor(channels): deduplicate ingress monitor shells ( #115792 )
...
* refactor(channels): deduplicate ingress monitor shells
* fix(channels): preserve ingress error overload types
* fix(channels): type ingress error overload implementation
* chore(plugin-sdk): ratchet ingress error surface
2026-07-29 05:33:00 -04:00
Peter Steinberger
302f262e6b
refactor: deduplicate extension normalization primitives ( #115650 )
...
* refactor(plugins): reuse SDK normalization primitives
* fix(ci): repair code-mode matrix checks
* fix(ci): satisfy code-mode matrix gates
* fix(ci): use matrix evidence export
* fix(ci): validate matrix evidence artifact
2026-07-29 04:10:06 -04:00
Peter Steinberger
c092ec437c
refactor: remove duplicate runtime and plugin paths ( #115483 )
2026-07-28 22:06:04 -04:00
Peter Steinberger
ca4727e1a1
fix(twitch): use managed runtime dependencies ( #115147 )
2026-07-28 07:08:56 -04:00
Peter Steinberger
08b1ff73e2
refactor(channels): fix account resolution and setup isolation ( #114395 )
...
* refactor(channels): fix account resolution and setup isolation
* fix(channels): keep account resolvers safely destructurable
2026-07-27 03:49:37 -04:00
Peter Steinberger
f6131a4fbf
build(deps): remove npm shrinkwrap; mirror pnpm lock into transient package locks ( #114006 )
...
* build(deps): remove npm shrinkwrap; mirror pnpm lock into transient package locks
npm 12 removed shrinkwrap (command + tarball/root loading). Delete all 82
committed npm-shrinkwrap.json files and stop publishing lockfiles; keep
pnpm-lock.yaml as the single reviewed dependency boundary. The generator
becomes scripts/generate-npm-package-lock.mjs and feeds plugin bundling via
a transient package-lock.json + npm ci (works on npm 11 and 12). Tarball
validation treats the published 2026.7.2 beta train as a shrinkwrap
transition; self-update npm detection now uses install topology instead of
the shipped shrinkwrap.
* fix(deps): repair lint, deadcode, and test-type lanes for the npm 12 migration
- sort integrity comparisons with an explicit comparator (oxlint)
- keep resolveBunGlobalNodeModules module-local (knip unused-export gate)
- model npm pack --json as npm<=11 array / npm 12 name-keyed object
- default calver destructuring in the tarball test fixture
2026-07-26 01:29:55 -04:00
Peter Steinberger
446816f751
test: table-drive followup scenarios, centralize sanitizer wiring, remove obsolete negatives ( #113583 )
...
* test(auto-reply): table-drive followup runner scenarios
* test(channels): centralize sanitizer wiring coverage
* test: remove obsolete negative coverage
2026-07-25 02:14:44 -07:00
Peter Steinberger
a5d758e74b
refactor(plugin-sdk): share channel DM policy setup ( #113537 )
2026-07-25 01:00:53 -07:00
Peter Steinberger
acd92f6a3d
chore(deps): refresh repository dependencies ( #112453 )
...
* build(deps): update QA broker dependency
* build(deps): refresh repository dependencies
* build(deps): reconcile rebased shrinkwraps
* test(plugins): remove stale loader test state
* test(deps): stabilize updated dependency coverage
* fix(swift): use caller-isolated TaskLocal overload
* build(deps): regenerate rebased shrinkwraps
* test(msteams): preserve DNS validation in fetch helper
* fix(deps): avoid vulnerable optional image stack
* test(deps): validate generated LRU override
* refactor(ui): extract chat resizable divider
* test(ui): update divider ownership path
* fix(matrix): retain restart-compatible SDK
* style(cron): format update test
2026-07-23 16:17:13 +00:00
Peter Steinberger
b67217ffab
fix(channels): stop leaking markdown on plain-text transports ( #112926 )
...
* fix(channels): unify plain-text markdown projection
* fix(synology-chat): satisfy link formatter lint
* test(ui): repair sidebar catalog activity fixture
2026-07-23 02:13:55 -04:00
Jesse Merhi
4a2a600809
feat(channels): add channel-owned setup contracts ( #112176 )
...
* feat(channels): add channel-owned setup contracts
* test(channels): align legacy setup fixtures
* chore(channels): regenerate config and SDK baselines after rebase
* fix(update): run fresh doctor after current-process core changes
* fix(channels): align add pre-scan with execution precedence
* style(cli): format channels-cli test additions
* fix(channels): restore option-before-positional channel resolution via metadata arity scan
* fix(channels): keep help flags out of metadata arity escalation
* test(update): mock fresh post-update doctor in current-process suites
* style: format review fixes and correct entrypoint mock type
* fix(channels): register only modern contract options for dual-publishing plugins
* test(update): align downgrade suites with fresh-doctor child invocation
* docs(channels): record empty-contract and input-forwarding invariants
* fix(line): keep the shipped --token switch as a channel access token alias
* fix(signal): stop treating exact cross-family loopback endpoints as bind-aligned
* chore(config): regenerate docs config baselines after second rebase
* style: format rebased channels add tests
* fix(channels): enforce field-key and flag-name agreement in setup contracts
* fix(signal): detect container endpoints for bare --http-url setup
* fix(signal): ignore unconfigured accounts in transport collision checks
* fix(channels): validate negated setup flags in contract and normalizer
* fix(signal): preserve existing transport kind when setup detection is unreachable
* style(signal): use direct boolean check in collision guard
* style(signal): type test config literals
* docs(update): record two-read design of fresh-doctor validation gate
* fix(channels): satisfy post-rebase architecture gates
* docs: refresh channel setup map
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-22 19:57:42 -04:00
Peter Steinberger
e1d5d3dc16
refactor(channels): move single-account promotion keys to plugin declarations ( #112293 )
...
* refactor(channels): move single-account promotion keys to plugin declarations
* fix(channels): keep legacy promotion tier for undeclared setup adapters
* fix(channels): keep plugin discovery lazy in setup promotion helpers
* fix(channels): resolve bundled promotion surfaces from setup-only artifacts
* test(matrix): use vi.stubEnv in setup test env helper
2026-07-21 06:48:30 -07:00
Peter Steinberger
c7e7ac2728
refactor: remove expired plugin compatibility surfaces ( #111451 )
...
* docs(secrets): remove retired web credential paths
* refactor(web): remove retired provider compatibility paths
* refactor(providers): delete retired compatibility routes
* refactor(secrets): remove retired credential aliases
* refactor(plugin-sdk): delete retired compatibility surfaces
* docs(plugin-sdk): remove retired migration guidance
* chore(plugin-sdk): refresh rebased surface budgets
* chore(plugin-sdk): refresh API removal baseline
* refactor(compat): migrate retired internal callers
* chore(plugin-sdk): refresh current-main baselines
* test(config): migrate plugin-owned secret assertions
* test(gateway): narrow plugin secret refs
* fix(plugin-sdk): preserve private boundary type identity
* chore(compat): remove stale sweep references
* chore(lint): lower max-lines budget
* refactor(secrets): remove unused web helper
* build(plugin-sdk): drop removed compat entries
* chore(plugin-sdk): refresh rebased API baseline
* chore(plugin-sdk): use Linux API baseline hash
* fix(plugin-sdk): preserve private bundled build entries
* fix(plugin-sdk): package private runtime facades
* fix(plugins): preserve external credential contracts
2026-07-19 11:04:48 -07:00
Peter Steinberger
938e3d5f20
refactor(channels): share durable ingress monitor ( #111186 )
...
* refactor(signal): share durable ingress monitor
* refactor(slack): share durable ingress monitor
* refactor(discord): share durable ingress monitor
* refactor(imessage): share durable ingress monitor
* refactor(twitch): share durable ingress monitor
* refactor(tlon): share durable ingress monitor
2026-07-18 21:33:09 -07:00
Peter Steinberger
e04ea7916c
feat(twitch): preserve accepted chat through local crashes ( #110852 )
...
* feat(twitch): add durable ingress queue
* fix(twitch): satisfy ingress type boundaries
2026-07-18 18:50:56 +01:00
Peter Steinberger
31ed59bdf6
feat: keep main agents aware of group activity ( #110332 )
...
* feat(sessions): auto-watch group activity from main
* feat(sessions): allow watchers to read watched sessions
* fix(sessions): skip group watches for system turns
* fix(sessions): preserve watched session semantics
* fix(channels): propagate effective dm scope
* fix(sessions): canonicalize main watch identity
* fix(sessions): distinguish ambient group watches
* fix(sessions): revoke ineligible ambient watches
* chore: drop CHANGELOG edit (release generation owns it)
2026-07-18 04:06:58 +01:00
Peter Steinberger
0e792b6de3
refactor(channels): centralize inbound orchestration and remove internal compat ( #109716 )
...
* refactor(channels): centralize inbound turn orchestration
* refactor(runtime): remove stale compatibility paths
* chore(guards): reject internal deprecated API use
* refactor(channels): simplify core turn planning
* chore(guards): keep deprecated checks boundary-focused
* refactor(memory): keep modern config off compat barrel
* fix(msteams): preserve feedback learning
* test(channels): align modern inbound fixtures
* refactor(channels): finish modern inbound migration
* refactor(channels): tighten core inbound kernel
* fix(channels): preserve turn assembly narrowing
* test(sdk): keep runtime mock binding immutable
* test(matrix): isolate read policy runtime
* test(msteams): mock canonical reply factory
* test(slack): mock core inbound turn dispatch
* test(telegram): inject core session recorder
* test(signal): inject core session recorder
* test(googlechat): assert canonical inbound routing
* test(synology-chat): align core turn fixture
* fix(sdk): preserve direct DM runtime compat
* refactor(channels): own inbound envelope compat in core
* refactor(channels): trim inbound dispatch seams
* refactor(channels): remove redundant async wrappers
* test(synology-chat): type canonical dispatcher mock
* refactor(channels): remove remaining dead compat seams
* chore(sdk): refresh API baseline after rebase
* fix(channels): preserve direct DM identity metadata
2026-07-17 00:56:46 -07:00
Peter Steinberger
44314c9451
refactor(channels): table-drive setup and control-plane helpers ( #109028 )
...
* refactor(channels): table-drive setup credentials, config schemas, doctor detectors, status issues
* refactor(channels): control-plane tables (rest)
* fix(plugin-sdk): refresh surface budgets after rebase
* style(plugin-sdk): format credential helpers
* fix(channels): preserve generic schema refinement types
* fix(channels): preserve schema input and output inference
* fix(clickclack): forward credential patch fields
* test(plugin-sdk): use redacted credential fixtures
* fix(plugin-sdk): refresh API baseline after inference fix
* fix(channels): keep multi-account envelope optional
* fix(channels): preserve policy validation invariants
* fix(extensions): remove stale awaits from file checks
* style(qqbot): format synchronous file check
* fix(config): refresh bundled channel metadata
* fix(qqbot): reject unsupported pairing policy
2026-07-16 07:17:01 -07:00
VectorPeak
eb31350442
fix(twitch): preserve intraword underscores in outbound text ( #108548 )
...
* fix(twitch): preserve intraword underscores
Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
* fix(twitch): tighten underscore emphasis boundaries
Preserve multiline emphasis stripping and combining-mark identifiers.
Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
---------
Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-16 02:00:30 -07:00
Peter Steinberger
bae9752c5a
refactor(deadcode): enforce repository hard zero ( #108641 )
2026-07-15 22:40:00 -07:00
Peter Steinberger
b93f4bb3ac
refactor: privatize Twitch and SMS internals ( #107737 )
...
* refactor(twitch): privatize internal plugin surfaces
* refactor(sms): privatize internal plugin surfaces
* chore(deadcode): refresh unused-export baseline
2026-07-14 12:55:35 -07:00
Peter Steinberger
97df597688
fix(twitch): abort timed-out user lookups ( #107360 )
...
Co-authored-by: Alix-007 <li.long15@xydigit.com >
2026-07-14 04:22:34 -07:00
Alix-007
a9c70f3956
fix(twitch): time out Helix user resolution lookups ( #105883 )
...
* fix(twitch): time out Helix user resolution lookups
* test(twitch): satisfy resolver lint guards
* test(twitch): satisfy resolver account typing
* test(twitch): prove resolver recovery after timeout
* test(twitch): use explicit credential placeholder
* chore(changelog): defer Twitch note to release
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-14 02:56:39 -07:00
Peter Steinberger
774d5249cc
test: eliminate unchecked TypeScript casts ( #105804 )
2026-07-12 18:08:26 -07:00
Peter Steinberger
81941f2d68
test: enable noUncheckedIndexedAccess for extension tests ( #105343 )
2026-07-12 12:48:22 +01:00
Peter Steinberger
e34bff2276
refactor(plugin-sdk): collapse internal config-schema facade usage onto one module ( #104665 )
2026-07-11 13:00:53 -07:00
Peter Steinberger
dba64d574f
chore(release): set version to 2026.7.2
2026-07-11 04:00:49 +01:00
Peter Steinberger
790cd2aff2
fix(twitch): preserve UTF-16 pairs in outbound chunks ( #104030 )
2026-07-10 18:20:29 -07:00
clawsweeper[bot]
90b68536c4
fix(twitch): strip internal tool-trace banners from outbound text ( #103109 )
...
* fix(twitch): strip internal tool-trace banners from outbound text
Co-authored-by: Masato Hoshino <246810661+masatohoshino@users.noreply.github.com >
* fix(twitch): strip internal tool-trace banners from outbound text
---------
Co-authored-by: clawsweeper <274271284+clawsweeper[bot]@users.noreply.github.com>
Co-authored-by: Masato Hoshino <246810661+masatohoshino@users.noreply.github.com >
2026-07-09 22:39:03 +01:00
Peter Steinberger
a2a68d154b
fix(agent): preserve explicit recipient sessions ( #101507 )
...
* fix(agent): honor recipient session routing
Co-authored-by: vincentkoc <25068+vincentkoc@users.noreply.github.com >
Co-authored-by: pingfanfan <pingfan.work@gmail.com >
* fix(agent): preserve canonical recipient routes
* fix(agent): require exact recipient routes
Co-authored-by: vincentkoc <25068+vincentkoc@users.noreply.github.com >
Co-authored-by: pingfanfan <pingfan.work@gmail.com >
* fix(agent): harden recipient route resolution
* fix(imessage): require canonical recipient handles
* fix(agent): refine provider recipient exactness
* fix(agent): bound direct alias session routing
* fix(signal): preserve direct alias route type
* fix(agent): honor binding-scoped recipient sessions
* fix(routing): honor configured main session aliases
* fix(clickclack): align account-owned session routes
* fix(twitch): preserve canonical recipient sessions
* fix(routing): isolate stable outbound identities
* chore: defer recipient session changelog
* fix(sms): use dedicated channel SDK facade
---------
Co-authored-by: vincentkoc <25068+vincentkoc@users.noreply.github.com >
Co-authored-by: pingfanfan <pingfan.work@gmail.com >
2026-07-07 10:07:13 +01:00
Peter Steinberger
614e87cce1
chore: update dependencies ( #100027 )
2026-07-04 14:56:50 -04:00
xingzhou
741d9524be
fix: outbound recovery can replay already sent replies ( #99600 )
...
* fix(outbound): avoid replaying sent recovery deliveries
* fix(outbound): persist recovery send state before ack
Co-authored-by: zhang-guiping <zhang.guiping@xydigit.com >
* fix(outbound): preserve partial send evidence across adapters
* test(line): cover multi-send delivery progress
* fix(outbound): preserve repeated receipt result multiplicity
* test(heartbeat): expect delivery progress callback
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-04 01:09:12 -07:00
Vincent Koc
66e676d29b
chore(release): close out 2026.6.11 on main
2026-06-30 11:31:08 -07:00
Vincent Koc
c16bb8725a
fix(channels): keep text previews UTF-16 safe
2026-06-30 11:04:32 -07:00
Vincent Koc
0671c08900
chore(release): close out 2026.6.10 on main ( #96271 )
...
* chore(release): close out 2026.6.10 on main
* chore(release): align native app metadata for 2026.6.10
* chore(release): sync Android 2026.6.10 notes
* docs(changelog): preserve 2026.6.9 history
* docs(changelog): preserve 2026.6.9 history
2026-06-24 11:51:14 +08:00
Patrick Erichsen
0feffda3fc
fix(plugins): remove simpleicons icon color paths ( #95987 )
2026-06-23 12:16:02 -07:00
Patrick Erichsen
0a97f73402
feat: add bundled plugin icon manifest URLs ( #95845 )
2026-06-22 22:14:18 -07:00
Vincent Koc
b039e949b6
chore(release): close out 2026.6.9
2026-06-21 12:24:15 +08:00
Vincent Koc
f83693490b
fix(twitch): clear status after startup failures
2026-06-17 17:45:16 +02:00