Commit Graph

16559 Commits

Author SHA1 Message Date
Peter Steinberger
31ed59bdf6 feat: keep main agents aware of group activity (#110332)
* feat(sessions): auto-watch group activity from main

* feat(sessions): allow watchers to read watched sessions

* fix(sessions): skip group watches for system turns

* fix(sessions): preserve watched session semantics

* fix(channels): propagate effective dm scope

* fix(sessions): canonicalize main watch identity

* fix(sessions): distinguish ambient group watches

* fix(sessions): revoke ineligible ambient watches

* chore: drop CHANGELOG edit (release generation owns it)
2026-07-18 04:06:58 +01:00
Peter Steinberger
0a5c2d127f test(qa): acknowledge kitchen sink plugin trust (#110335) 2026-07-18 03:47:43 +01:00
Peter Steinberger
bd8c5399d8 fix: restore iMessage and WhatsApp channel test coverage (#110327)
* test(imessage): mock core turn dispatch for media policy coverage

PR #110095 missed this iMessage media-policy test file.

* test(imessage): mock core turn dispatch for last-route coverage

* test(whatsapp): mock core turn dispatch for broadcast coverage

* test(imessage): drop type-dead terminal-admission branch in media harness
2026-07-18 03:44:10 +01:00
Peter Steinberger
60ed910639 fix(diagnostics): own run activity listener lifecycle (#110312) 2026-07-18 03:29:06 +01:00
Peter Steinberger
53b53f1977 improve(agents): exact web_fetch output contract with cleaned result shape (#110223)
* feat: add web fetch output contract

* fix(agents): keep web_fetch contract schema module-local

* docs: refresh docs map for the web_fetch result section
2026-07-18 03:28:29 +01:00
Peter Steinberger
d8f2645c2c refactor(memory-wiki): move compiled cache to plugin state (#110167)
* feat(plugin-sdk): prepare memory prompts asynchronously

* refactor(memory-wiki): move compiled cache to plugin state

* fix(plugin-sdk): export memory prompt preparer type

* refactor(plugin-sdk): keep prompt preparer type private

* test(memory-wiki): isolate compiled cache state

* chore(memory-wiki): satisfy changed gates

* fix(memory): preserve prepared prompts across context engines

* docs(plugin-sdk): refresh API baseline

* fix(memory): revalidate prepared prompt ownership

* fix(codex): propagate sandboxed memory context

* test(memory-wiki): seed durable vault identity

* refactor(memory-wiki): keep cache lifecycle internal

* fix(memory-wiki): harden compiled cache publication

* style(memory-wiki): format cache lifecycle changes

* test(memory-wiki): support extension test lib target

* style(memory-wiki): remove redundant catch

* refactor(memory-wiki): keep vault generation helper private
2026-07-18 03:05:03 +01:00
morluto
cf63c83bf6 fix(qa-lab): close transport before gateway teardown (#106027)
* fix(qa-lab): close transport before gateway teardown

* test(qa-lab): bind teardown order to production plan

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 02:34:11 +01:00
ZOOWH
1c331b9b0f fix(clawrouter): sanitize attribution headers to ByteString (#106454)
* fix(clawrouter): sanitize bounded header ids

Co-authored-by: ZOOWH <xu.wenhan1@xydigit.com>

* fix(clawrouter): keep sanitized ids collision-resistant

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 02:12:53 +01:00
Leon-SK668
dcd8f962e3 fix(qqbot): add timeouts to API response reads (#103855)
* fix(qqbot): add timeouts to API response reads

* fix(qqbot): use guarded request deadlines

---------

Co-authored-by: Alix-007 <li.long15@xydigit.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 02:06:09 +01:00
Wynne668
bcc44ba1b1 fix(whatsapp): resolve abortPromise when stop signal already fired (#109903)
* fix(whatsapp): resolve abortPromise when stop signal already fired

waitForClose() races on abortPromise, but a pre-aborted gateway stop
signal never settled that promise because the abort listener was skipped.
Resolve abortPromise immediately when abortSignal.aborted is already true.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(whatsapp): resolve tsgo TS18048 and test mock in pre-aborted abortPromise fix

- Extract params.abortSignal to local const so tsgo can narrow the type
  through else-if control flow, fixing TS18048: possibly undefined
- Remove setupAbortController/ownerAcquireAbortController.abort() from
  the constructor's pre-aborted branch so openConnection() still works
  when the stop signal was already fired at construction time
- Use createSocketWithTransportEmitter() mock in the new test so
  shutdown() cleanup has sock.end() and ws.removeListener() available

* fix(whatsapp): preserve pre-aborted setup cancellation

* fix(whatsapp): unify connection abort handling

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 02:04:59 +01:00
Peter Steinberger
6f0f6af62e fix(discord): preserve gateway messages across dispatch crashes (#110274)
* fix(discord): adopt durable ingress drain for gateway messages

Gateway MESSAGE_CREATE events dispatched with only an in-memory/persistent
5-minute dedupe; a crash between receive and dispatch lost the message (live
sessions replay via RESUME, but session state is memory-only so a cold
restart re-IDENTIFYs — stated platform limitation: the drain closes the
receive->dispatch window, not cold downtime). Raw API messages now journal
durably (event_id = message snowflake, lane per channel/thread) before
normalization; dispatch runs through the core drain with deferred claims,
fan-out adoption, gated settlement, and 30d/5k tombstones. The persistent
guard is deleted after its RESUME duplicate-delivery parity test. Edits stay
outside the queue: only MessageCreateListener is registered, MESSAGE_UPDATE
never dispatches, so snowflake tombstones cannot swallow edit turns; a future
edit dispatcher must namespace its event ids.

Autoreview blocked by codex sandbox network in the build stage; full manual
review performed. Part of the #109657 fleet adoption program (wave 2).

* style(discord): keep drain-internal types and dispatcher unexported

* refactor(discord): move message dispatcher to its own module for the dead-export gate

* fix(discord): shutdown dispatch releases claims instead of tombstoning

Landing autoreview reproduced a real loss race: a dispatch entering after
dispatcher shutdown (or with an aborted signal) returned completed, so the
drain tombstoned a message that never ran and a restarted gateway skipped it
forever. Aborted-before-dispatch now returns failed-retryable so the claim
releases for replay. Test type imports of drain-internal types converted to
factory-derived types so the dead-export gate and typecheck agree.
2026-07-18 01:58:19 +01:00
Masato Hoshino
cc0a977dd5 fix(memory-wiki): prevent source ingest content loss during concurrent vault writes (#104209)
* fix(memory-wiki): serialize source ingest with vault mutations

* test(memory-wiki): make ingest lock proof deterministic

* test(memory-wiki): type queue spy receiver

* test(memory-wiki): keep queue spy lint-safe

* style(memory-wiki): format ingest lock proof

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 01:47:01 +01:00
wangmiao0668000666
dc0285366e fix(msteams): bound probe token acquisition to request deadline (#106386)
* fix(msteams): bound probe token acquisition to request deadline

probeMSTeams() at extensions/msteams/src/probe.ts:75 and :89 awaited
tokenProvider.getAccessToken(...) for the Bot Framework and Microsoft
Graph token endpoints with no surrounding deadline. The Microsoft
Teams SDK does not carry an inherent timeout on these calls, so a
stalled Azure AD token endpoint pinned the probe indefinitely.

Wrap both awaits with withMSTeamsRequestDeadline (default
MSTEAMS_REQUEST_TIMEOUT_MS = 30_000), matching the pattern already
used by six other MS Teams call sites: attachments/bot-framework.ts:252,
attachments/graph.ts:258, monitor-handler/message-handler.ts:594/654/685/692,
attachments/download.ts:167, team-identity.ts:37.

The probe was the one missing site. No new helper, no SDK change.
The existing outer catch at probe.ts:138 and inner catch at probe.ts:110
convert the timeout into a ProbeMSTeamsResult with ok: false and a
structured error field.

Added probe.timeout.test.ts: real probeMSTeams() with vi.mock
injected never-resolving getBotToken/getGraphToken; asserts the call
returns within the 30s bound instead of hanging to the proof budget.

* test(msteams): drive probe timeout test with vi.useFakeTimers

The original probe.timeout.test.ts waited 90 seconds of wall-clock per
focused run (3 stalled cases racing against a real setTimeout budget).
Per ClawSweeper P2 (automation), this material deterministic CI cost can
slow or time out test shards.

Drive the withTimeout race (from @openclaw/fs-safe/dist/timing.js, uses
setTimeout + clearTimeout) via vi.useFakeTimers() so each stalled case
resolves in milliseconds. Add one new case that spies on withTimeout's
timeoutMs argument to assert the production default deadline is exactly
MSTEAMS_REQUEST_TIMEOUT_MS = 30_000, so the production contract is not
silently weakened by the fake-timer change.

Per-case wall-clock: 25ms / 3ms / 2ms / 1ms / 2ms (was: 30s / 30s / 30s /
2ms / n/a).

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

* fix(msteams): bound remaining token acquisition

* test(msteams): keep credential fixture unchanged

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 01:21:49 +01:00
Peter Steinberger
13c0e7492a fix(test): converge Slack harness state across module reloads (#110255)
* fix(test): converge Slack harness state across module reloads

Five reaction tests in monitor.tool-result.test.ts failed whenever a sibling
file's vi.resetModules() ran earlier in the same non-isolated worker: the
cached globalThis __slackClient kept routing reactions to the OLD test-helpers
module's mocks while tests asserted on the recreated module's fresh mocks —
reactions 'never fired' (replies survived via freshly injected runtime).
slackTestState is now a globalThis-backed singleton so every module
incarnation and the cached client share one state object. Also: reaction
assertions wait on the mock (reactions apply via detached debounce/queue
work), and stale Bolt handler registrations clear per test/stop so
waitForSlackEvent cannot match a previous provider's handler. Proven with six
consecutive full extensions/slack runs (was ~50% failure).

* style(slack): bracket global test-state access for underscore lint
2026-07-18 01:17:11 +01:00
Peter Steinberger
ec8f6e5e03 feat(browser): add secure per-tab copilot panel (#109817)
* feat(browser): add copilot security contracts

* fix(gateway): expose verified client identity to handlers

* feat(browser): add secure per-tab copilot panel

Co-authored-by: Cameron Beeley <cameron.beeley@gmail.com>

* refactor(browser): separate copilot gateway hint custody

* fix(browser): preserve legacy pairing parse shape

* fix(browser): harden copilot lifecycle custody

Co-authored-by: Cameron Beeley <cameron.beeley@gmail.com>

* fix(browser): enforce copilot lifecycle boundaries

Co-authored-by: Cameron Beeley <cameron.beeley@gmail.com>

* style(browser): format copilot sources

Co-authored-by: Cameron Beeley <cameron.beeley@gmail.com>

* fix(browser): preserve copilot consent revocation

Co-authored-by: Cameron Beeley <cameron.beeley@gmail.com>

* refactor(browser): split copilot custody owners

Co-authored-by: Cameron Beeley <cameron.beeley@gmail.com>

* test(browser): normalize websocket array buffers

Co-authored-by: Cameron Beeley <cameron.beeley@gmail.com>

* chore(protocol): regenerate Swift gateway models

Co-authored-by: Cameron Beeley <cameron.beeley@gmail.com>

* refactor(browser): model copilot runtime entrypoints

Co-authored-by: Cameron Beeley <cameron.beeley@gmail.com>

* fix(browser): honor extension build boundaries

Co-authored-by: Cameron Beeley <cameron.beeley@gmail.com>

* test(gateway): assert targeted chat delivery

Co-authored-by: Cameron Beeley <cameron.beeley@gmail.com>

* test(gateway): cover targeted delivery calls

Co-authored-by: Cameron Beeley <cameron.beeley@gmail.com>

* fix(browser): declare copilot build dependencies

Co-authored-by: Cameron Beeley <cameron.beeley@gmail.com>

* fix(ci): clear browser copilot gate failures

Co-authored-by: Cameron Beeley <cameron.beeley@gmail.com>

* test(ci): cover copilot lint exclusion

Co-authored-by: Cameron Beeley <cameron.beeley@gmail.com>

* fix(browser): gate copilot on relay custody

Co-authored-by: Cameron Beeley <cameron.beeley@gmail.com>

* test(browser): bound copilot relay frames

Co-authored-by: Cameron Beeley <cameron.beeley@gmail.com>

---------

Co-authored-by: Cameron Beeley <cameron.beeley@gmail.com>
2026-07-18 01:00:23 +01:00
Peter Steinberger
601ffa2530 refactor(channels): move inbound turn execution into core (#110095)
* refactor(channels): centralize turn execution lifecycle

* refactor(extensions): adopt core channel turn plans

* test(channels): ratchet modern dispatch ownership

* chore(channels): drop stale max-lines exemption

* fix(channels): allow async delivery error cleanup

* test(channels): await async delivery cleanup

* test(channels): await delivery error callbacks

* fix(channels): preserve delivery error contract

* fix(plugin-sdk): preserve channel inbound declarations

* test(channels): exercise core delivery plans

* fix(channels): await delivery error cleanup

* fix(channels): preserve async cleanup contract

* refactor(channels): trim dispatch boilerplate

* fix(channels): mask observe-only dispatch results

* refactor(channels): delete unused dispatch exports

* fix(msteams): preserve resolver config overrides

* refactor(channels): keep Teams turn config internal

* test(plugins): drop retired Teams runtime export guard
2026-07-18 00:55:46 +01:00
mikasa
ac6fa704e8 fix(imessage): bound drop diagnostic dedupe (#103512)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 00:53:35 +01:00
Dallin Romney
14caaf3d4c fix: make live harness planning QA fail closed (#109282)
* test(qa): prove live harness planning signals

* test(qa): satisfy scenario static checks

* test(qa): scope planning evidence per attempt

* test(qa): derive planning scenarios from coverage
2026-07-17 16:45:57 -07:00
Dallin Romney
82fa956d5a fix(qa): resolve profile channels through selected driver (#109350)
* fix(qa): keep generic profiles off channel-specific lanes

* fix(qa): resolve profile channels through selected driver
2026-07-17 16:42:18 -07:00
lzw112
61a74e780a fix(perplexity): send Search API date filters with official field names (#107046)
* fix(perplexity): send Search API date filters with official field names

* test(perplexity): cover date filter request body

* test(perplexity): simplify request capture

* style(perplexity): format request test

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 00:36:08 +01:00
Vito Cappello
f4607b802f fix(llama-cpp): preserve runtime asset paths (#110233)
Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
2026-07-17 16:36:05 -07:00
mushuiyu886
b42dc72851 fix(discord): Activity OAuth no longer holds failed Discord connections (#109869)
* fix(discord): avoid Activity OAuth stalls after API rejection

* test(discord): preserve status on cancel failure

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 00:24:40 +01:00
mikasa
d03b015ff4 fix(feishu): bound sender name cache (#103513) 2026-07-18 00:11:51 +01:00
qingminlong
0f192e79d4 fix(parallel): reject invalid search counts (#105108)
* fix(parallel): reject invalid search counts

* fix(parallel): share strict count validation

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 00:11:45 +01:00
Dallin Romney
a9dc393f7e test(qa): prove Codex auth product migration (#109291) 2026-07-17 16:10:23 -07:00
chengzhichao-xydt
40acbb05c9 fix(discord): honor caller abortSignal during 429 retry backoff (#109913)
* fix(discord): honor caller abortSignal during 429 retry backoff

* test(discord): prove 429 backoff abort through a real loopback server

* test(discord): make retry abort proof deterministic

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 00:09:43 +01:00
Peter Steinberger
781913025b improve: stream native sessions as hosts finish (#110211)
* perf: stream native session catalogs by host

* fix: satisfy session catalog CI contracts

* fix: retain changed-session refresh timing

* fix: keep catalog refresh helpers private
2026-07-17 23:59:57 +01:00
Peter Steinberger
72d597c202 fix(google-meet): harden talkback bridge recovery (#110092)
* fix(meeting-bot): harden deferred runtime findings

* fix(google-meet): gate paired-node talkback bridge

* fix(google-meet): preserve tracked tab during bridge recovery

* docs(google-meet): explain external bridge exception
2026-07-17 23:50:30 +01:00
Peter Steinberger
e805dbb615 fix(signal): preserve newlines in debounced messages (#110090)
* fix(signal): use newlines in debounced messages

* docs: fix release gate command formatting
2026-07-17 23:35:05 +01:00
Peter Steinberger
d957b157e0 fix(cron): queued jobs are lost after Gateway restart (#110159)
* fix(cron): recover queued runs after gateway restart

* chore: leave release notes to release automation
2026-07-17 23:24:59 +01:00
Peter Steinberger
5bab0c2ea8 feat(slack): support running as a real Slack user (user identity) (#109837)
* feat(slack): add user-identity config surface (session token/cookie)

Introduce an account-level identity discriminator ("bot" default | "user") for
the Slack channel, plus sessionToken/sessionCookie secret fields for the
browser-session (user) path. Schema enforces structural coupling only
(identity="user" rejects appToken/signingSecret/relay/non-default mode);
credential presence is deferred to runtime like bot/app tokens. Account entries
inherit the top-level identity. Adds env fallback (SLACK_SESSION_TOKEN/COOKIE,
default account only), secret-contract registration, provenance *Source fields,
and UI hints. Config surface only; resolver/transport are later phases.

* refactor(slack): identity-aware operation-token resolver + dedup

Route Slack read/write token selection through a single identity-aware
resolveSlackOperationToken: identity="user" selects the browser-session token
for both operations (companion cookie attached later at client construction),
identity="bot" keeps the exact userToken/botToken + userTokenReadOnly behavior.
Delete the duplicated token-selection gate in action-runtime and route direct
sends/DM opens through the shared resolver with identity-neutral error wording.
Behavior-neutral for bot identity; net non-test LOC -2.

* refactor(slack): retarget user identity to xoxp + companion app

Replace the abandoned browser-session (xoxc/xoxd) approach for identity="user"
with the official path: authenticate as the human via the existing userToken
(xoxp) while a companion app (appToken/socket or signingSecret/http) carries
events. Remove sessionToken/sessionCookie config, env vars, secret-contract
entries, resolver fields, and their tests. Invert the schema coupling so
identity="user" permits the companion-app transport credentials, and drop the
now-vestigial user-identity structural guard entirely (identity is a permissive
discriminator; credential presence is a runtime concern). Resolver returns the
user token for user-identity reads and writes. Behavior-neutral for bot
identity.

* feat(slack): user-identity provider transport (xoxp + companion app)

Wire the identity="user" event transport. The companion Slack app runs Socket
Mode (appToken) or HTTP (signingSecret) while Bolt authenticates as the human
via the user token (no bot token). Startup auth.test runs on the user token and
its user_id becomes the self/mention target and self-send dedupe id (Bolt's
lazy per-event authorize populates context.botUserId=user_id, so the existing
self-event middleware drops the human's own messages). Identity-aware token
requirements and diagnostics; the bot-token identity warning is suppressed for
user identity. Behavior-neutral for identity="bot".

* feat(slack): user-identity setup, doctor, and docs

Add the setup wizard, doctor/status, and documentation for identity="user".
The wizard collects a user token plus the companion-app transport credential
(app token for socket, signing secret for http) and only persists identity when
"user" so bot setups keep byte-identical generated config; doctor validates the
user token via auth.test and warns on a missing transport credential; account
inspection reports user-token status. Message actions are gated on the active
identity's credential so user accounts expose actions. Docs add the exact
companion-app recipe (user scopes, on-behalf-of-user message events, socket/http
examples, the DM/group-DM-only-via-user-scope note, and self-send dedupe).
Behavior-neutral for identity="bot".

* test(slack): isolate user-identity provider tests to fix parallel flake

The new user-identity provider tests shared the globalThis-stored Slack test
client/handlers across files under parallel isolate:false, so their reaction
closures could reference a prior file's state and intermittently fail sibling
monitor tests (monitor.tool-result reactions). Track started monitors and
abort/await them all in afterEach (even on failed assertions), reset the shared
auth.test/mock state, and dispose the global Slack test runtime per file via a
new disposeSlackTestRuntime helper. Full Slack suite green across repeated
parallel runs.

* fix(slack): regenerate channel config metadata after rebase

* fix(slack): resolve setup consistent-return and doctor dead-export lint

* style: format install script test

* docs(slack): regenerate docs map for user-identity section

* test(slack): use renamed createSlackBoltApp token param in interop test

The rebase folded main's new wrapReceiver test into the renamed
createSlackBoltApp signature (botToken -> token); update the call site.
2026-07-17 23:23:21 +01:00
Peter Steinberger
4f0171b188 fix(slack): stabilize tool-result reaction tests (#110105)
* test(slack): await tool-result reaction dispatch

* test(slack): rebind retained reaction mocks
2026-07-17 23:21:29 +01:00
Peter Steinberger
ecd285222c fix: harden recovered meeting browser sessions (#110089)
* fix(meeting-bot): harden browser session recovery

* chore: leave meeting notes to release generation

* docs: fix release-gate example lint
2026-07-17 23:20:51 +01:00
Peter Steinberger
84ff010eba fix(openai): allow fake-IP OAuth token exchange (#110096)
Keep the OpenAI OAuth token endpoint usable behind fake-IP proxy DNS while retaining exact-host SSRF protection for redirects and unrelated hosts.

Co-authored-by: Abner Shang <75654486+abnershang@users.noreply.github.com>
2026-07-17 23:14:15 +01:00
Peter Steinberger
af24487b5f refactor(signal): remove global ingress test hook (#110094)
* test(signal): remove global ingress test hook

* fix(signal): remove obsolete ingress test helpers
2026-07-17 23:10:54 +01:00
Peter Steinberger
241143262a fix(ci): script-only changes cold-start every Node job (#110158)
* fix(ci): keep sticky deps warm across script edits

* fix(ci): register dependency fingerprint entrypoint

* fix(ci): distinguish missing fingerprint inputs

* fix(ci): invalidate delegated workspace scripts

* fix(ci): harden cold install recovery

* fix(docs): escape release gate placeholder

* fix(ci): reject unaudited dependency hooks
2026-07-17 23:05:16 +01:00
Peter Steinberger
ed34646bc5 refactor(codex): inline projector no-op cases (#110116) 2026-07-17 23:01:28 +01:00
Peter Steinberger
0546e15c2e fix(reef): omit absent receipt categories from audit state (#110177) 2026-07-17 22:24:33 +01:00
Peter Steinberger
da44d52ac6 feat: ask_user — structured questions from the agent with web card, channel buttons, and text answers (#109922)
* feat(gateway): add transient question runtime (question.* methods + broadcasts)

* feat(agents): add blocking ask_user question tool with chat prompt delivery and text-reply claim

* feat(ui): interactive in-thread question cards for ask_user

* feat(channels): native tap-to-answer buttons for ask_user on Telegram, Discord, and Slack

* feat(ui): unify codex and gateway question cards with interactive gateway answering

* refactor(agents): collapse ask_user pending state to one registry; docs for ask_user

* fix(agents): include ask_user in normal gateway runs; add question-flow control-ui e2e

* test(ui): avoid credential-shaped fixture in question card test

* refactor(ui): reorder stream-group context keys

* fix(gateway,ui): validate question answers at resolve; reject secret/duplicate-label questions; UI retry and reconnect hardening

* fix(gateway,agents): canonicalize accepted option answers; bound ask_user option labels to 64 chars

* chore(ci): prune unused question exports, allowlist mobile question events, fix discord lint

* chore(ci): regenerate protocol/i18n/docs/tool-display artifacts for question surface

* fix(protocol): flatten QuestionRecord for native codegen; drop TS-only alias from schema registry

* chore(android): regenerate ask-user localization resources

* docs: regenerate docs map after rebase

* fix(ci): avoid stale read-only dependency disks

* test: remove stale reef lint suppression ratchet

* fix(ci): keep source locale drift advisory in release gates

* fix(ci): scope locale advisory handling to parity check
2026-07-17 22:24:17 +01:00
Peter Steinberger
5783c3a80e fix(qa): make startup failure return explicit 2026-07-17 22:06:42 +01:00
Peter Steinberger
e7801deb57 fix(release): fail fast on flaky beta QA 2026-07-17 21:55:27 +01:00
Peter Steinberger
7d3b5f56af fix(release): harden beta validation feedback 2026-07-17 21:55:27 +01:00
Peter Steinberger
111596e56e fix(qa): preserve gateway teardown evidence 2026-07-17 21:55:27 +01:00
Alex Knight
ddb4ed9a47 feat: trace Claude Code CLI model calls (#108304)
* feat: trace Claude CLI model calls

* fix: align Claude CLI trace hierarchy

* fix: distinguish model request and turn telemetry

* fix: satisfy diagnostics CI checks

* fix: distinguish agent-turn telemetry

---------

Authored-by: Alex Knight <15041791+amknight@users.noreply.github.com>
2026-07-18 06:23:49 +10:00
Peter Steinberger
433b3ce86d fix(line): await deferred ingress release on stop (#110104)
* fix(channels): await abandoned ingress claims

* fix(channels): preserve abandonment boundaries
2026-07-17 20:56:17 +01:00
Josh Lehman
48863e1b83 fix: prevent doctor hangs on large Memory Core migrations (#109355)
* fix(memory): avoid quadratic FTS migration scans (#108442)

* test(memory): narrow SQLite query-plan detail type
2026-07-17 12:40:00 -07:00
Peter Steinberger
9f8550e8b7 fix(reef): restore inbox recovery after gateway restart (#110100)
* fix(reef): persist inbox recovery progress

* chore(reef): leave changelog to release flow

* fix(reef): keep inbox recovery internals private

* fix(reef): reset healthy reconnect backoff

* chore(reef): remove stale lint suppression
2026-07-17 20:32:17 +01:00
Dallin Romney
71a02e16af test(qa): prove gateway package self-upgrade (#109399) 2026-07-17 12:26:35 -07:00
qingminlong
1d999b817f fix(anthropic): reject invalid Claude session cursors (#104967)
* fix(anthropic): reject invalid Claude session cursors

* fix(anthropic): validate Claude session cursors exactly

* fix(anthropic): route cursor test through catalog provider

* fix(anthropic): validate Claude session cursors exactly

Co-authored-by: qingminlong <qing.minlong@xydigit.com>

* fix(anthropic): keep cursor limit private

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 20:19:29 +01:00
Peter Steinberger
67a5ffab77 perf(session-catalog): bound slow node fan-out (#110106) 2026-07-17 19:24:27 +01:00