Commit Graph

36532 Commits

Author SHA1 Message Date
Vincent Koc
f53fdb688d fix(qa): restore package docker gates 2026-07-04 01:56:21 +02:00
Dallin Romney
75fab4fbc6 refactor: remove redundant unique-list aliases (#99702) 2026-07-03 16:38:02 -07:00
mikasa
7430168c10 fix(exec): avoid splitting surrogate pairs in approval display (#99566)
* fix(exec): avoid splitting surrogate pairs in approval display

Use the shared UTF-16 safe truncation helper for exec approval display caps so long sanitized command previews remain well-formed when the cutoff lands inside a surrogate pair.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(exec): sanitize malformed approval text

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-03 16:31:00 -07:00
Dallin Romney
a633887c34 refactor(models): consolidate catalog ref parsing (#99682) 2026-07-03 16:28:25 -07:00
Ayaan Zaidi
fe513ffe5e fix(agents): make cli binding tool-scope hash session-stable 2026-07-03 16:27:06 -07:00
Dallin Romney
00b7eac5c3 refactor: consolidate number coercion callers (#99671)
* refactor: consolidate number coercion callers

* fix: stabilize plugin sdk surface resolution
2026-07-03 16:24:43 -07:00
Dallin Romney
9c75a14d5c refactor(infra): consolidate SHA-256 digest helpers (#99687) 2026-07-03 16:18:31 -07:00
Vincent Koc
c45124ab85 fix(infra): preserve top-level pricing metadata in session logs 2026-07-03 16:08:22 -07:00
NianJiuZst
c5260a3c03 fix: estimate known zero transcript costs 2026-07-03 16:08:22 -07:00
Dallin Romney
0cd936cc77 test(qa): redact script evidence diagnostics (#99629) 2026-07-03 15:42:33 -07:00
Gio Della-Libera
219f27a5ec Expose legacy cron store doctor lint findings (#99211)
Adds a default-disabled Doctor lint check for legacy cron store state while keeping real repair in the existing doctor --fix path.

Verification:
- Focused cron/contribution Vitest passed (119 tests).
- Changed-file oxfmt passed.
- Changed-file oxlint with core tsconfig passed.
- pnpm check:architecture passed.
- SDK surface report passed.
- git diff --check passed.
- Source CLI proof on isolated config/state passed for doctor --lint --json --only core/doctor/legacy-cron-store.
- Exact-head hosted checks are clean/skipped; only superseded auto-response/proof runs were cancelled.

Maintainer notes:
- ClawSweeper: proof sufficient, platinum hermit, exact-head reviewed.
- No public SDK/plugin/config/CLI contract change; default doctor --lint remains unchanged.
2026-07-03 15:28:29 -07:00
Peter Steinberger
af420dbee5 fix(macos): remote mode fails with managed SSH aliases (#99661)
* fix(macos): support managed SSH aliases safely

* test(macos): serialize gateway state isolation
2026-07-03 15:19:01 -07:00
SunnyShu
19d621e760 fix(auto-reply): strip stray punctuation before silent-reply token detection (#98224)
* [AI] fix(auto-reply): strip stray punctuation before silent-reply token detection

When the model emits .NO_REPLY or *NO_REPLY* instead of bare NO_REPLY,
isSilentReplyText() failed to detect it because the regex requires
the text to consist only of the token with optional whitespace.

Add stripEdgeNonAlnum() that strips leading/trailing non-letter,
non-number characters (Unicode-aware) before the regex test. This
catches stray punctuation while preserving the existing safeguard
against suppressing mixed-content text.

Related to #98166

Co-Authored-By: Claude <noreply@anthropic.com>

* [AI] fix: strip only punct not emoji before silent-reply detection

Change stripEdgeNonAlnum to stripEdgePunct: strip only punctuation (\p{P}) instead of all non-letter/non-number characters. Emoji would be stripped by the former, causing false silent-reply on mixed content.

Related to #98166

Co-Authored-By: Claude <noreply@anthropic.com>

* [AI] fix: preserve exact custom-token match before edge-punct normalization

Try exact regex match first, then fall back to stripEdgePunct.
This preserves exact matching for custom tokens whose first/last
character is punctuation (e.g. *SILENT*, #QUIET#), while still
catching the common case of NO_REPLY wrapped in stray punctuation.

Add regression test for punctuation-edged custom tokens.

ClawSweeper: https://github.com/openclaw/openclaw/pull/98224#issuecomment-4846415801

Related to #98166

Co-Authored-By: Claude <noreply@anthropic.com>

* [AI] fix: handle whitespace-wrapped punctuation in silent-reply fallback

Trim whitespace before stripping edge punctuation in the fallback
path so variants like " .NO_REPLY " and "NO_REPLY. " are also
caught by the silent-reply detector.

Add regression coverage for whitespace-wrapped edge punctuation.

ClawSweeper: https://github.com/openclaw/openclaw/pull/98224#issuecomment-4846415801

Related to #98166

Co-Authored-By: Claude <noreply@anthropic.com>

* test(auto-reply): tighten silent-token boundaries

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-03 14:22:51 -07:00
LZY3538
7d593bb9ae fix: log terminal session persistence failures (#97839)
* fix: log terminal session persistence failures

* fix: format terminal persistence error logs

* fix(gateway): identify failed terminal persistence

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-03 14:12:16 -07:00
pick-cat
09dc880f89 fix(media): guard ffprobe JSON parse against malformed output (#98613)
* fix(media): guard ffprobe JSON parse against malformed output

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* chore: trigger CI re-run

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* chore: trigger CI re-run

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix(media): validate ffprobe JSON shape

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-03 14:11:14 -07:00
xingzhou
1755a9dc5b fix(daemon): launch env wrapper through shell (#89967) 2026-07-03 13:56:37 -07:00
Gio Della-Libera
6011c9e16d Expose WhatsApp responsiveness doctor lint findings (#98406)
Adds a default-disabled Doctor lint check for WhatsApp responsiveness pressure while keeping real cleanup in the existing doctor --fix path.

Verification:
- Focused WhatsApp responsiveness/contribution Vitest passed (71 tests).
- Changed-file oxfmt passed.
- Changed-file oxlint with core tsconfig passed.
- SDK surface report passed.
- SDK export sync passed.
- git diff --check passed.
- Selected source CLI proof passed earlier on this head: doctor --lint --json --only core/doctor/whatsapp-responsiveness exited 0, ran 1 check, and did not create <state>/identity/device.json.
- Exact-head hosted checks passed/skipped on 39f003931ff8cd93f945e75bf7a480cf2271c910; older cancelled proof/auto-response runs were superseded by passing current runs.

Maintainer notes:
- ClawSweeper platinum hermit / ready for maintainer review.
- Accepted the opt-in lint check id and warning copy on the PR.
- No public config/plugin/SDK/persisted data contract change; default doctor --lint remains unchanged.
2026-07-03 11:55:10 -07:00
Gio Della-Libera
43a7fd3839 Expose stale plugin runtime symlink doctor lint findings (#98729)
Adds a default-disabled Doctor lint check for stale plugin-runtime symlinks while keeping real deletion in the existing legacy doctor --fix cleanup path.

Verification:
- Focused plugin-runtime-symlink/contribution Vitest passed (65 tests).
- Changed-file oxfmt passed.
- Changed-file oxlint with core tsconfig passed.
- SDK surface report passed.
- git diff --check passed.
- Exact-head hosted checks passed/skipped on 287d2230ee.

Maintainer notes:
- ClawSweeper platinum hermit / ready for maintainer look.
- Accepted the new opt-in lint check id and warning copy on the PR.
- Local prepare wrapper pnpm check still fails on the npm shrinkwrap guard, and the same failure reproduces on current origin/main; treated as baseline local gate noise, not PR-caused.
2026-07-03 10:52:45 -07:00
Ayaan Zaidi
48e8965b10 fix(agents): keep cli session binding facts session-stable
Keep CLI session reuse hashes keyed to stable session prompt facts while preserving per-turn room-event message-tool delivery for execution and MCP scoping.

Thread cliSessionBindingFacts from reply assembly through queued/followup CLI runs, make the stable CLI prompt delivery-neutral, and cover production-shaped room-event opts so forced message_tool_only delivery cannot poison binding identity.

Fixes #99372

Release note: Telegram/room-event CLI backends can resume sessions across interactive turns again instead of replaying full history after system-prompt invalidations.
2026-07-03 09:01:26 -07:00
Gio Della-Libera
6638a575d3 Expose legacy plugin dependency doctor lint findings (#98725)
Expose default-disabled Doctor lint findings for legacy plugin dependency state.

The check maps the existing safe cleanup-target detection into structured lint output while keeping real cleanup in the legacy doctor --fix path. Default doctor --lint remains unchanged; explicit --only and --all can include the new warning.

Validation:
- GitHub checks green on head 53c11a6f82
- ClawSweeper: proof sufficient, platinum hermit, ready for maintainer look
- Local post-rebase proof: focused Doctor Vitest, changed-file oxlint, changed-file oxfmt --check, and git diff --check all passed

Maintainer note: WSL maintainer wrapper path is unavailable on this host with Wsl/Service/CreateInstance/0x80072745, so this uses the steerable head-pinned squash path allowed by the current maintainer workflow docs.
2026-07-03 08:45:07 -07:00
snowzlm
ecc486bde2 fix(agents): preserve primitive tool result output (#99526)
* fix(agents): preserve primitive tool result output

* fix(agents): omit primitive inline payloads

* fix(agents): omit primitive inline payloads

---------

Co-authored-by: snowzlm <snowzlm@users.noreply.github.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-03 08:16:20 -07:00
pick-cat
b2620d7153 fix(infra): bound jsonl-socket response buffer to prevent OOM (#98130)
* fix(infra): bound jsonl-socket response buffer to prevent OOM

* fix(macos): cap exec host socket output

* fix(macos): satisfy swiftformat for exec limiter

* test(macos): prove exec host output cap on command output

* chore: keep jsonl socket cap scoped to infra

* fix(infra): raise jsonl socket buffer cap

* test(infra): prove jsonl socket cap beats timeout

* ci: rerun jsonl socket buffer bound checks

* fix(macos): cap exec host response output

* test(macos): avoid private exec response fixtures

* fix(macos): satisfy exec output limiter formatting

* fix(macos): avoid static self formatting conflict

* chore: keep jsonl socket guard infra-only

* fix(jsonl-socket): parse complete lines before enforcing the buffer cap

* chore: remove unnecessary return after finish(null)

* fix(infra): frame bounded JSONL socket lines

* fix(infra): frame bounded JSONL socket lines

* style(macos): keep exec limiter patch focused

* style(macos): keep exec limiter patch focused

* style(macos): satisfy exec limiter formatting

* style(infra): satisfy socket loop lint

---------

Co-authored-by: Peter Steinberger <peter@steipete.me>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-03 08:15:47 -07:00
LZY3538
e272da5c55 fix: keep always-on group fallback messages in dispatch (#99506)
* fix(auto-reply): honor always-on plugin fallback groups

* fix(channels): preserve mention policy across bindings

* test(discord): type mention policy dispatch context

* test(discord): type mention policy dispatch context

* fix(whatsapp): preserve effective mention policy

* fix(whatsapp): preserve effective mention policy

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-03 07:26:45 -07:00
Jesse Merhi
8c915f0685 feat(signal): add target aliases (#95738)
* feat(signal): add target aliases

* fix(signal): canonicalize alias delivery targets

* fix(signal): harden alias target resolution

* test(signal): cover formatted media aliases

* test(signal): align approval alias proof with request shape

* Reuse Signal alias map for directory listing
2026-07-03 23:40:10 +10:00
Masato Hoshino
153fed790a fix(gateway): declare the dev agent required by the gateway e2e session key (#99520) 2026-07-03 05:30:09 -07:00
Eva
414ecd2b96 Preserve Codex output after missing turn completion (#99217)
* Preserve Codex output after missing turn completion

* fix: narrow Codex completion-timeout output recovery

* test(codex): narrow binding path guard

* fix: narrow Codex completion-timeout output recovery

* test(codex): narrow binding path guard

* fix(codex): preserve id-less post-tool replies

---------

Co-authored-by: Sedrak-Hovhannisyan <264150421+Sedrak-Hovhannisyan@users.noreply.github.com>
Co-authored-by: Eva <eva@100yen.org>
Co-authored-by: Jason (Json) <263060202+fuller-stack-dev@users.noreply.github.com>
2026-07-03 05:07:54 -07:00
Peter Lee
4abdf0f3b5 fix(logging): redact Telegram bot tokens from timeout URLs (#99428)
* fix(net-policy): redact Telegram bot tokens from timeout URLs

* fix(net-policy): extend Telegram bot token redaction to all hostnames

* refactor(net-policy): centralize bot token URL redaction

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-03 05:05:38 -07:00
Jesse Merhi
8abc633cf8 Add Signal status reaction lifecycle (#98791) 2026-07-03 21:42:39 +10:00
sheyanmin
d825a6cc8e fix(subagents): match requesterSessionKey when controllerSessionKey differs in list filter (#99410)
* fix(subagents): match requesterSessionKey when controllerSessionKey differs in list filter

The listControlledSubagentRuns filter used a fallback (||) to pick one
key for matching. When controllerSessionKey was set but did not match the
caller's session key, the filter returned false even though
requesterSessionKey could have matched.

Change the filter to OR logic: if either controllerSessionKey or
requesterSessionKey matches the caller key, include the run.

Fixes #75593

* fix(subagents): add braces for lint compliance and real behavior proof

- Add braces around if-return statements to pass eslint(curly)
- Add evidence script verifying OR-match filter behavior

Evidence (3 scenarios, all pass):
  S1: controllerKey=agent:main:main, requesterKey=telegram → 1 result (PASS)
  S2: controllerKey=telegram, requesterKey=agent:main:main → 1 result (PASS)
  S3: both keys unrelated → 0 results (PASS — scope isolation)

🦞 diamond lobster: L2 evidence (isolated tsx + real exports)

Ref. https://github.com/openclaw/openclaw/pull/99410

* fix(subagents): replace evidence scripts with focused regression tests

- Remove evidence/ scripts (failing check-guards per review)
- Add listControlledSubagentRuns test coverage in subagent-control.test.ts
- Three scenarios: controller match, requester match (new fix), scope isolation

Ref. https://github.com/openclaw/openclaw/pull/99410

* refactor(subagents): clarify read visibility ownership

---------

Co-authored-by: sheyanmin <sheyanmin@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-03 04:41:36 -07:00
NianJiu
d354e9eb2b fix: long mobile media recordings time out (#99455)
* fix node media recording invoke timeouts

* refactor(agents): separate recording timeout budgets

---------

Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-03 04:40:42 -07:00
zengLingbiao
459b93e3dd fix(config): use Object.hasOwn instead of in operator in restoreOriginalValueOrThrow (#99152)
* fix(config): use Object.hasOwn instead of in operator in restoreOriginalValueOrThrow

* test(config): add regression test for prototype-named keys in restoreRedactedValues

* test(config): focus prototype restore regression

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-03 04:32:25 -07:00
xingzhou
749c0bf958 fix(agents): preserve fd find failures (#99446)
* fix(agents): preserve fd find failures

* test(agents): use tracked temp dirs in find test

* test(scripts): update temp-dir routing expectation

* test(agents): make fd failure fixture deterministic

* test(agents): isolate fd process failure fixture

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-03 04:30:41 -07:00
Jesse Merhi
64318d7624 Rework Android gateway onboarding setup (#98752)
* feat(android): rework gateway onboarding setup

* fix(android): restore protocol mismatch onboarding guidance

* fix(android): sync onboarding native i18n

* fix(android): preserve LAN manual setup prefill

* fix(android): refine onboarding node approval step

* fix(android): polish onboarding recovery actions

* test(android): cover onboarding protocol mismatch copy

* fix(android): separate onboarding node approval

* fix(android): guard onboarding node approval transitions

* fix(android): keep onboarding approval states reachable

* fix(android): wait for node access before onboarding continue

* fix(android): refresh node approval after operator handoff

* fix(android): refresh onboarding approval states

* fix(android): require approval after onboarding permission changes

* fix(android): keep onboarding approval gates active

* fix(android): preserve permission reapproval state

* fix(android): skip node approval on legacy gateways

* fix(android): wait for node approval refresh

* fix(android): preserve camera setting on upgrade

* fix(android): avoid stuck approval check spinner

* fix(android): request talk secrets on operator connects

* fix(android): avoid missed node approval completion

* fix(android): keep nearby LAN setup local

* fix(android): complete onboarding after node approval

* fix(android): reconcile onboarding with gateway auth plans

* chore(android): refresh native i18n inventory after rebase

* Fix Android onboarding review edge cases

* Fix native i18n onboarding sentinels
2026-07-03 21:20:12 +10:00
Jesse Merhi
776b34a4e6 fix: chat.send no reply when thinking metadata is set (#98855)
* fix(gateway): preserve chat thinking metadata

* test: harden chat thinking metadata coverage

* test: harden chat thinking metadata coverage
2026-07-03 21:03:41 +10:00
qingminlong
3e2d373d43 fix(cli): reject unsafe sessions tail counts (#99398)
* fix(cli): reject unsafe sessions tail counts

* fix(cli): reuse strict tail count parser
2026-07-03 03:53:35 -07:00
ooiuuii
05de72c4cd fix: strip conda env marker from host tool runs (#99425)
* fix: strip conda env marker from host exec env

* fix(infra): block Conda default environment selector

Co-authored-by: 丁宇婷0668001435 <ding.yuting@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: 丁宇婷0668001435 <ding.yuting@xydigit.com>
2026-07-03 03:40:51 -07:00
wangmiao0668000666
f84bcdb4d7 fix(anthropic): wire buildGuardedModelFetch into the Cloudflare createClient branch (#98003)
* fix(anthropic): guard Cloudflare Anthropic fetches

Wire the Cloudflare AI Gateway Anthropic SDK client through buildGuardedModelFetch so this path gets the same SSRF and transport policy as sibling providers.

Keep the behavior proof focused on the regression: a Cloudflare Anthropic request pointed at a link-local address must fail before the SDK reaches global fetch.

* fix(anthropic): add loopback proof test to cloudflare fetch wiring

* test(anthropic-cloudflare): trim proof to SSRF-block only, remove synthetic loopback server
2026-07-03 13:17:28 +03:00
chenyangjun-xy
36dd9ee3c3 Fix/issue 98958 gateway lock fd leak (#99291)
* fix(infra): close fd and remove lock file on writeFile failure (#98958)

When fs.open(lockPath, "wx") succeeds but handle.writeFile() fails
(e.g. disk full / ENOSPC), close the file handle and remove the
partially-written lock file before re-throwing to avoid a file
descriptor leak and stale lock artifact.

Changes:
- src/infra/gateway-lock.ts: nested try-catch around writeFile
- src/infra/gateway-lock.test.ts: test for fd close + lock cleanup
- scripts/verify-gateway-lock-fd-leak*.mjs: fault-injection proof

Co-Authored-By: Claude <noreply@anthropic.com>

* test(infra): strengthen gateway lock cleanup proof

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-03 02:23:41 -07:00
sunlit-deng
a9051b45cf fix(daemon): avoid loading full gateway logs during diagnostics (#99407)
* fix(daemon): bound gateway diagnostic log reads

* fix(daemon): share bounded gateway log tails

* fix(daemon): complete bounded tail reads

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-03 02:22:42 -07:00
SunnyShu
68e06b9ea1 fix(gateway): include session label in deriveSessionTitle fallback chain (#98841)
* fix(gateway): include session label in deriveSessionTitle fallback chain

When a session is renamed with /name, the user-provided label is persisted
in sessions.json but was ignored by deriveSessionTitle. This caused the
TUI session picker and other derived-title consumers to show auto-generated
or UUID-based names instead of the user's label.

Add entry.label to the deriveSessionTitle fallback chain after
displayName and subject, before the auto-derived firstUserMessage and
sessionId fallbacks. This aligns with the existing ACP translator
precedence (derivedTitle ?? displayName ?? label ?? key).

Related to #98742

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* test(gateway): tighten session label precedence coverage

* fix(gateway): prioritize explicit session labels

* fix(commands): preserve named-session suggestions

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-03 02:09:31 -07:00
Yzx
76cf1b01af fix: memory_search honors generic embedding providers (#97095)
* fix(agents): resolve generic memory embedding providers

* test(agents): restore generic embedding registry state

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-03 02:07:43 -07:00
Peter Steinberger
1fef99962e feat(nodes): add auto-discovered Ollama inference (#99234)
* feat(nodes): add local Ollama inference

* fix(gateway): preserve plugin node runtime for agent turns

* feat(ollama): add node inference opt-out

* test(security): preserve plugin runtime exports

* test(security): preserve plugin runtime exports

* test(security): preserve plugin runtime exports

* fix(ci): raise artifact build heap
2026-07-03 01:14:30 -07:00
Peter Steinberger
1c7229dead fix(android): expose exact gateway recovery actions (#99414)
* fix(android): expose exact gateway recovery actions

* fix(android): keep auth recovery actionable

* fix(android): cover terminal gateway auth states

* fix(android): keep recovery commands current

* fix(android): reset gateway-scoped recovery state

* fix(android): keep auth rate limits terminal

* fix(android): expire approval ids before refresh

* chore(i18n): refresh Android recovery inventory
2026-07-03 00:30:25 -07:00
Colin Johnson
7cfc66ad07 fix(android): derive Voice readiness from Gateway catalog (#98269)
* fix(android): derive voice readiness from Gateway catalog

Co-authored-by: Colin <colin@solvely.net>

* chore(android): sync native i18n inventory

* test(gateway): use registered realtime provider ids

* fix(gateway): satisfy Talk catalog lint

* chore(android): refresh voice i18n inventory

* fix(talk): preserve runtime readiness semantics

* fix(talk): make catalog readiness authoritative

* fix(talk): validate selected provider readiness

* fix(android): honor authoritative talk readiness

* fix(android): inventory voice readiness copy

* fix(talk): report runtime-selected catalog provider

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-02 23:32:03 -07:00
Ayaan Zaidi
4e6933c84f fix(auto-reply): restore per-turn message-tool delivery contract
Addressed source-reply turns now carry the message-tool-only delivery hint in runtime prompt context, matching the room-event per-turn contract without persisting the hint into transcript rows.

Surface: auto-reply prompt envelopes and agent messaging guidance. Fixes #99371.

Release-note: fixes Telegram group replies under message_tool_only delivery being composed privately instead of being prompted to use message(action=send).
2026-07-02 23:11:32 -07:00
Ayaan Zaidi
0bf66ab7bd fix(sessions): scope ambient transcript watermark to session id
Ambient transcript watermarks now carry the transcript session id, resolve only for the current session entry, and skip stale room-event hooks that no longer match the prepared transcript session.

This protects Telegram group prompt windows after reset by backfilling rows that are no longer present in the new session transcript, while preserving steady-state watermark filtering within one session.

Fixes #99373

Release-note: fixes Telegram group context loss after session reset when ambient transcript watermarks outlived the transcript they referenced.
2026-07-02 22:57:01 -07:00
NianJiuZst
4d5d9dda92 fix: avoid DeepSeek-native thinking on OpenRouter V4 2026-07-02 22:50:58 -07:00
Dallin Romney
4f4e9a4c78 refactor(shared): consolidate core record guards (#99359) 2026-07-02 22:13:17 -07:00
Ayaan Zaidi
3ad465d32b fix(telegram): persist ambient transcript rows
Persist room-event observations as durable bare user transcript rows and carry an ambient transcript watermark through session state so Telegram chat windows only include the unpersisted gap.

Fixes #99257
2026-07-02 19:01:22 -07:00
Dallin Romney
84c9f05513 Allow alternate Zalo Bot API roots (#98768)
* Allow alternate Zalo Bot API roots

* Normalize Zalo provider timestamps
2026-07-02 18:44:15 -07:00