Commit Graph

68105 Commits

Author SHA1 Message Date
Vincent Koc
63c7c21bdf refactor(core): privatize new internal helpers (#107096) 2026-07-14 12:02:46 +08:00
Peter Steinberger
ea33260491 refactor(agents): privatize prompt error outcome (#107097) 2026-07-13 21:01:48 -07:00
Peter Steinberger
87b2b4eaab refactor(agents): extract session lock preparation 2026-07-13 21:01:28 -07:00
Peter Steinberger
07284af748 test: omit live-only tooling leaf shards (#107088) 2026-07-13 20:56:14 -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
53f6212488 test(mattermost): fix slash response mock type (#107084) 2026-07-13 20:48:34 -07:00
Vincent Koc
3aab2ce6a9 refactor(packages): remove dead internal helpers (#107077) 2026-07-14 11:48:14 +08:00
Peter Steinberger
0ab9e625c2 refactor(agents): extract stream finalization phase 2026-07-13 20:47:47 -07:00
Peter Steinberger
e79cbbfb2e refactor(resources): use native minimatch list matching 2026-07-13 20:45:18 -07:00
Peter Steinberger
fe715a1b88 refactor(daemon): trim internal exports (#107075) 2026-07-13 20:43:08 -07:00
Peter Steinberger
e55e3ffbdd refactor(agents): extract attempt prompt execution lifecycle 2026-07-13 20:39:12 -07:00
Peter Steinberger
fce1d16493 fix(infra): preserve APNs proxy error cause (#107057) 2026-07-13 20:35:29 -07:00
Peter Steinberger
c5a74b4949 refactor(tailscale): use exec timeout directly 2026-07-13 20:30:35 -07:00
Peter Steinberger
c19b7d2823 refactor(mattermost): trim internal exports (#107062) 2026-07-13 20:27:52 -07:00
Peter Steinberger
604eb6af2d refactor(concurrency): use native p-limit APIs 2026-07-13 20:23:00 -07:00
Peter Steinberger
69f1da11a3 refactor(agents): privatize attempt lifecycle details (#107055) 2026-07-13 20:21:34 -07:00
Vincent Koc
4bff6b188e refactor(agents): privatize computer tool helpers (#107048) 2026-07-14 11:13:48 +08:00
Peter Steinberger
6efec6d28c refactor(version): use native SemVer ordering 2026-07-13 20:13:19 -07:00
Peter Steinberger
661cf9644d refactor(agents): extract attempt prompt observability 2026-07-13 20:09:00 -07:00
Peter Steinberger
4da0eb19c5 fix(state): converge legacy startup migrations (#107002)
* fix(state): converge legacy startup migrations

Co-authored-by: Eva <eva@100yen.org>

* refactor(state): split legacy migration helpers

* fix(memory): persist legacy source acknowledgements

* fix(state): remove stale migration imports

* fix(memory): recognize numbered migration archives

* fix(matrix): downgrade archived migration residue

* fix(memory): satisfy migration lint

---------

Co-authored-by: Eva <eva@100yen.org>
2026-07-13 20:05:24 -07:00
Peter Steinberger
a0cab8c1d8 refactor(agents): extract attempt abort lifecycle 2026-07-13 20:04:43 -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
Peter Steinberger
04fa6beed4 fix(release): make closeout recovery shell-safe (#107015) 2026-07-13 20:02:45 -07:00
xingzhou
ad7f849490 fix(agents): prevent local provider sidecars surviving canceled startup (#104070)
* fix(agents): prevent local provider sidecars surviving canceled startup

* test(agents): harden local service abort regression

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-13 20:02:13 -07:00
Peter Steinberger
704b17d80f test(process): harden descendant timeout proof (#107011) 2026-07-13 20:01:28 -07:00
Peter Steinberger
2c4ccf7196 test: isolate auth planner profile lookup (#106962) 2026-07-13 19:59:17 -07:00
Peter Steinberger
baf519344f perf(test): isolate auth planner provider hooks (#107022) 2026-07-13 19:58:54 -07:00
Peter Steinberger
c490cf1913 refactor(proxy): use native CONNECT tunnel 2026-07-13 19:56:54 -07:00
Peter Steinberger
877af700bf feat(codex): continue paired-node Codex catalog sessions from the Control UI (#106927)
* feat(codex): continue paired-node Codex catalog sessions from the Control UI

Codex catalog rows on paired nodes were view-only. Node rows are now
continuable when the node advertises and permits the codex threads.list,
thread.turns.list, and cli.session.resume commands. Continue adopts the
session into a locked codex OpenClaw session (deterministic
harness:codex:node-session key, bounded native-history import, two-phase
initializing marker) and installs a webchat conversation binding
(codex-cli-node-session) through the new generic
bindPluginSessionConversation seam with attempt-ID guarded rollback, so
each web turn runs codex exec resume on the owning node via the existing
inbound_claim path. Local continue/archive semantics are unchanged;
archived rows are no longer offered as continuable.

* fix(plugins): serialize plugin session binds per session

Review P2: the bind rollback checked the attempt id and then awaited the
unbind, so a concurrent Continue could install a newer binding between the
two and lose it to the older attempt's rollback. All session binds for one
session key now queue through an in-process tail, so a failing attempt can
only ever roll back its own binding; the attempt-id guard stays as defense
against out-of-band rebinds.

* refactor(codex): extract node-continue and session-bind modules for the LOC ratchet

Pure movement to satisfy the changed-file TypeScript size ratchet: the
paired-node continue flow moves to session-catalog-node-continue.ts and
session-catalog-node-adoption.ts, catalog paging/parsing helpers to
session-catalog-parsing.ts, the Control UI session-bind seam to
session-conversation-binding.ts (+ session-key helpers), and the internal
conversation-id/channel-prefix helpers to utils. transcript-mirror.ts is
restored to main byte-for-byte; the node history builder constructs a plain
CodexThread (only id is required) instead of widening signatures.

* fix(plugins): satisfy preserve-caught-error in the session-bind rollback

* fix(codex): gate node continue on operator.admin and resume by CLI session id

Second review round: (1) bound node turns pass canMutateCodexHost only for
owners/admins, while sessions.catalog.continue is operator.write — a
write-scoped Control UI client could adopt a node session whose every turn
would then be rejected. The gateway now forwards the caller's scopes to the
provider (SessionCatalogContinueProviderParams.clientScopes) and codex fails
node continues closed without operator.admin, before the dedupe join so a
non-admin cannot ride an admin's in-flight operation. (2) The node binding
stored the app-server threadId, but codex exec resume takes the CLI session
id and forked threads share a session tree where the two differ; the binding
now prefers record.sessionId.

* fix(codex): defer node-session restore until the binding is durable

Third review round: continuing an archived adopted node session unarchived
it before the gateway installed the conversation binding, so a failed bind
left a visible session with no node routing. The unarchive now rides
afterConversationBound; finalizeNodeAdoptedSession already covers both the
initializing and finalized marker states, so the eager restore helper is
deleted.
2026-07-13 19:54:31 -07:00
Peter Steinberger
b91a33d14a fix(agents): keep timestamp override type internal (#107020) 2026-07-13 19:51:16 -07:00
Vincent Koc
d4ee32185c refactor(agents): simplify image resize policy (#107027) 2026-07-14 10:46:01 +08:00
Peter Steinberger
9b823c6108 refactor(agents): extract attempt context guards and trajectory 2026-07-13 19:38:49 -07:00
Peter Steinberger
7f73f6e66e test(qa-lab): refresh CLI dispatch expectations (#107018) 2026-07-13 19:36:17 -07:00
Vincent Koc
6a5736baa5 refactor(runtime): remove redundant provider aliases (#107013) 2026-07-14 10:33:23 +08:00
Peter Steinberger
241d6dec78 refactor(ai): remove unused websocket debug stats 2026-07-13 19:33:03 -07:00
Peter Steinberger
44fcbc612d refactor(qa-lab): trim dead export surface (#107016)
* refactor(qa-lab): narrow report and config exports

* refactor(qa-lab): keep live test seams private

* refactor(qa-lab): remove dead runtime wrappers

* chore(deadcode): refresh QA Lab export baseline
2026-07-13 19:32:13 -07:00
Peter Steinberger
a93330bf99 fix(cli): restore plugin authoring LOC ratchet (#107003) 2026-07-13 19:31:55 -07:00
Peter Steinberger
b9c947237a refactor(agents): extract attempt session boundaries 2026-07-13 19:27:03 -07:00
Peter Steinberger
130480871e perf(test): reuse live updater Git fixture (#106975) 2026-07-13 19:26:47 -07:00
Peter Steinberger
eb7c151d07 improve(doctor): keep regular runs problem-focused and compact (#106968)
A regular openclaw doctor run buried findings under healthy-state noise:
wizard banner, skills/plugins inventory boxes, healthy confirmations,
per-skill install hints, identical per-agent model-auth boxes, and one
warning line per stale plugin config path.

Doctor now prints problems and fixes only: security/Claude CLI notes are
silent when healthy, plugins box lists only errored ids, unusable skills
collapse to a count plus name list, model-auth findings aggregate across
agents with (agents: ...) attribution, and stale plugins.allow/deny/entries
references group into one line. Inventory stays in openclaw skills check,
openclaw plugins list, openclaw security audit, and openclaw models status.
docs/gateway/doctor.md updated.
2026-07-13 19:25:29 -07:00
Peter Steinberger
6958e4c969 chore(skills): support large autoreview diffs (#106970)
* chore(skills): sync large-diff autoreview

* fix(skills): state source-blind review limits
2026-07-13 19:25:04 -07:00
Peter Steinberger
568e4d95e7 fix(release): keep verifier output valid and deterministic (#106953)
* fix(release): validate changelog before atomic write

* fix(release): defer optional provenance main lookup

* fix(release): suppress overridden release PR subjects

* fix(release): satisfy verifier lint

* test(release): declare verifier suppression helper

---------

Co-authored-by: Vincent Koc <25068+vincentkoc@users.noreply.github.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-13 19:25:01 -07:00
Vincent Koc
f7ea3c776c fix(ci): pin corrected Kova scenario calibration (#106992) 2026-07-14 10:23:58 +08:00
sebastian-openclaw
a61f6b75ab fix(ui): restore custom avatar after session switches (#106553)
* fix(ui): restore assistant avatar after session switch

* fix(ui): rerender pane after avatar refresh

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-13 19:20:06 -07:00
Peter Steinberger
94418647a3 chore(release): update appcast for 2026.7.1 (#106993)
Co-authored-by: openclaw-release-bot <release-bot@openclaw.ai>
2026-07-13 19:16:09 -07:00
Peter Steinberger
6e067f7662 test: restore moving-main quality gates (#106972)
* test(agents): preserve caught abort cause

* refactor(browser): privatize route handler type

* test(lint): cover browser route override
2026-07-13 19:06:30 -07:00
Peter Steinberger
25a18b2d8e refactor(bonjour): use native ciao platform handling 2026-07-13 19:04:16 -07:00
Peter Steinberger
48eebe090f fix(testing): make changed-gate bundles self-contained 2026-07-13 19:03:31 -07:00
Leon-SK668
4100d19f2a fix(cli): tolerate removed cwd in plugin authoring output (#106425) 2026-07-13 18:58:54 -07:00
Peter Steinberger
4645a850d5 fix(testing): omit changed-gate history from bundles 2026-07-13 18:50:35 -07:00