Commit Graph

1709 Commits

Author SHA1 Message Date
Peter Steinberger 8c676623b7 fix(discord): open newest activity widget when launch ID is missing (#108817)
* fix(discord): open latest activity widget on fallback

* chore: remove release-owned changelog entry

* fix(discord): order activity fallback by delivery

* fix(discord): require atomic widget delivery updates

* test(discord): type activity delivery fixtures

* test(discord): model missing atomic state support

* fix(discord): order activity fallback by message snowflake

* docs(discord): clarify activity fallback order
2026-07-16 09:11:55 -07:00
Peter Steinberger 14bb0b4e52 refactor(discord): deprecate abort signal helper (#109166) 2026-07-16 09:08:00 -07:00
Peter Steinberger c46cc1e2d4 refactor(channels): unify inbound replay protection (#109117)
* refactor(channels): unify inbound replay-guard orchestration on shared factory

* fix(plugin-sdk): bind replay-guard settlement to claim handles

* fix(plugin-sdk): claim-handle settlement (rest)

* fix(discord): align skipped queue cleanup

* style(feishu): simplify bot menu claim settlement

* refactor(plugin-sdk): extract replay dedupe contracts
2026-07-16 08:46:34 -07:00
xingzhou d15e84610a fix(discord): keep voice allowlists from granting owner authority (#108813)
* fix(discord): keep voice allowlists from granting owner authority

* fix(discord): normalize wildcard voice admission

* refactor(discord): separate voice admission from ownership

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 08:44:42 -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
Yehonal 175181f42f fix(discord): suppress typing when hooks silently handle a turn (#108449)
* fix(discord): defer typing until reply dispatch is accepted

* fix(discord): preserve typing for accepted fast replies

* refactor(discord): create typing feedback after admission

* refactor(discord): keep queue key resolver internal

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 05:30:42 -07:00
Peter Steinberger 16d1f487fe feat(widgets): unify show_widget across surfaces (#108983)
* feat(widgets): unify show_widget across surfaces

* docs(canvas): keep lazy show_widget descriptor in sync with the loaded tool
2026-07-16 05:24:11 -07:00
Peter Steinberger 990e8d24b0 feat(presentation): hosted-widget launch via typed web-app actions (#108927)
* feat(presentation): support hosted widget actions

* refactor(discord): route widget launches through presentation

* chore: keep changelog release-owned

* test(interactive): type the invalid web-app boundary case explicitly

* test: type web-app action fixtures against the split union

The two-member web-app union no longer accepts a distributed
type: "url" | "web-app" literal or an empty receipt in typed
callbacks; use explicit action casts and the Discord receipt factory.
2026-07-16 04:35:31 -07:00
Peter Steinberger 66604df9b6 refactor(channels): share retry helpers and remove dead state probes (#108903)
* refactor(channels): generalize channel retry runner and retry-after parsing; drop dead configured-state probes

* fix(channels): align retry and metadata contracts
2026-07-16 04:03:15 -07:00
Hosan 7bc43f50b7 fix(message): reject invalid read targets without fallback (#108637)
* fix(message): fail closed on invalid read targets

* fix(message): scope read channel validation

* fix(message): fail closed on explicit read scope

---------

Co-authored-by: Hosan <200961079+hosanxiv@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 03:36:32 -07:00
wangmiao0668000666 8090cb1c64 fix(discord): honor abortSignal during gateway READY retry backoff (#108561)
* fix(discord): honor abortSignal during gateway READY retry backoff

* fix(discord): avoid __testing alias to satisfy Knip production scan

* test(discord): make READY abort proof deterministic

Co-authored-by: wangmiao0668000666 <wang.miao86@xydigit.com>

* fix(retry): support unref abort sleeps

Co-authored-by: wangmiao0668000666 <wang.miao86@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 03:14:46 -07:00
Peter Steinberger 05c2701e3d refactor(plugin-sdk): share widget HTML validation helpers (#108807)
* refactor(plugin-sdk): add widget HTML helpers

* refactor(plugins): share widget HTML validation
2026-07-16 03:13:29 -07:00
Peter Steinberger 8f1760b667 test(discord): restore OpenClawConfig type import in channel.policies.test.ts
The max-lines split dropped the type-only import that two casts still
use, failing check-test-types.
2026-07-16 02:54:06 -07:00
Peter Steinberger b28070543a test(discord): split channel target resolver tests (#108857) 2026-07-16 02:48:15 -07:00
Peter Steinberger 06795a669b test(discord): extract mock call helpers (#108853) 2026-07-16 02:47:30 -07:00
Peter Steinberger b8c1ab1979 test(discord): split channel policy describes out of channel.test.ts
channel.test.ts crossed the max-lines lint budget (1002 > 1000) after
#108584; move the mock-free bindings/security/groups describes into
channel.policies.test.ts instead of suppressing.
2026-07-16 02:42:32 -07:00
Josh Avant e322edccfa fix(discord): resolve named agent delivery targets (#108584)
* fix(discord): resolve agent delivery targets

* fix(outbound): preserve heuristic target fallback

* fix(outbound): keep delivery helpers private
2026-07-16 02:13:10 -07:00
Peter Steinberger 00d20fb798 test(discord): isolate conversation runtime spies 2026-07-16 10:08:02 +01:00
Peter Steinberger a0f8f451cd refactor(discord): reuse shared probe body deadline (#108768) 2026-07-16 01:44:24 -07:00
Peter Steinberger 54f8957e12 fix(discord): Activities open correctly from packaged builds (#108725)
* fix(discord): resolve activity SDK from plugin root

* chore: keep release notes out of PR
2026-07-16 01:00:22 -07:00
NIO e36f586325 fix(discord): reject invalid auto-archive durations before REST (#107610) 2026-07-16 00:56:34 -07:00
Alix-007 ccda5440e1 fix(discord): bound stalled probe response reads (#106036)
* fix(discord): bound stalled probe response reads

* fix(discord): bound application probe bodies

* fix(discord): preserve probe result within status budget

* style(discord): format probe timeout test

* chore(deadcode): allowlist test-only timeout constant exports

* refactor(discord): keep status probe budget in loader

* fix(discord): enforce total probe deadline

Co-authored-by: Alix-007 <li.long15@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 00:46:07 -07:00
Peter Steinberger dde90a345a refactor(plugin-sdk): narrow wildcard barrels to explicit used exports (#108440)
* refactor(plugin-sdk): narrow wildcard barrels to explicit used exports

* refactor(tools): delete dead tool-planning module exposed by barrel narrowing

* fix(plugin-sdk): restore deprecation tag on OpenClawSchemaType alias

* test(agents): drop test for deleted runtime proxy module

* refactor(tools): trim descriptor types to cache consumers

* refactor(deadcode): harvest exports orphaned by barrel narrowing

* refactor(deadcode): harvest exports orphaned by barrel narrowing (rest)

* fix(agents): restore sdk imports and test markers via public predicate

* fix(plugin-sdk): named type re-exports in plugin-entry; trim types barrel precisely

* chore(plugin-sdk): account unmasked deprecated provider types in budgets

* fix(plugins): name star-only type rows for dts bundling

* fix(plugins): restore host-hook surface; unexport internal api compositions

* fix(plugins): named type imports for api composition; restore needed source exports

* fix(plugins): knip-visible type imports for registry surfaces

* test: adapt tests to privatized media and command internals

* fix(qa-lab): re-export snapshot conversation type

* style: format sessions sdk imports

* fix(plugins): restore smoke entry export; pin budgets to exact actuals

* fix(plugins): canonical smoke-entry import; drop orphaned root shims

* fix(plugins): allowlist manifest probe, repoint qa web import, drop dead browser barrels

* fix(plugin-sdk): pin codex auth marker and scaffold provider type

* fix(qa-lab): keep web-facing model-selection shim within boundary rules

* fix(plugin-sdk): preserve merged contracts through narrowed barrels

* chore(plugin-sdk): pin post-rebase surface budgets
2026-07-16 00:45:23 -07:00
NIO cacf08364f fix(discord): add timeout to guarded gateway metadata fetches (#104580)
* fix(discord): add timeout to guarded gateway metadata fetches

* test(discord): release stalled metadata lookup

* test(discord): use inert token fixture

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 00:43:12 -07:00
Peter Steinberger 527c8cee0c feat(discord): adapt voice wake names to room size (#108696)
* feat(discord): adapt voice wake names to room size

* chore(discord): defer voice release note

* chore(protocol): regenerate session create model
2026-07-16 00:41:26 -07:00
Alix-007 03e59c8c27 fix(discord): bound event listener slots after timeout (#106398)
* fix(discord): bound event listener slots after timeout

* fix(discord): surface late listener failures
2026-07-15 23:58:47 -07:00
Peter Steinberger 513200125d feat(channels): render live plan checklists from typed update_plan snapshots (#108597)
* feat(channels): render live plan checklists from typed update_plan snapshots

Codex, Copilot, CLI, and embedded update_plan events now carry typed
{step, status} snapshots end to end instead of flattened strings. Slack,
Discord, Telegram, Matrix, and MS Teams render a live checklist in
progress drafts; Slack native task cards show the real plan with
position-keyed rows and id reconciliation. The embedded update_plan tool
is default-on for every model (tools.experimental.planTool: false opts
out). The shipped onPlanUpdate steps: string[] SDK field stays populated
during a deprecation window alongside the canonical planSteps.

* fix(auto-reply): align plan bridge types with SDK callback contract

* fix(auto-reply): split agent event bridge module and fix plan type boundaries

* fix(channels): satisfy oxlint on plan checklist helpers
2026-07-15 22:00:21 -07:00
Peter Steinberger 2ab4f9f370 fix(discord): resolve forum thread activity targets (#108603)
* fix(discord): resolve activity thread targets

* chore: keep changelog release-owned
2026-07-15 21:29:34 -07:00
Peter Steinberger b624abfc69 fix(discord): stop channel presence greetings for unrelated guild members (#108448)
* fix(discord): scope presence wakes to channel viewers

* chore: remove release-owned changelog entry

* fix(discord): bound presence permission lookups

* test(discord): bind presence fetch mock

* fix(discord): keep presence lookup overflow retryable
2026-07-15 13:51:48 -07:00
Peter Steinberger 023126b802 test(discord): isolate component registry runtime (#108410)
* test(discord): isolate component registry runtime

* test(discord): keep runtime reset test-local
2026-07-15 11:17:34 -07:00
Peter Steinberger f3adeb2ac6 fix(discord): move command deploy cache to sqlite (#108381) 2026-07-15 10:03:09 -07:00
Peter Steinberger ddc9ec3f36 feat(discord): opt-in Discord Activities widget support (#107442)
Adds a Discord Activities integration so an agent can show a self-contained
HTML widget to Discord users, opened as a sandboxed Activity inside the client.
Off by default: routes, the discord_widget tool, and the launch handler register
only when channels.discord.activities is configured. OAuth identifies the user
and gates on the account allowlist; widget lookup is capability- or
instance-validated; token exchange is rate-limited; widget HTML runs in a
no-network sandboxed iframe.
2026-07-15 04:07:46 -07:00
clawsweeper[bot] 3a208a5068 fix(discord): prevent presence wake floods after reconnects (#107969)
* feat(discord): throttle online-presence events after gateway reconnects

After a Discord gateway (re)connect the presence replay burst emitted one
system event per member, waking the agent each time. Add a per-account
emission gate: a post-reconnect suppression window (default 5 min), a
sliding-window burst limit (default 8/60s, logged once per episode), and
a configurable per-user greeting cooldown (default 8h). New guild
presenceEvents knobs: cooldownSeconds, reconnectSuppressSeconds,
burstLimit, burstWindowSeconds.

* fix(discord): preserve presence throttle retries

* fix(discord): preserve presence throttle retries

* fix(discord): scope presence throttle per guild

Co-authored-by: openclaw-clawsweeper[bot] <openclaw-clawsweeper[bot]@users.noreply.github.com>

* fix(discord): keep presence gate internals private

Co-authored-by: openclaw-clawsweeper[bot] <openclaw-clawsweeper[bot]@users.noreply.github.com>

---------

Co-authored-by: openclaw-clawsweeper[bot] <openclaw-clawsweeper[bot]@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-14 22:02:53 -07:00
Peter Steinberger 3ce986d526 fix(ci): restore Discord architecture and max-lines gates (#108013)
* fix(discord): break channel info cache cycle

* chore(ci): prune stale Discord max-lines baseline
2026-07-14 21:52:09 -07:00
Peter Steinberger 3932a6038c refactor(discord): privatize internal plugin surfaces (#108003)
* refactor(discord): privatize internal plugin surfaces

* chore(deadcode): update export baseline
2026-07-14 21:26:00 -07:00
Peter Steinberger 894cc604a5 refactor(core): declare outbound target grammar on the messaging adapter (batch 2) (#107953)
* refactor(core): declare outbound target grammar on the messaging adapter (batch 2)

* test(outbound): drop a useless spread in the comparison fixture
2026-07-14 20:09:00 -07:00
Peter Steinberger 5579f009fb refactor(channels): converge internal group-policy drift onto the scope tree (#107865)
* refactor(channels): converge internal group-policy drift onto the scope tree

* chore(plugin-sdk): refresh API baseline hash for scope-key exports

* fix(config): avoid shadowing the scopeKey export in the case-insensitive lookup
2026-07-14 18:30:04 -07:00
Peter Steinberger af3d796e19 refactor(discord): trim internal exports (#107714)
* refactor(discord): trim internal exports

* refactor(discord): use canonical approval helper

* chore(deadcode): refresh export baseline
2026-07-14 11:34:02 -07:00
Peter Steinberger f81f9d8570 chore: enforce max-lines suppression ratchet (#107315)
* ci: enforce max-lines suppression ratchet

* chore: prune stale max-lines suppression

* fix: close max-lines ratchet enforcement gaps

* fix: harden max-lines ratchet checks

* fix(ci): satisfy max-lines ratchet checks

* style: format max-lines declarations

* fix(ci): match oxlint suppression grammar

* test: isolate max-lines git fixtures

* chore: prune resolved max-lines debt

* test: skip newline path fixture on Windows

* fix: harden max-lines suppression ratchet

* chore: refresh max-lines baseline

* fix: close max-lines ratchet bypasses

* fix: derive ratchet base from PR merge tree

* fix: support older Git in staged ratchet

* fix: align max-lines declarations and baseline

* chore: refresh max-lines baseline for current main

* fix: exclude generated wizard locales from max-lines

* chore: prune resolved max-lines debt
2026-07-14 09:27:02 -07:00
Peter Steinberger f59a0352b3 feat(discord): route online presence arrivals to agents (#107451)
* feat(discord): add online presence agent events

* fix(discord): harden presence event payloads

* fix(discord): satisfy presence lint contracts

* fix(heartbeat): run notification event wakes

* fix(discord): use wake heartbeat contract

* fix(discord): harden presence snapshot delivery

* chore: remove release-owned changelog entry

* fix(discord): remove unused presence type export

* fix(discord): keep presence config below loc limit

* fix(discord): reserve presence cooldown atomically
2026-07-14 07:22:11 -07:00
Peter Steinberger cd7290bc29 fix(discord): show only agent status in progress drafts (#107338)
* fix(discord): show agent status only in progress drafts

* test(discord): preserve explicit progress label expectation

* test(telegram): update default progress label fixtures

* test(ui): use supported hidden-label assertions
2026-07-14 02:52:01 -07:00
Peter Steinberger b940339c32 fix: use plain agent progress labels (#107260)
* fix(channels): simplify agent progress labels

* chore: keep changelog release-owned

* chore: refresh bundled channel metadata
2026-07-14 01:00:24 -07:00
Peter Steinberger b34bba8e57 refactor(channels): migrate the remaining nine group-policy walkers onto the scope tree (#107181)
* refactor(channels): migrate irc, nextcloud-talk, zalouser, slack, and matrix group policy onto the scope tree

* fix(irc): drop unused tree binding in group match

* fix(zalouser): keep wildcard lookup opt-in for explicit-only candidates

* fix(zalouser): adapter opts into the wildcard fallback candidate

* refactor(channels): migrate feishu, msteams, and discord group policy onto the scope tree and drop the core discord duplicate

* fix(msteams): restore the cross-team scan fallback for policy-less matched teams

* fix(feishu): keep the adapter's zod-typed group config for the scope tree

* revert(core): keep the discord require-mention fallback until stage 3 makes it provably redundant

* chore(matrix): drop the now-unused channel entry match re-export

* refactor(telegram): migrate group policy onto the scope tree

* test(telegram): keep the bot token fixture off secret-scanner patterns

* test(telegram): use a computed key for the bot token fixture

* test(telegram): assemble the bot token fixture indirectly for scanner and lint
2026-07-13 23:56:35 -07:00
Peter Steinberger 8d465d71b5 fix(channels): progress drafts only for long tasks, with the model's own preamble as the status headline (#106026)
* fix(channels): time-gate progress drafts and defer narration until visible

Progress drafts started immediately on the second work event, so the 5s
initial delay never filtered small fast tasks and Discord showed narrated
status for turns that finish in seconds. The gate is now purely time-based
(explicit startNow paths like approvals/patches are unchanged), and the
progress narrator no longer spends utility-model completions before the
channel draft is visible - notes buffer so the first visible narration has
full context.

Surface: src/channels/streaming.ts gate, src/auto-reply/reply/progress-narrator.ts,
Discord draft-preview wiring; test updates across discord/matrix/msteams/slack.

Refs #105872

* feat(channels): model-preamble status headline for progress drafts

In progress mode the draft's status line is now the model's own typed pre-tool
preamble whenever it is fresh (always on, no new config); utility-model
narration fills the slot only when the model has been quiet for ~20s or emits
no preamble. Preambles never start the draft early - the time gate still owns
the small-vs-big decision - and narration generation is suppressed while a
fresh preamble exists, saving utility calls. Discord and Telegram render the
headline; the opt-in streaming.progress.commentary lane and its receipt
counters are unchanged.

Refs #105872

* refactor(channels): split status-text and telegram preview helpers to honor the LOC ratchet

The LOC ratchet forbids raising baseline entries, so the headline feature's
growth is paid for with clean splits: reasoning/commentary text normalization
moves to src/channels/progress-draft-status-text.ts, Telegram progress preview
rendering to extensions/telegram/src/progress-draft-preview.ts, and small
ownership moves (formatCompactionModelRef, resolveFollowupAbortSignal, shared
CLI preamble gate, Discord preamble item-event handling) shrink the runners
back under their pins. Baseline entries lowered to exact new counts; the
compositor entry is removed (424 lines, under the 500 ceiling).

Refs #105872

* test(auto-reply): add resolveFollowupAbortSignal to the queue mock factory

The explicit ./queue.js vi.mock factory must export every binding prod touches;
the relocated resolveFollowupAbortSignal was missing and failed the whole
followup-runner suite.

Refs #105872

* fix(channels): sanitize preamble headlines and retry skipped narration

Review findings: preamble headlines now strip inline delivery directives and
reject silent-control tokens (NO_REPLY) before rendering, sharing the
commentary sanitizer; rejected input keeps the previous valid headline. The
narrator schedules cancellation-aware retries when a run is skipped for draft
invisibility or preamble freshness, so single long tool calls still narrate
and the ~20s utility filler fires without needing another event. Silent
preambles no longer stamp freshness or add narration notes.

Refs #105872

* fix(channels): bound narrator visibility polling and gate Telegram headline mode on accepted preambles

Visibility retries stop after 30 one-second attempts (turn completion has no
narrator disposal signal) and re-arm on new activity; Telegram derives its
headline-rendering state from the compositor's sanitized headline instead of
raw payload text, so directive-only or NO_REPLY preambles keep structured
tool-line rendering. Docs scope the preamble headline to Discord and Telegram.

Refs #105872

* fix(telegram): read headline state from the compositor at render time

The progressHeadlineActive mirror flag was set after pushPreambleHeadline had
already rendered, so the first valid preamble arriving after the draft opened
rendered through the structured-line path and the headline never appeared
until the next event. The renderer and formatLine now read the compositor's
sanitized hasStatusHeadline directly and the mirror flag is deleted; adds an
ordering regression test. LOC baseline lowered to the exact new count.

Refs #105872

* fix(channels): let the opt-in commentary lane own preambles and scope narration docs to Discord

With streaming.progress.commentary enabled, the status headline would replace
the documented interleaved 💬 lines for any turn with a preamble (the exact
event the lane consumes). The compositor headline now declines when the
commentary lane is enabled, preserving that lane's shipped shape, and docs
state the utility-model filler is Discord-only today (Telegram's headline is
preamble-only; it has no narrator wiring).

Refs #105872

* fix(msteams): cancel the pending progress gate at finalize

With the purely time-based gate, every fast Teams progress turn leaves a
pending 5s start timer; the SDK resets its stream id on close, so a late
timer fired renderInformativeUpdate against the closed stream and posted a
stale working card below the final answer. finalize() now cancels the gate
and the informative renderer refuses to run once final text is queued.

Refs #105872

* docs(channels): record the headline-vs-commentary ownership decision inline

Refs #105872

* style: oxfmt the late review-fix rounds

Four files from the final review-fix commits were never oxfmt-formatted and
failed the shared CI formatting step; baseline lowered for the one-line
telegram shrink.

Refs #105872

* fix(channels): harden progress draft lifecycle

* fix(channels): refresh repeated preamble items

* fix(plugin-sdk): expose progress lifecycle options

* style(auto-reply): simplify narrator reset

* docs(channels): refresh progress draft docs map

* fix(auto-reply): clear queued narrator request context

* fix(discord): cancel delayed progress gate at final

* docs: refresh plugin sdk api baseline
2026-07-13 20:55:44 -07:00
Peter Steinberger 069616f33b feat(discord): notify agents of voice participant changes (#107004)
* feat(plugin-sdk): support keyed system event upserts

* feat(discord): notify agents of voice participant changes

* refactor(plugin-sdk): consolidate system event replacement

* fix(discord): keep voice listener dependencies acyclic

* chore: keep release changelog out of PR
2026-07-13 20:03:18 -07:00
Vincent Koc b952394bd0 fix(ci): heal current main blockers 2026-07-13 16:10:55 -07:00
Peter Steinberger 2e0f6d5304 fix: recover browser routing and Discord voice context 2026-07-13 23:38:56 +01:00
wings1029 fd49e97ee5 fix(discord): inherit default_auto_archive_duration in createThreadDiscord (#103413)
* fix(discord): inherit default_auto_archive_duration in createThreadDiscord

When createThreadForBinding hardcoded autoArchiveMinutes: 60, the
parent channel's default_auto_archive_duration (configured by
operators at 1440, 4320, or 10080) was silently overridden. This is
the same pattern fixed in #103033 for sendMessageDiscord's implicit
forum thread creation.

- Move the auto_archive_duration set after the channel fetch in
  createThreadDiscord so channel.default_auto_archive_duration can
  serve as a fallback when autoArchiveMinutes is not provided.
- Remove the hardcoded autoArchiveMinutes: 60 from
  createThreadForBinding so it inherits the channel default for
  forum/media channels and omits the field for text channels
  (preserving Discord's server-side default).
- Explicit autoArchiveMinutes from callers (thread-create action,
  auto-thread config) still take priority via the ?? operator.

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor(discord): preserve parent thread archive defaults

Co-authored-by: 陈志强0668000989 <chen.zhiqiang1@xydigit.com>

* docs(changelog): credit Discord archive default fix

Co-authored-by: 陈志强0668000989 <chen.zhiqiang1@xydigit.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-13 10:31:46 -07:00
cxbAsDev 7abc6665dc fix(discord): retry reply session init conflicts to prevent silent message loss (#103562)
* fix(discord): retry session conflicts without duplicate inbound work

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* refactor(discord): split session retry policy

* refactor(discord): keep retry error private

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-13 09:50:26 -07:00
Peter Steinberger 8867a9da0b refactor(extensions): remove unused Discord and QA Lab exports (#106286)
* refactor(extensions): remove unused major-plugin exports

* refactor(qa-lab): preserve existing test seams

* chore(deadcode): regenerate export baseline

* refactor(qa-lab): share evidence environment resolver
2026-07-13 09:25:45 -07:00