Commit graph

4513 commits

Author SHA1 Message Date
Omar Shahine
6f9da38401
feat(agents): rename model- and user-facing scheduler strings to automations (#114852)
* fix(agents): teach canonical automations tool in fallback guidance and reuse the identity source

Review follow-ups: the structured-list fallback still taught models the cron
tool; the cron-scope test echoed its own stub; MCP serve allowlist and voice
confirmation hardcoded the name instead of the canonical constant.

* fix(mcp): place automations identity import outside the header comment

* feat(agents): rename model- and user-facing scheduler strings to automations

Rewrites every string the model or user sees that names the feature:
tool label and terminal presentation, display-summary preset, subagents
catalog description, heartbeat guidance, subagent prompt, session labels
(Cron: -> Automation:), default job name, unattended-run preamble, delivery
awareness text, task-ledger progress summary, failure alerts, auto-disable
notification, model preflight diagnostics, validation errors, and the
shipped workspace AGENTS.md template. Adds a system-prompt backstop rule on
the automations tool line: the feature is called automations, never cron.

Cron stays only where it names the schedule syntax ({kind:"cron"}, cron
expressions), config keys (cron.triggers.enabled), RPC method names, and
session-key namespaces. Test fixtures with legacy labels are kept as
stored-data coverage. Part of RFC openclaw/rfcs#50 Phase 1 (PR B).

* docs(templates): keep workspace template on the live docs anchor until the docs PR renames it

* fix(cron): rename remaining failure-notification producers and stale test expectations

Codex review follow-ups: the per-run failure notification (server-cron-
notifications) and the doctor legacy-notify advisory still said Cron job;
failure-alert and incomplete-turn suites still asserted the old wording.

* chore(plugin-sdk): re-emit plugin-state test runtime dts

CI's extension-boundary runner holds stale tsgo incremental state whose
cached plugin-state-test-runtime.d.ts predates the keyed-store re-exports;
the freshness stamp validates it and reruns reuse the same sticky disk.
Touching the module forces incremental emit to regenerate the declaration.
Fresh builds of this head (local exact CI command and a forced Testbox
rebuild) both emit the exports correctly.

* fix(agents): rename residual model- and operator-facing cron prose

Found in combined dev-gateway E2E: fallback tool line still told models the
scheduler tool is cron; heartbeat scratch description, cron model preflight
rejection, doctor and Claw prose still said cron jobs.

* fix(agents): finish model-facing scheduler strings flagged in review

Loop work-order prompts, subagents tool description, cron-tool write errors,
and the headless exec denial label now say automations; loop builders covered
by prompt assertions; snapshots regenerated.

* chore(agents): refresh generated baselines and live docs anchor after rebase onto main

* fix(agents): rename new main-side cron tool error expectations to automations

* fix(gateway): rename main-side cron notification test expectations to automations

* chore(agents): apply review moves - automations commands in workspace template, drop unrelated sdk comment

---------

Co-authored-by: Omar Shahine <10343873+omarshahine@users.noreply.github.com>
2026-07-30 08:54:55 -07:00
Ayaan Zaidi
2ca340fa0a
feat(agents): report CLI command outcomes in channel progress
The CLI candidate bridged tool events itself: it forwarded starts without a toolCallId and returned early on the result phase, so a Claude CLI turn produced progress lines with no identity and no terminal outcome. A failed command rendered exactly like one that succeeded.

The bridge now forwards the call id and projects results through the same buildCommandOutputFromToolResultEvent the embedded path uses. Two gaps had to close for that projection to see a CLI result: it only read structured records, where CLI backends report raw text plus is_error, and it needed a title or the terminal line would describe the output instead of the command, so the runner carries the started args onto its result event. A bare result with no content stays excluded, since runners that report an outcome send a separate command_output event.

Modeled on the sibling t3code Claude adapter, which correlates each tool_result back to its in-flight tool by tool_use_id and emits a failed/completed status. Proven live on the real Claude CLI backend: two calls, two lines updating in place, the failing one marked failed.
2026-07-30 21:31:37 +09:00
Peter Steinberger
7fa95e2656
feat(ui): add composable skill references (#116330)
* feat(ui): add composable skill references

* fix(ui): align skill reference CI contracts

* fix(ui): scope skill references to WebChat
2026-07-30 04:07:02 -07:00
Ayaan Zaidi
c4b82609b7
fix(agents): compare shell tool names case-insensitively and stop re-parsing tool labels
Progress-draft lines recovered their detail by string-slicing the label formatToolAggregate had just rendered, and three sites decided "is this a shell tool?" against lowercase spellings only. The Claude CLI sends "Bash", so those checks missed, the slice returned nothing, and every CLI tool call rendered a line with no detail: Telegram printed the icon twice and the tool-summary payload could no longer merge, leaving a second id-less line per call.

formatToolAggregateParts now returns the label with the detail it composed, so a line cannot disagree with its own text, and one predicate owns the shell question across all four sites. Proven live on the Claude CLI backend: two lines with a doubled icon became one.
2026-07-30 19:52:08 +09:00
Huang Wanjia
ef5be76394
feat(reply): annotate recent history images (#100866)
* feat(reply): annotate recent history images

* fix(reply): describe bounded history image positions

---------

Co-authored-by: martin <huangtongxuedev@outlook.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 16:24:09 +08:00
Eden
9c6e06b557
fix(auto-reply): deliver ingress-retried messages after their queued run is dropped (#115891)
* fix(auto-reply): deliver ingress-retried messages after their queued run is dropped

* fix(auto-reply): key queued dedupe release by adoption lifecycle

Overflow-summary compaction clones a queued run onto a new object, so a
release keyed by the run object missed runs completed via their clone and
the ingress retry stayed suppressed on the summarize drop policy. The
adoption lifecycle reference survives cloning and already keys admission
state, so it is the identity the release must use.

* fix(auto-reply): guard queued dedupe ownership

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 11:19:01 +08:00
Vincent Koc
1f56e2da21
fix(messages): validate configured envelope timezone (#116103)
* fix(messages): validate configured envelope timezone

* fix(messages): preserve UTC envelope rendering

* fix(messages): preserve local fallback mode
2026-07-30 07:18:13 +08:00
Vincent Koc
8530edb057
fix(plugins): deliver subagent completion to current requester (#116091)
* fix(plugins): deliver subagent completion to requester

Co-authored-by: ambitioncn <36698505+ambitioncn@users.noreply.github.com>

* test(qa): register current-requester plugin fixture

* fix(plugins): scope requester authority per hook

---------

Co-authored-by: ambitioncn <36698505+ambitioncn@users.noreply.github.com>
2026-07-30 07:06:17 +08:00
Vincent Koc
54e273e695
fix(agents): keep date reasoning current in long-running sessions (#116090)
* fix(agents): ground date reasoning below cache boundary

Co-authored-by: Deepak Jain <406777+deepujain@users.noreply.github.com>

* docs: refresh temporal context map

* chore: leave release notes to release curation

* test(agents): keep compaction date mock complete

---------

Co-authored-by: Deepak Jain <406777+deepujain@users.noreply.github.com>
2026-07-29 22:12:47 +00:00
Frank Yang
511ecd9dba
fix(plugins): expose inbound message id before dispatch (#112359)
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 04:26:28 +08:00
salvormallow
73b5e7aab4
fix(hooks): save memory on automatic session rollover (#61675)
* fix(hooks): persist memory on session rollover

Co-authored-by: salvormallow <15044561+salvormallow@users.noreply.github.com>

* fix(hooks): persist memory on automatic session reset

* fix(hooks): keep auto-reset reason internal

* fix(hooks): retain auto-reset memory admission

* fix(hooks): make session rollover return explicit

* test(hooks): track session memory temp dirs

* fix(hooks): satisfy session memory return contract

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 04:13:26 +08:00
Kevin Lin
ec32f181a1
fix: Slack replies recover after gateway startup replay (#115991)
* fix: diagnose prepared model owner config drift

* fix(gateway): bind replies to published model owner

* fix(gateway): bind durable replay to published owner

* test: preserve requested workspace in reply mock
2026-07-29 12:25:45 -07: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
4c4aa2ed12
feat(gateway): manage audio and video attachments end to end (#115842)
* feat(gateway): manage audio and video attachments

* feat(gateway): preserve generated media metadata

* fix(gateway): align seeded managed media

* fix(gateway): scope pending media trust by URL

* fix(gateway): split managed media by trust

* fix(gateway): require terminal media trust unanimity

* fix(gateway): align managed media metadata types

* fix(gateway): refresh managed media contracts

* chore(ci): model managed media test seams

* test(sessions): expect canonical media kinds
2026-07-29 07:27:36 -04:00
ACD_RD4駱俊馳
e7f0fdfd9b
fix: CJK replies are silently dropped instead of recovered when the model skips message(action=send) (#115556)
* fix(auto-reply): count CJK sentence terminators in stranded private-final detection

* fix(auto-reply): compare private-final substance thresholds with the CJK-aware estimator

* fix(auto-reply): detect CJK sentence boundaries

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 07:23:33 -04:00
Peter Steinberger
20668eed03
fix(memory): quarantine writes from tainted agent turns (#115818)
* feat(memory): taint writes after network tools

* fix(memory): keep provenance mutations recoverable

* fix(memory): roll back failed provenance writes

* fix(memory): serialize provenance mutations

* docs(memory): explain flush provenance boundary

* refactor(memory): share provenance mutation wrapper

* docs(memory): clarify flush provenance fallback

* fix(memory): canonicalize provenance paths
2026-07-29 06:02:06 -04:00
Peter Steinberger
a37a5a6575
feat(agents): add per-session tool overrides (#115785)
* feat(agents): per-session tool overrides (mcp/skills/web-search)

* test(agents): use tracked MCP temp dirs
2026-07-29 05:13:56 -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 Lee
10c20738f6
fix(hooks): resolve inbound claim conversation once (#115491)
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-29 16:38:51 +08:00
Peter Steinberger
c5d0b7dd39
refactor: retire legacy provider and secret paths (#115655)
* refactor: retire legacy provider and secret paths

* fix: remove stale cache retention import

* test: remove retired secret marker fallback
2026-07-29 04:36:20 -04:00
Edward Abrams
6c000dc696
fix(discord): keep tool rows under verbose progress (#111947)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 04:26:28 -04:00
Peter Steinberger
eee5e029e3
feat(agents): persist last-used session model as the agent default (#115717)
* feat(agents): persist last-used session model as the agent default

* fix(agents): gate sticky model persistence on admin authority and make it best-effort

* fix(agents): keep sticky model helper internal

* fix(agents): satisfy sticky model lint rules

* style(agents): format sticky model gateway test
2026-07-29 04:16:51 -04:00
Peter Steinberger
684ec3bcfc
fix(reply): honor configured default agents during auto-reply (#115724) 2026-07-29 04:04:44 -04:00
Peter Steinberger
c29d889b9c
fix: prevent sustained inbound messages from starving delivery (#115682)
Fixes #104106

Reported-by: @masatohoshino (#104106)
2026-07-29 03:44:35 -04:00
Peter Steinberger
6ec84bc3bd
fix(models): expose custom max and ultra reasoning tiers (#115690)
* fix(models): honor custom advanced reasoning levels

* fix(ci): restore code mode matrix boundaries
2026-07-29 03:33:30 -04:00
Vincent Koc
dd3d1d1a8b
fix(ui): hide pre-thread changes from session diffs (#115708)
* fix(ui): scope session diffs to thread changes

* docs: refresh generated map
2026-07-29 15:17:47 +08:00
Peter Steinberger
ddd0b48673
refactor: remove 3,527 lines of runtime and test duplication (#115626)
* refactor: remove obsolete runtime and test duplication

* test: preserve typed cron and realtime fixtures
2026-07-29 02:21:20 -04:00
Peter Steinberger
8fd49c84aa
feat: make self-learning automatic by default (#115576)
* feat: make self-learning automatic by default

* fix: preserve capture authorization boundaries

* test: split autonomous capture coverage
2026-07-29 02:04:57 -04:00
Peter Steinberger
a3a969be5d
fix(cli): avoid duplicate commentary delivery (#115596) 2026-07-29 01:40:55 -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
4e651a43f4
fix(compaction): apply host transcript byte guard to codex sessions (#115192) (#115514)
Co-authored-by: pcpilot-dev <pcpilot-dev@users.noreply.github.com>
2026-07-29 00:23:44 -04:00
Peter Steinberger
430c293ee0
refactor: remove duplicate provider and runtime code (#115529)
* refactor: remove duplicated runtime and provider code

* refactor: exclude unrelated browser test cleanup

* refactor: preserve canonical subagent cleanup ordering
2026-07-29 00:04:52 -04:00
Peter Steinberger
68b1ad8bc0
fix(heartbeat): filter acknowledged reasoning turns (#95796) (#115522) 2026-07-29 00:00:43 -04:00
Peter Steinberger
c45daf7ea8
fix(cli): recover channel turns from expired sessions (#115513)
* fix(cli): clear stale channel session bindings

* fix(cli): scope media cleanup to admitted turn
2026-07-28 23:38:20 -04:00
Peter Steinberger
c092ec437c
refactor: remove duplicate runtime and plugin paths (#115483) 2026-07-28 22:06:04 -04:00
Peter Steinberger
b436055611
fix(cli): preserve mid-turn text in durable replies (#115455)
* fix(cli): deliver commentary as durable replies

* test(cli): cover durable commentary subprocess
2026-07-28 21:02:34 -04:00
Vito Cappello
fb8e1aa59d
fix(auto-reply): prevent false no-reply fallbacks from routed and accepted turns (#115016)
* fix(auto-reply): observe routed reset hook replies
* fix(auto-reply): track settled route delivery
* fix(auto-reply): preserve reasoning route suppression
* fix(auto-reply): suppress fallback for accepted busy turns
* fix(auto-reply): preserve editable partial delivery ids
* test(auto-reply): align route delivery mock
* fix(auto-reply): preserve routed delivery semantics
* docs(auto-reply): clarify lost adoption ownership
* test(auto-reply): split routed delivery evidence cases
* fix(auto-reply): preserve ambiguous route sends
* fix(auto-reply): omit non-delivery sentinel ids

---------

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-07-29 09:50:31 +09:00
Jason (Json)
de5e09ac27
fix(gateway): bind source replies to run sessions (#115434) 2026-07-28 17:27:05 -06:00
Peter Steinberger
e1e1c1879b
fix: validate plugin installs before lifecycle mutations (#115427) 2026-07-28 18:25:57 -04:00
Peter Steinberger
8ee1d046d3
refactor(sessions): consolidate entry state (#115299)
* refactor(sessions): consolidate entry state

* refactor(gateway): unify session kind classification

* refactor(sessions): keep entry state types private

* test(sessions): drop retired pending delivery case

* fix(sessions): clear stale transport-only delivery
2026-07-28 14:31:02 -04:00
Peter Steinberger
2d4edaf94f
fix: generated images remain visible after agent turns (#115255)
* fix(gateway): persist managed images after agent turns

* fix(gateway): keep media finalization admitted

* fix(gateway): finalize each managed image row

* fix(sessions): rewrite managed media rows exactly

* chore: leave changelog to release flow
2026-07-28 14:26:07 -04:00
Peter Steinberger
942d3d7600
fix(agents): resolve effective runtime before preflight byte-guard compaction (#108984) (#115284)
Co-authored-by: ATKasem <ATKasem@users.noreply.github.com>
2026-07-28 13:09:44 -04:00
Peter Steinberger
970b2d257b
feat(skills): shared authoring standards make learned skills routable (#115103)
* feat(skills): share authoring standards

* fix(skills): derive routable autocapture proposals

* docs(skills): document proposal authoring standards

* refactor(skills): simplify autocapture derivation

* fix(skills): preserve explicit reflection rules

* docs(skills): state the accepted heuristic-detection tradeoff

* fix(skills): preserve explicit directive syntax

* style(skills): keep signal parser within ratchets
2026-07-28 12:48:30 -04:00
Peter Steinberger
2160b97cdc
refactor(config): retire compaction truncateAfterCompaction gate (#115206) 2026-07-28 11:30:50 -04:00
Ayaan Zaidi
8eaa4d6d70 fix(auto-reply): require a directed turn for the no-visible-reply fallback
The fallback exists for a user who asked and got nothing. Gate it and the
eligibility flag on positive directedness so ambient group chatter, room
events, and turns whose classification facts were lost upstream can never
surface a visible failure notice - even under silentReply: disallow. A turn
is directed when it is an explicit command, or a non-room_event direct chat
or mention/reply-to-bot; a command turn is the one directed room_event,
mirroring the room_event source-reply suppression bypass. Every other
room_event stays undirected regardless of a stray WasMentioned/direct
classification, so the exact production regression - an unmentioned
room_event group turn drawing the fallback into the channel on every ambient
message - cannot recur through any room_event path.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-28 22:36:57 +09:00
Ayaan Zaidi
9641377979 fix(auto-reply): attest source-routed message-tool sends via the dedupe route matcher
The message_tool_only-specific didDeliverSourceReplyViaMessageTool flag
never covers automatic-mode turns, so a message-tool answer to the source
conversation followed by NO_REPLY still drew the no-visible-reply fallback
(reproduced on a live mock-Telegram gateway). Reuse the payload-dedupe
route matcher - the same route-awareness that already suppresses duplicate
finals - to attest observed delivery for visibly delivered source-routed
tool sends in every delivery mode; unrelated-target sends stay excluded.
2026-07-28 22:36:57 +09:00
Ayaan Zaidi
7c4291040c fix(auto-reply): attest message-tool source replies in every delivery mode and gate eligibility on resolved settlement
Route-aware completed source-reply evidence now marks observed delivery
regardless of sourceReplyDeliveryMode, matching the followup-runner
contract, so an automatic-mode turn answered via the message tool plus
NO_REPLY no longer draws the no-visible-reply fallback into the source
conversation (reported live on Discord). The result eligibility flag now
requires resolved settlement and no delivered fallback, so channel-level
recovery cannot double-send while a queued payload is still unresolved.
2026-07-28 22:36:57 +09:00
Ayaan Zaidi
e6e0f52aa8 fix(auto-reply): bound turn-ledger settlement and treat started sends as conservatively visible
Give settleQueued a 30s failsafe deadline alongside the abort race so a
transport that never settles cannot block finalization past the completion
barrier, and classify only cancelled/failed-before-deliver outcomes as
proven-invisible: a started-then-failed send may have shown partial chunked
content, so it keeps the no-visible-reply fallback quiet instead of stacking
a misleading fallback on top of partial output.
2026-07-28 22:36:57 +09:00
Ayaan Zaidi
c60c256bc3 fix(auto-reply): abort-aware fallback settlement and straggler drain in turn ledger
Race the no-visible-reply fallback's settlement against the dispatch abort
signal so a wedged transport cannot block finalization, and drain outcome
promises admitted while settlement is in progress so a late straggler
delivery cannot race the silence verdict into a double-send.
2026-07-28 22:36:57 +09:00
Ayaan Zaidi
cc86513a95 fix(auto-reply): keep turn-ledger types module-local 2026-07-28 22:36:57 +09:00