Preserve native Telegram quote attribution in agent-visible input and terminate quotes before following ordinary text.
Co-authored-by: Peter Steinberger <steipete@macos.shared>
* fix(test): close zalo agent state databases before lifecycle temp-dir removal (#119796)
* fix(test): close zalouser agent state databases before ingress temp-dir removal (#119796)
* fix(test): close zalouser fixture databases before restoring parent state env (#119796)
ClawSweeper re-review finding: the ingress fixture restored
OPENCLAW_STATE_DIR before closing cached per-agent databases, so lease
release could open a shared-state write against the parent fixture env.
Move both closes ahead of the env restore (canonical fixture order) and
add a nested-environment regression asserting the parent state dir stays
untouched.
* docs: point openclaw-refactor-docs at technical-documentation
The openclaw-docs skill was removed in 0dabb7010b,
which replaced it with technical-documentation. openclaw-refactor-docs was not
updated and still told the agent to read ../openclaw-docs/SKILL.md first, so the
read returned nothing and the refactor proceeded without the style and page-type
rules it was supposed to apply.
* docs: use a workspace-relative path for the technical-documentation read
OpenClaw resolves relative read paths from the session workspace cwd
(resolveReadPath -> resolveToCwd -> resolvePath(cwd, path) in
src/agents/sessions/tools/path-utils.ts), not from the directory holding
the skill file. ../technical-documentation/SKILL.md therefore resolved
outside the workspace and the read still failed.
Use .agents/skills/technical-documentation/SKILL.md, which is the path
that exists from the workspace root.
* docs: resolve technical-documentation support files via {baseDir}
The skill names ten support files relatively (six references/*.md and four
agents/*.md). read resolves relative paths from the session workspace cwd,
so none of them resolved: they exist only under the skill directory.
{baseDir} is the documented mechanism for exactly this and resolves against
the skill own directory, so it works regardless of where the skill is
installed. CONTRIBUTING.md is left alone: it is a workspace-root file and
already resolves.
* Revert the {baseDir} rewrite: it was cleanup, not a fix
The skills catalog prompt already instructs the model to resolve a relative
reference against the skill directory and use the resulting absolute path
(src/skills/loading/skill-contract.ts). These ten references were therefore
never broken, and rewriting them does not belong in a rename follow-up.
Restores this file to its state on main.
* Restore the sibling-relative read path
The skills catalog prompt resolves a relative reference against the skill
directory, so ../technical-documentation/SKILL.md resolves to
.agents/skills/technical-documentation/SKILL.md and was already correct.
Rewriting it workspace-relative was churn on a line whose only defect was
the retired skill name.
This leaves the PR as what it claimed to be: three references to a skill
that was renamed in 0dabb70.
Self-learning reviewer edits existing skills via targeted patches: it quotes the exact live text (or appends a section) and the service composes the full body inside the receipt-pinned read that hash-binds the proposal — untouched content survives by construction, and patches auto-apply through the scanner-gated pipeline. Full-body rewrites and oversized-skill edits stay pending for the operator. The review prompt shifts to active capture within the existing evidence gates, and shallow same-sender turns accumulate per session (provider-identity scoped, zero-iteration and duplicate-run contracts honored, aborted provenance carried, bounded state) so quick corrections get reviewed with their own transcripts. Replaces closed#119856.
Keep Telegram native and typed callback routes under their owning handlers. Expired or malformed typed buttons now clear their controls and return visible unavailable feedback while legacy raw plugin callbacks remain compatible.
Verify Telegram accepted-message topics before follow-up sends, preserving partial-delivery evidence instead of trusting requested routing.
Co-authored-by: Lu Wang <7668944+wangwllu@users.noreply.github.com>
formatInvalidConfigLogMessage used \\n (literal backslash-n) in a
template literal, producing literal text instead of a line break in
gateway startup logs. The sibling createInvalidConfigError already used
a real newline. Operators saw a single-line message with \n text
instead of a readable multi-line block.
Fixes#119870
Co-authored-by: ruel225 <ruel225@users.noreply.github.com>
Emit usage once at the shared plugin completion boundary and expose host-derived plugin identity only on OTel usage spans. Preserve aggregate metric labels and cover the redacted Gateway path end to end.
Refs #98968
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
Co-authored-by: ZengWen-DT <ceng.wen@xydigit.com>
Room-event turns now send the persisted attributed chat line as the active model body, so the turn replays byte-identically and the provider prefix cache survives ambient traffic. The room-event context block keeps only the marker, room backlog, and reply-policy directive: the duplicate marker, bare inbound_event_kind line, and Current event copy of the chatter are gone, and the dead Current event goal anchor is removed from inbound-meta. Net -18 production LOC; quiet-room behavior unchanged (message tool still required for visible replies).
Deletes the deterministic regex capture path that templated raw chat text into skill proposals (junk like a proposal whose whole procedure was one slugified user message). All autonomous learning now flows through the isolated experience reviewer: it sees a bounded workspace skill list, prefers revising pending proposals or updating the governing skill over creating new ones, and treats durable user corrections as first-class evidence. Update proposals are reviewer-only (explicit opt-in) and never auto-apply, since the reviewer drafts them without the live skill body. Removes the producerless pending-suggestion session machinery. Regression test proves the junk path is gone; real-Telegram E2E verdict in the PR body.
Defer Telegram final-mode text until speech settles, then deliver one captioned voice note or a proven-safe text fallback.
Co-authored-by: Jerry-Xin <jerryxin0@gmail.com>