Commit Graph

1358 Commits

Author SHA1 Message Date
Peter Steinberger
568ea29d2e refactor(plugins): inherit shared package boundary settings (#117474) 2026-08-01 09:11:09 -07:00
Dallin Romney
fa8774cc61 fix(qa): Slack progress lane misses successful delivery (#117391)
* fix(qa): verify Slack live delivery observations

* test(qa): update Slack scenario fixture contract

* fix: guard Slack QA proxy network boundary

* refactor: use shared capture for Slack QA observations

* refactor(qa): split Slack fallback evidence

* fix(qa): verify Slack commentary from native capture

* fix(slack): preserve debug capture with proxies

* fix(qa): narrow Slack commentary fallback

* fix(qa): observe successful Slack progress writes
2026-08-02 00:07:01 +08:00
Peter Steinberger
aa2a5c96f6 feat(channels): record account lifecycle facts and retire inferred health vocabularies (#117300)
* fix(channels): record account lifecycle facts

* fix(channels): bound recorded lifecycle grace

* fix(channels): preserve authored health state

* test: dedupe health snapshot type literal and fix spread order
2026-08-01 02:51:47 -07:00
Peter Steinberger
edfeec49e7 refactor(channels): centralize progress draft events (#117269) 2026-08-01 00:26:56 -07:00
Peter Steinberger
7aacd1314d fix(slack): recover bot identity after transient auth.test failure (#117253)
* fix(slack): recover bot identity after transient auth.test failure

* docs(slack): document identity selection invariant

* fix(slack): resolve startup auth fetch through plugin runtime
2026-08-01 00:23:03 -07:00
Peter Steinberger
654744da17 refactor(channels): unify setup ownership across bundled channels (#117188) 2026-07-31 20:33:20 -07:00
Peter Steinberger
a0c98de0af fix(slack): let durable ingress retry transient thread lookups (#117135)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 18:37:37 -07:00
Peter Steinberger
a1b41d5ddb refactor(channels): share Matrix and Slack progress draft composition (#117097) 2026-07-31 17:17:07 -07: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
Sarah Fortune
cc0315a397 fix(slack): recover identity after transient startup auth failure (#117060)
* fix(slack): retry transient startup auth once

* fix(slack): allow two startup auth retries

* test(slack): cover stalled startup auth retries

---------

Co-authored-by: Sarah Fortune <sarah.fortune@gmail.com>
2026-07-31 15:50:32 -07:00
Peter Steinberger
184c13d01c fix(slack): preserve thread reads and final transport text (#116915)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 09:04:30 -07:00
Harjoth Khara
102c2e1a64 fix(slack): recover MPIM thread context from outbound replies (#116660)
Co-authored-by: scoootscooob <167050519+scoootscooob@users.noreply.github.com>
2026-07-31 23:12:56 +08:00
Peter Steinberger
4e4f76f151 fix(cli): make status and provider diagnostics complete (#116776)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 04:10:36 -07:00
Patrick Erichsen
5e10af048d fix(slack): explain allowlist-denied mentions (#116618)
* fix(slack): explain allowlist-denied mentions

* fix(slack): deduplicate denial notices
2026-07-30 21:11:06 -07:00
pash-openai
e52354ea13 fix(build): pin typebox to a published release (#116333) 2026-07-30 09:58:51 +00:00
Ayaan Zaidi
21d3533460 fix(channels): ack mentions in groups that do not require them
The group-mentions ack gate returned false whenever a group did not require mentions, conflating group policy with whether this message mentioned the agent. Under the default scope, mentioning the agent in a group configured to answer everything produced no ack at all, so the user had no signal the turn was picked up until the reply arrived.

Behavior change on a default path: those groups now show the 👀 ack (and the lifecycle status reactions when messages.statusReactions.enabled is true) on mentions. Mention-required groups, group-all, unmentioned messages, and off/none are unchanged. The gate no longer reads requireMention, so the parameter is gone from the shared type and all channel call sites.

Proven live on Telegram across three configurations, including a no-mention control confirming group-mentions did not become group-all.
2026-07-30 17:58:46 +09:00
Ayaan Zaidi
c63241d3ce fix(channels): resolve tool progress against the caller's stream mode
resolveChannelStreamingPreviewToolProgress guessed a mode when streaming.mode
was unset, so it could never be right for every channel: guessing "partial"
dropped Discord and Telegram's explicit progress.toolProgress opt-out, and my
earlier switch to "progress" broke it the other way for Slack, Mattermost, and
Teams, whose real default is partial. With both keys configured and disagreeing,
the wrong one won.

The helper has no channel identity, so it stops guessing and takes the mode the
caller already resolved. All nine call sites pass theirs. Omitting it keeps the
previous configured-mode reading, so untouched callers behave exactly as before.

Reported by ClawSweeper on #116143.
2026-07-30 13:36:21 +09:00
Ayaan Zaidi
06aa81a73f fix(channels): show tool lines under the progress status headline
A status headline replaced the rolling tool lines instead of sitting above
them, so a default Discord draft showed one preamble sentence for an entire
tool-heavy turn. Operators reached for `/verbose` to see any activity, which
delivers durable per-tool-call messages and floods the channel.

- Render the headline above the lines; both stay visible in one message.
- Shorten the start gate from 5s to 1.5s. The gate only creates the draft
  when the timer fires and finalize cancels it, so quick answers still post
  no draft while a 3s tool turn stops being silent.
- Drop Discord's label-gated tool-progress default so
  resolveChannelStreamingPreviewToolProgress is the single owner. An explicit
  `toolProgress: false` still silences the lines.
- Resolve that toggle against a "progress" mode guess when `streaming.mode`
  is unset, so the progress-draft channels stop ignoring an explicit
  `progress.toolProgress` opt-out.

Telegram now defaults to `streaming.mode: "progress"` like Discord; set
`"partial"` to keep streamed answer text. Its renderer draws work lines from
the compositor's structured lines, so `rendersRollingLinesNatively` keeps
them out of the composed text rather than printing every line twice.
2026-07-30 13:36:21 +09:00
Peter Steinberger
d16e33e08e fix: restore trustworthy end-to-end QA and cross-channel delivery (#115404)
* fix(qa): repair verified end-to-end and channel regressions

* fix(gateway): make interrupted restart recovery lifecycle-safe

* test(heartbeat): target the canonical recovery session store

* fix(gateway): prioritize durable restart recovery before heartbeat

* fix(qa): preserve safe restart recovery and channel expiry

* fix(qa): fail closed and fence restart recovery

* test(agents): isolate restart recovery timing

* test(agents): prove actual restart retry timing

* fix(qa): report incompatible profile scenarios

* fix(scripts): resolve symlinked docker scheduler entrypoints

* fix(qa): require fresh native test evidence

* fix(heartbeat): fence active restart recovery delivery

* fix(gateway): consume untargeted restart acknowledgements

* fix(qa): satisfy exhaustive hosted validation gates

* fix(agents): fence stopped restart recovery dispatch

* style(agents): format restart recovery lifecycle regression

* test(gateway): isolate context prewarm sidecar lifecycle

* test(qa): make scenario process timeout cleanup deterministic

* fix(qa): stamp synthetic gateway configs with current version

* fix(openai): preserve vision capabilities in stale model catalogs

* test(qa): align profile channel rejection with current main

* fix(openai): forward supported moderation for image edits

* fix: restore latest-main CI and image edit documentation

* fix(qa): retain relocated code-mode evidence validation

* fix(openai): expose GPT-5.4 vision in static catalog

* fix(pricing): honor explicit model cost overrides

* test(pricing): keep isolated provider regressions deterministic

* fix(openai): inherit transport for discovered static models

* fix(gateway): honor agent-owned static image capabilities

* test(gateway): preserve prepared-snapshot attachment races

* test(gateway): isolate subagent persistence failure injection

* test(gateway): exercise concurrent voice replay admission

* fix(gateway): restore stale model image capabilities

* fix(agents): publish configured model vision capabilities

* fix(agents): isolate detached media transcript ownership

* test(agents): preserve generic transcript lock regression

* fix(gateway): require proven static model route identity

* fix(qa): accept bounded full-size generated image attachments

* fix(qa): require fresh script producer evidence

* test(qa): prove native E2E scenario execution
2026-07-29 12:45:27 -04:00
Peter Steinberger
5bfc65d7f4 refactor: remove 3,543 lines of redundant runtime and tests (#115961)
* refactor: remove 3,543 lines of redundant runtime and tests

* refactor: ratchet production environment variable budget
2026-07-29 11:43:41 -04: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
4232126bba chore: update dependencies across workspace (#115677)
* chore(deps): update dependencies

* fix(deps): restore CI compatibility
2026-07-29 05:16:42 -04:00
Peter Steinberger
c402688894 feat(media): probe duration and dimensions for playback metadata (#115728)
* feat(media): probe playback metadata

* fix(media): satisfy CI gates

* fix(media): satisfy lint rules
2026-07-29 04:52:17 -04:00
Peter Steinberger
382ea7b74e refactor: centralize channel streaming config hints (#115739)
* refactor: centralize channel streaming config hints

* fix: repair code mode static checks

* fix: restore QA evidence validator import
2026-07-29 04:42:23 -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
a24c1ceb3a fix(channels): release inbound debounce at admission (#115603)
Track full dispatch completion separately for error handling and shutdown drain while allowing same-session follow-ups to steer active runs. Fixes #113180.

Co-authored-by: Taksh <takshkothari09@gmail.com>
2026-07-29 01:38:15 -04:00
Peter Steinberger
f1f8434db3 fix(doctor): honor Slack channel allowlists before plugin load (#115563)
Publish the existing Slack route-based doctor capabilities in channel metadata so cold doctor scans no longer falsely report dropped messages or recommend schema-invalid sender allowlists. Add metadata-only discovery regression. Fixes #110489; thanks @ari-hjunk for the report.
2026-07-29 00:55:54 -04:00
Peter Steinberger
dd5b9c8c04 fix(slack): prevent duplicate MPIM mention replies (#115528)
* fix(slack): make MPIM app mentions type-safe

Resolve typeless app mentions through explicit metadata, the scoped event cache, then conversations.info so modern C-prefixed MPIMs cannot be misclassified by event ordering. Add a real Slack QA scenario that requires one reply and cleans up its temporary MPIM.

Co-authored-by: moeealii <75953662+moeealii@users.noreply.github.com>

* fix(slack): type unresolved mention metadata

* fix(slack): satisfy MPIM type contracts

---------

Co-authored-by: moeealii <75953662+moeealii@users.noreply.github.com>
2026-07-29 00:23:06 -04:00
moeealii
e2a76333d8 fix(slack): resolve conversation type for app_mention in C-prefixed group DMs (#115468)
app_mention events carry no channel_type, and modern Slack group DMs
(mpims) use C-prefixed channel ids, so prefix inference classifies them
as channels. Mentions in group DMs then bypass the handler's im/mpim
dedupe guard and are processed down the channel path — misrouting
replies, and double-handling alongside message.mpim when dm.groupEnabled
is on.

Confirm against the event-carried type cache and, on a miss, the cached
conversations.info lookup before treating a channel_type-less mention as
a channel mention. Only an authoritative "mpim" answer changes behavior;
a C-prefixed id can never be an im.

Fixes #115463

Co-authored-by: moeealii <>
2026-07-28 23:23:49 -04:00
Peter Steinberger
c092ec437c refactor: remove duplicate runtime and plugin paths (#115483) 2026-07-28 22:06:04 -04:00
joshavant
a29214acd8 fix(slack): protect outbound hooks from previews 2026-07-28 14:41:50 -05:00
Peter Steinberger
2964be2581 fix: prevent Slack and Feishu ingress startup leaks (#115295)
* fix(channels): clean up failed ingress startup

* chore: leave release notes to release prep

* test(feishu): initialize monitor ingress state
2026-07-28 13:29:20 -04:00
shannon0430
b954b3ae4f fix(slack): avoid unsafe emphasis boundaries (#111575)
* fix(slack): avoid invalid italic boundaries

* fix(slack): handle standalone CJK italics

* fix(slack): handle unsafe emphasis boundaries

* fix(slack): avoid unsafe emphasis boundaries

Co-authored-by: shannon0430 <shannon0430@users.noreply.github.com>

---------

Co-authored-by: shannon0430 <shannon0430@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 13:28:28 -04:00
Peter Steinberger
0c36fabc61 fix(slack): deduplicate message and mention events in one flush (#115302)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 13:20:01 -04:00
MatthewSynthia
7df5834511 fix(slack): cap chat.update edit text at the 4000-char limit, not the 8000 send limit (#115027)
* fix(slack): cap chat.update edit text at the 4000-char limit, not the 8000 send limit

updateMessageSlack truncated the edit text to SLACK_TEXT_LIMIT (8000), but Slack chat.update
rejects text longer than 4000 characters with msg_too_long (documented in limits.ts). Every
other edit path (actions.ts, edit-text.ts, message-action-dispatch.ts, preview-finalize.ts)
uses SLACK_EDIT_TEXT_LIMIT (4000); updateMessageSlack was the lone outlier, so a long
question-delivery status edit failed instead of landing. Use the edit limit.

* fix(slack): enforce edit text byte limits

Co-authored-by: MatthewSynthia <matthewsynthia@users.noreply.github.com>

* fix(slack): preserve prepared edit text within limits

Co-authored-by: MatthewSynthia <matthewsynthia@users.noreply.github.com>

---------

Co-authored-by: MatthewSynthia <matthewsynthia@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 12:41:37 -04:00
Peter Steinberger
3fa4805563 fix(slack): preserve pasted inbound tables (#115163)
* fix(slack): preserve pasted inbound tables

Co-authored-by: yash <84263676+yxshee@users.noreply.github.com>

* fix(slack): keep inbound text selection private

Co-authored-by: yash <84263676+yxshee@users.noreply.github.com>

* fix(slack): exclude unfurl tables from inbound context

Co-authored-by: yash <84263676+yxshee@users.noreply.github.com>

* refactor(slack): clarify aggregate table size limit

Co-authored-by: yash <84263676+yxshee@users.noreply.github.com>

* docs(slack): clarify table fallback escaping

Co-authored-by: yash <84263676+yxshee@users.noreply.github.com>

---------

Co-authored-by: yash <84263676+yxshee@users.noreply.github.com>
2026-07-28 10:34:21 -04:00
sunlit-deng
74954fd931 fix(slack): bound response_url body inspection (#115093) 2026-07-28 08:35:33 -04:00
Peter Steinberger
4233301c7c fix(slack): keep previews with custom outbound identity (#115114)
* fix(slack): preserve previews with custom identity

Co-authored-by: goutamadwant <workwithgoutam@gmail.com>

* test(models): isolate configured visibility policy

---------

Co-authored-by: goutamadwant <workwithgoutam@gmail.com>
2026-07-28 06:33:59 -04:00
Harjoth Khara
07768aa5f6 fix(slack): abort health probes within their deadline (#107835)
Preserve the current dedicated Slack read-client architecture and stop probe retries or HTTP 429 delays from surviving the shared health deadline. Verify stalled sockets, dropped-request background retries, immediate rate-limit rejection, and trickling response bodies with real loopback transport. Fixes #106565.

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: zhangqueping <3436352+zhangqueping@users.noreply.github.com>
2026-07-28 05:34:03 -04:00
Peter Steinberger
50a97288dd fix(slack): stop cyclic directory pagination (#115056)
* fix(slack): stop cyclic cursor pagination

Co-authored-by: zw-xysk <zhao.wang1@xydigit.com>

* test(slack): initialize read client test runtime

* test(slack): isolate reconnect retry timers

---------

Co-authored-by: zw-xysk <zhao.wang1@xydigit.com>
2026-07-28 04:41:30 -04:00
Peter Steinberger
78d6c6c047 fix(slack): bound read-only Web API calls (#115018)
Co-authored-by: zw-xysk <zhao.wang1@xydigit.com>
2026-07-28 03:37:54 -04:00
wangmiao0668000666
9dbfeb7e61 fix(channels): keep healthy accounts' message actions when one credential SecretRef fails (#110329)
* fix(channels): isolate unavailable account discovery

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

* refactor(channels): remove stale discovery exports

* test(pr): provide ripgrep fixture command

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 01:50:51 -04:00
rabsef-bicrym
f229356689 fix(slack): preserve native tables during outbound delivery (#111955)
* fix(slack): preserve rendered presentations across cloning

* test(slack): cover serialized presentation provenance

* test(slack): prove restart fallback for rendered payloads

- Reload the Slack adapter to simulate a runtime restart.
- Verify stale rendered provenance falls back to text without blocks.

* fix(slack): fail closed on invalid rendered metadata

---------

Co-authored-by: Pavonis <pavonis@martian.engineering>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-27 23:39:20 -04:00
Peter Steinberger
a1e0c9ea09 refactor(packages): DM-policy contract suite, dead routes, package folds (#114776)
* test(channels): share DM policy contract suite

* refactor(memory): remove dead host CLI routes

* refactor(acp): use canonical normalization helpers

* refactor(web): fold provider runtime into core

* refactor(packages): remove dead runtime exports

* chore(knip): drop retired ACP entry roots
2026-07-27 20:20:13 -04:00
Peter Steinberger
6d9b2d4d66 refactor(outbound): consolidate fenced cross-channel delivery (#114689)
* refactor(outbound): consolidate fenced delivery ownership

* fix(outbound): break durable-delivery contract cycle

* fix(outbound): align delivery queue owner tests and exports
2026-07-27 16:50:58 -04:00
Peter Steinberger
0e37f143f5 refactor(slack)!: retire inline interactive directives for typed presentation (#114738)
* refactor(slack): retire inline interactive directives

Release note: Slack configs using channels.slack.capabilities.interactiveReplies, including per-account settings, are removed by openclaw doctor --fix. Slack-only [[slack_buttons:...]] and [[slack_select:...]] markup is no longer parsed; emit typed presentation buttons and selects instead.

* docs: refresh Slack docs map
2026-07-27 16:41:00 -04:00
Peter Steinberger
de3616526b fix(release): repair plugin prerelease contracts (#114597) 2026-07-27 09:57:43 -04:00
Peter Steinberger
cba38b74a3 improve(slack): consolidate transport regression coverage (#114329) 2026-07-27 01:24:49 -04:00
Peter Steinberger
7cce91cda9 refactor(channels): unify account and setup adapters (#114290) 2026-07-27 00:55:46 -04:00