* docs(slack): drop retired socketMode transport tuning
channels.slack.socketMode is rejected by Slack config validation, pinned by
the 'rejects retired Socket Mode ping/pong transport tuning' schema test, and
the client pong timeout is now a hardcoded 15s constant. The page still told
operators to configure it.
* fix(slack): migrate retired socketMode with doctor instead of hand-editing
The retired object fails schema validation at root and account scope, so the
docs previously left manual removal as the only recovery. Slack already owns
legacyConfigRules and normalizeCompatibilityConfig, so the strip belongs there.
* test(slack): narrow the doctor contract config record for check-test-types
normalizeCompatibilityConfig returns a possibly-absent channel entry, so the
socketMode assertions need expectDefined before indexing.
* docs(slack): describe socketMode retirement by observed behavior
openclaw config validate reports a config carrying the retired object as valid,
so the earlier 'validation rejects it / fails to load' wording was wrong. The
observable facts are that it is not read and that doctor --fix removes it.
* revert(slack): drop the duplicate socketMode doctor migration
Core already strips channels.slack.socketMode at root and account scope in
legacy-config-migrations.runtime.retired.ts via visitChannelEntries, so the
plugin-side rule was duplicate policy. Keeps this PR to the docs correction.
* docs(slack): state what doctor actually cleans up for socketMode
Doctor flags retired layout knobs with a general notice, and --fix removes the
three named fields and drops the object only once empty, so an unknown key
inside it survives.
The forward substring check in isMessagingToolDuplicateNormalized treated any
reply containing a prior message-tool send as a duplicate, with no length
floor. A short interim update sent via the message tool then suppressed the
entire final reply that restated it, and the user never received the answer.
The reverse direction already carried a 0.5 length ratio floor. Apply the same
floor to the forward direction so a reply is only deduped when the prior send
covers at least half of it.
* fix(agents): apply image context to current turn
* fix(agents): align runtime context with prompt order
* fix(agents): make turn context position independent
* fix(agents): bind internal context to the active user turn
Keep current-turn runtime context position-independent while preserving the shared privacy notice, runtime events, prompt-cache placement, and historical preface sanitization. Consolidate header detection in its existing owner and retain the original real turn-boundary regression.
Fixes#110672
Co-authored-by: chernoff-code <221717140+chernoff-code@users.noreply.github.com>
---------
Co-authored-by: chernoff-code <221717140+chernoff-code@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Keep shared endpoint routing signal-aware while preserving explicit signal-specific URLs exactly. Cover the resolver through mocked constructors and real OTLP/HTTP trace, metric, and log exporters.
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
Why: managed discussion reconciliation must tolerate current ClickClack response shapes without persisting undefined plugin state or stale display titles.
Co-authored-by: Chisel <chisel@psiclawops.dev>
Prevent stale top-level buttons arguments from silently sending text-only Telegram messages. Point model guidance and docs to typed presentation actions, and reject retired input before delivery.
* fix(system-agent): a failed reset leaves the old conversation in context
`openclaw.chat` with `reset: true` discards the live session and disposes its
engine before verifying inference and building the welcome. The durable reset
marker was only written after both of those steps, so an inference outage during
a reset destroyed the session without recording the boundary. The next ordinary
session then seeded model context from the pre-reset transcript, because seeding
reads only the turns after the newest reset marker.
Record the boundary in a finally around the disposal, so it survives both a
rejected disposal and a replacement that fails to initialize, and drop the later
write. Disposal still runs first, so a failed marker write cannot leak the engine.
* fix(system-agent): persist resets before discarding live sessions
Persist the durable reset marker before deleting the live session so a failed SQLite write leaves the session, engine, and pending approval untouched. Preserve the original real-SQLite privacy-boundary regression coverage.
Co-authored-by: Masato Hoshino <g515hoshino@gmail.com>
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com>