Commit Graph

16504 Commits

Author SHA1 Message Date
Peter Steinberger
4ef4323db9 fix: keep memory SecretRef failures agent-scoped (#109977)
* test: normalize Copilot token fixture

* test: normalize Copilot auth fixtures

* test: use explicit Copilot placeholders

* test: use neutral Copilot fixture host

* refactor: clarify Copilot embedding auth values

* refactor: keep Copilot profile result intact

* test: normalize embedding credential fixtures

* fix: isolate memory SecretRef owners

* refactor: isolate memory secret collection
2026-07-17 14:44:03 +01:00
Peter Steinberger
7835c03930 test(release): align plugin validation expectations (#110012) 2026-07-17 14:36:12 +01:00
Peter Steinberger
b48c801623 test(release): repair extension runtime fixtures 2026-07-17 14:24:13 +01:00
Peter Steinberger
2c43e86787 refactor(discord): adopt shared realtime voice session harness (#110000) 2026-07-17 14:17:37 +01:00
Peter Steinberger
8020dd3e08 fix(reef): discover trusted peers as conversations (#109905)
* fix(reef): discover trusted peer conversations

* test(reef): document temporary state cleanup

* test(gateway): include conversation discovery in method order

* chore: leave changelog to release automation

* fix(gateway): preserve configured conversation discovery

* fix(gateway): validate turns before session binding

* fix(gateway): preserve directory conversation identity
2026-07-17 13:55:30 +01:00
WhatsSkiLL
4d3b18811e feat(android): add Wear real-time Talk controls (#109483)
* feat(android): add Wear real-time Talk controls

* fix(android): satisfy Wear Talk CI checks

* fix(talk): remove unused client language parameter

* fix(android): harden Wear realtime Talk routing

Co-authored-by: IWhatsskill <284122573+IWhatsskill@users.noreply.github.com>

* chore(android): refresh Wear Talk metadata

* chore(android): align native i18n baseline

---------

Co-authored-by: IWhatsskill <284122573+IWhatsskill@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 13:46:05 +01:00
Peter Steinberger
662e79d574 test(release): harden extension prerelease contracts 2026-07-17 13:43:12 +01:00
Peter Steinberger
f341a013af test(release): repair plugin prerelease coverage 2026-07-17 13:43:12 +01:00
Peter Steinberger
ee762ad761 feat(teams-meetings): join Microsoft Teams meetings via the meeting-bot core (#109964)
* feat(teams-meetings): join Microsoft Teams meetings via the meeting-bot core

* fix(teams-meetings): satisfy lint and package-boundary contracts
2026-07-17 13:23:39 +01:00
max
907f5552f5 feat(feishu): handle opt-in VC meeting invites (#92340)
* feat(feishu): handle VC meeting invites

* fix(feishu): route VC invites through DM ingress

* fix(feishu): keep VC invite chat id canonical

* fix(feishu): handle VC invite pairing

* fix(feishu): simplify VC invite dispatch

* fix(feishu): guard VC invite pairing

* refactor(feishu): canonicalize VC invite ingress

Co-authored-by: renaocheng <renaocheng@bytedance.com>

* refactor(feishu): keep synthetic routing internal

Co-authored-by: renaocheng <renaocheng@bytedance.com>

* refactor(feishu): hide VC invite internals

Co-authored-by: renaocheng <renaocheng@bytedance.com>

* fix(feishu): gate VC invitation auto-join

* chore(config): refresh Feishu config baseline

* test(feishu): use synthetic VC fixture credential

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 12:36:42 +01:00
Peter Steinberger
9b5eb04221 improve(tests): tighten async polling across suites (#109919)
* test: tighten signal delivery polling

* test: tighten async polling across suites

* test: use virtual time for signal ingress drain
2026-07-17 12:20:58 +01:00
Kyle Klouzal
e316e1c440 feat(discord): show subagent progress (#95604)
* feat(discord): show subagent progress

Co-authored-by: Kyle Klouzal <kklouzal@users.noreply.github.com>

* fix(discord): serialize progress cleanup ownership

Co-authored-by: Kyle Klouzal <kklouzal@users.noreply.github.com>

* test(discord): type progress state fixtures

* refactor(discord): split subagent progress state

* fix(discord): persist terminal progress outcomes

* fix(discord): narrow persisted cleanup rows

* refactor(discord): keep progress internals private

* perf(discord): preserve lazy progress loading

* chore(plugin-sdk): refresh API baseline after rebase

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Kyle Klouzal <kklouzal@users.noreply.github.com>
2026-07-17 12:02:33 +01:00
Peter Steinberger
d96c279c39 refactor(whatsapp): scope temp cleanup to each test (#109925)
* test(whatsapp): use shared temp-dir cleanup

* test(whatsapp): keep temp cleanup plugin-local
2026-07-17 11:47:27 +01:00
Peter Steinberger
5c21b70144 fix(google-meet): preserve attendance CSV row boundaries (#109926)
* fix(google-meet): harden attendance CSV export

* chore: defer google meet release note
2026-07-17 11:47:00 +01:00
Peter Steinberger
819c92d175 fix(line): prevent silent webhook loss after acknowledgment (#109819)
* fix(line): adopt durable ingress drain with ack gated on spool write

LINE acked webhooks 200 before processing events detached, so a crash or
dispatch failure silently lost inbound messages. Events now enqueue their raw
JSON into the channel ingress queue before the webhook responds; dispatch,
retry, dead-letter, and completion tombstones run through the core drain.
The in-memory replay guard is deleted; tombstone retention (30d/4096)
strictly covers its old 10min/4096 window, and message-id keys preserve the
guard keyspace so redeliveries under changed webhookEventIds still dedupe.

Autoreview: secret scanner false-positive on HMAC test fixtures
(test-channel-secret); full manual review of all five files + test matrix
performed instead. Part of the #109657 fleet adoption program (wave 1).

* style(line): oxfmt pass on drain adoption files

* fix(line): cap repeated ingress drain deliveries

* fix(line): preserve ingress lifecycle bounds

* style(line): satisfy ingress lint gates
2026-07-17 11:45:18 +01:00
Max Huang
3e838782b1 feat(feishu): bot-to-bot conversation support with @mention handling (#89783)
* feat(feishu): support bot-authored mentions

Co-authored-by: heyumeng154-alt <260365965+heyumeng154-alt@users.noreply.github.com>

* test(feishu): isolate bot name resolver state

* fix(feishu): verify bot mention identity

* docs: refresh Feishu channel map

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: heyumeng154-alt <260365965+heyumeng154-alt@users.noreply.github.com>
2026-07-17 11:44:00 +01:00
Peter Steinberger
c45f299cea fix(slack): adopt durable ingress across Bolt and relay (#109910)
* fix(slack): adopt durable ingress drain across Bolt and relay with logical twin guard

Slack events now enqueue their raw envelope durably before the transport ack
on all three modes: the Bolt receiver wrap covers Socket Mode and HTTP
(event_id = Events API event_id), and relay frames enqueue before the router
ack (keyed by logical team:channel:ts since router delivery-id redelivery
stability is undocumented). Dispatch, retry, dead-letter, and 30d/20k
tombstones run through the core drain; claimed relay events retry until the
relay source reattaches after a restart. The in-memory + persistent inbound
delivery caches and the app-mention race machinery are deleted.

One dedupe layer deliberately survives: Slack emits both a message and an
app_mention event (distinct event_ids) for a single mention post, so a new
claim-based dispatch guard keyed on logical (team, channel, ts) collapses the
twins — commit at turn adoption, release on gated/abandoned dispatch so the
surviving twin can re-run the same gate. 24h/20k retention mirrors the
retired persistent cache.

Slack monitor test state now scopes a fresh OPENCLAW_STATE_DIR per test;
persisted guard keys otherwise dedupe unrelated fixture messages that reuse
ts values. Five reaction tests in monitor.tool-result.test.ts are flaky on
clean origin/main under full-suite load (verified 2-of-3 baseline runs);
tracked separately.

Autoreview: secret scanner false-positives on token-shaped test fixtures
(three files); full manual review performed instead, which caught and fixed
the twin-guard regression. Part of the #109657 fleet adoption program.

* fix(slack): remove unused ingress exports

* chore(slack): prune max-lines baseline

* docs(plugin-sdk): refresh API baseline hash

* test(slack): type dispatch mock argument

* test(slack): use managed temp root
2026-07-17 11:38:54 +01:00
Peter Steinberger
7817a6cf24 fix(ollama): failed inspections must not advertise tools capability (#109921) 2026-07-17 11:38:21 +01:00
clawsweeper[bot]
2dee283ad0 Open fix(infra): import legacy plugin state partially (newest-first) instead of skipping when capacity is short (#109679) 2026-07-17 16:08:04 +05:30
ooiuuii
9769642e7f fix: reject unsafe Mattermost API path segments (#98390)
* Harden Mattermost API paths

* fix(mattermost): guard direct media file paths

* refactor(mattermost): streamline API path validation

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 11:36:51 +01:00
Peter Steinberger
dd54c180f8 fix(signal): recover inbound messages after crashes (#109907)
* fix(signal): adopt durable ingress drain with deferred claims through debounce

Signal's receive loop was purely in-memory: a crash between signal-cli
receive and dispatch silently lost the message with no re-emit. Dispatchable
receive envelopes (data/edit/reaction; never sync/receipt/typing) now journal
their raw JSON at one chokepoint (event_id = [sender uuid/number, timestamp],
lane per group/sender) before the SSE loop continues — the awaited enqueue is
the only receive boundary signal-cli offers. Dispatch, retry, dead-letter,
and 30d/1000 tombstones run through the core drain with startup + interval
pumps.

Debounce merging stays on under the drain: claims defer (held, watchdog
armed) instead of completing at enqueue, a merged flush fans adoption out to
every constituent claim, terminal no-dispatch turns settle by completing
(skipped -> completed), and exhausted flush retries abandon claims back to
queue retry policy. Regression tests cover deferred return, merged fan-out
adoption, and no-adoption settlement.

No prior replay guard existed; this adoption adds durable cross-restart
dedupe. Autoreview blocked by codex sandbox network in the build stage; full
manual review performed (caught the debounce bypass and the unsettled gated
claims). Part of the #109657 fleet adoption program (wave 1).

* fix(signal): keep ingress test helpers private

* fix(signal): align ingress lifecycle result types
2026-07-17 11:34:43 +01:00
Peter Steinberger
3d7346f96b test(google-meet): keep CLI test on plugin boundary (#109915) 2026-07-17 11:26:49 +01:00
Peter Steinberger
2920ec1fab docs(channels): settle replay-guard vs ingress-drain layering contract (#109799)
* docs(channels): settle replay-guard vs ingress-drain layering contract in code comments and SDK docs

* docs: refresh SDK channel docs map
2026-07-17 11:13:00 +01:00
Peter Steinberger
d9b86cb76c fix(ollama): one broken local model no longer bricks interactive setup (#109895)
* fix(ollama): fail open on per-model inspection during setup

* test(ollama): narrow setup mock body parsing
2026-07-17 11:12:55 +01:00
Peter Steinberger
bf413374cc fix(whatsapp): add live group directory (#109886)
* fix(whatsapp): serve live group directory safely

Co-authored-by: xialonglee <li.xialong@xydigit.com>

* fix(whatsapp): complete owner lock retry policy

* test(whatsapp): match socket end signature

* fix(whatsapp): preserve live lookup cleanup errors

* refactor(whatsapp): keep owner error code internal

---------

Co-authored-by: xialonglee <li.xialong@xydigit.com>
2026-07-17 11:12:07 +01:00
Peter Steinberger
ee2b4e5acc fix(sms): prevent silent loss of acknowledged Twilio messages (#109866)
* fix(sms): adopt durable ingress drain with ack gated on MessageSid enqueue

Twilio inbound webhooks acked 200 then dispatched detached behind a 10-minute
in-memory replay guard; Twilio does not reliably retry inbound messages, so a
crash between ack and dispatch silently lost the SMS. The raw Twilio form now
enqueues durably (event_id = MessageSid, lane per sender) before the TwiML
200; dispatch, retry, dead-letter, and tombstones run through the core drain
with a startup + interval pump for restart recovery. Payload/account
validation moved to parse-at-dispatch and dead-letters as non-retryable. The
replay guard and its saturation 429 path are deleted; 24h/20k tombstones
strictly cover the old 10min/10k window.

Autoreview P1 (ambiguous non-adopted settlement) rejected with evidence:
bindIngressLifecycleToReplyOptions threads onAdopted/onDeferred/onAbandoned
into reply admission, so deferral and abandonment settle via core lifecycle
callbacks; normal non-adopted return = terminal local handling, matching the
Telegram reference mapping (skipped -> completed). Part of #109657 wave 1.

* fix(sms): keep ingress payload type internal

* fix(sms): preserve Twilio message SID aliases

* fix(sms): preserve ingress ordering and timestamps

* test(sms): satisfy type and lint gates
2026-07-17 11:11:13 +01:00
Pavan Kumar Gondhi
93e9e2fe93 fix(google-meet): neutralize attendance CSV formulas [AI] (#109725)
* fix: neutralize meet attendance csv cells

* fix: cover fullwidth csv formula prefixes

* test: use temp dir tracker for meet csv export
2026-07-17 15:38:12 +05:30
Peter Steinberger
1a2d9e5e5c refactor(meeting-bot): extract browser meeting-bot core behind MeetingPlatformAdapter (#109755)
* refactor(meeting-bot): extract browser meeting-bot core behind MeetingPlatformAdapter

* chore(google-meet): prune max-lines baseline entries shrunk by extraction

* fix(meeting-bot): drop orphaned extension realtime files and refresh lint/test types after extraction

* chore(google-meet): prune deleted realtime max-lines baseline

* chore(meeting-bot): remove release-owned changelog entry

* fix(meeting-bot): harden session leave, cleanup retry, and engine teardown paths
2026-07-17 10:35:56 +01:00
xingzhou
72f4cbd8f2 fix(line): prevent profile cache growth across users (#109750)
* fix(line): prevent profile cache growth across users

* docs: explain LINE profile cache eviction order

Co-authored-by: zhang-guiping <zhang.guiping@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 10:23:51 +01:00
Peter Steinberger
d023e8b412 perf(test): poll ClickClack gateway faster (#109803) 2026-07-17 10:22:09 +01:00
Wynne668
708d2020d8 fix(reef): prevent blank guard keys from denying every message (#109667)
* fix(reef): reject blank guard credentials

* fix(reef): type fetch mock in guard credential test

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

* refactor: normalize Reef guard credentials canonically

Co-authored-by: ZengWen-DT <ceng.wen@xydigit.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 10:19:21 +01:00
Peter Steinberger
0471b293bb style: format google-meet index test
68c4cb31d2 (#109674) landed unformatted, failing check-lint repo-wide.
2026-07-17 02:14:31 -07:00
Wynne668
68c4cb31d2 fix(google-meet): report blank Twilio setup credentials as missing (#109674)
* fix(google-meet): reject blank Twilio setup credentials

* fix: centralize Google Meet voice setup values

Co-authored-by: ZengWen-DT <ceng.wen@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 01:54:43 -07:00
Peter Steinberger
9cdb9762a3 style: format tab-discovery-poll-abort test
8243afc062 (#109617) landed unformatted, failing check-lint repo-wide.
2026-07-17 01:50:53 -07:00
wangmiao0668000666
50ee3e572d fix(voice-call): honor abortSignal during Twilio audio chunk pacing (#109618)
* fix(voice-call): honor abortSignal during Twilio audio chunk pacing

* fix(voice-call): prove abortable Twilio pacing

Exit chunk pacing immediately on cancellation, preserve unexpected delay failures, and make the regression target the first real audio chunk with deterministic timers.

Co-authored-by: wangmiao0668000666 <wang.miao86@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 01:44:43 -07:00
wangmiao0668000666
1fe6b6b0f4 fix(browser): honor abortSignal during Playwright click-and-hold delay (#109710)
* fix(browser): honor abortSignal during Playwright click-and-hold delay

The click-and-hold delay in clickViaPlaywright slept with a bare
setTimeout(resolve, delayMs) where delayMs can reach ACT_MAX_CLICK_DELAY_MS
(5s). The interaction AbortSignal was checked before and after the sleep
but the sleep itself was not abortable, so an abort mid-hold left the
action chain orphaned: the ref'd timer kept the event loop busy for the
full remaining delay and postponed the navigation-guard teardown (grace
recheck and, with an SSRF policy, the page.route interception) until the
orphaned sleep ended.

Swap the bare timer for sleepWithAbort(delayMs, signal) from
openclaw/plugin-sdk/runtime-env so the abort clears the timer and unwinds
the chain immediately. The caller-visible rejection is unchanged: the
abort listener registered before the action still wins the race with the
original signal.reason.

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

* refactor(browser): reuse click abort helper

Keep the contributor abort-aware hold delay while deleting duplicate promise and listener lifecycle code in favor of the existing interaction helper.

Co-authored-by: wangmiao0668000666 <wang.miao86@xydigit.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 01:42:47 -07:00
wangmiao0668000666
8243afc062 fix(browser): honor AbortSignal in tab discovery poll (#109617)
* fix(browser): honor AbortSignal in tab discovery poll

* fix(browser): unify abort-aware tab discovery

Apply the canonical abortable sleep to both discovery loops, reject late backend results after cancellation, and replace timing-sensitive proof with deterministic timer coverage.

Co-authored-by: wangmiao0668000666 <wang.miao86@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 01:39:05 -07:00
Monkey-wusky
9b238a7927 fix(msteams): cancel non-OK consent upload response body before throwing (#109701)
* fix(msteams): cancel non-OK consent upload response body before throwing

* fix(msteams): release all consent upload responses

Cancel unread response bodies after successful uploads as well as failed uploads, and fold the lifecycle assertions into the existing status-path tests.

Co-authored-by: Monkey-wusky <66244686+Monkey-wusky@users.noreply.github.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 01:18:40 -07:00
Wynne668
1573c78f5b fix(lmstudio): cancel model discovery response body on non-ok (#109718)
* fix(lmstudio): cancel model discovery response body on non-ok

Wire the direct-fetch release hook to cancel unread bodies so failed
model discovery releases the TCP connection instead of leaving it open.

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

* refactor(lmstudio): unify response cleanup

Co-authored-by: Zeng Wen <27948732+ZengWen-DT@users.noreply.github.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Zeng Wen <27948732+ZengWen-DT@users.noreply.github.com>
2026-07-17 01:12:23 -07:00
Peter Steinberger
4ecd85e0b7 fix: keep healthy channel accounts running when one credential fails (#109766)
* fix(secrets): isolate channel account credentials

* fix(secrets): normalize Feishu default ownership

* fix(feishu): preserve accountless secret ownership

* fix(matrix): keep accountless top-level refs active
2026-07-17 01:12:18 -07:00
wangmiao0668000666
538263bafd fix(chutes): cancel userinfo error response body before returning null (#109677) 2026-07-17 01:11:11 -07:00
Peter Steinberger
e693d279b3 fix: Bedrock ARN region routing, Copilot device-flow pacing, TUI input fixes (#109740)
* build(deps): bump terminal UI library to 0.80.9

* fix(plugins): Bedrock ARN region routing, stop-reason detail, and Copilot device-flow pacing
2026-07-17 01:09:29 -07:00
Peter Steinberger
2bf07bdea5 perf(test): advance Matrix draft timers (#109790) 2026-07-17 01:06:27 -07:00
Peter Steinberger
6ac15970a7 feat(onboarding): unified empty-state with provider icons, websites, and recommended installs (#109681)
* feat(onboarding): unify setup recommendations

* fix(control-ui): proxy model setup icons

* fix(onboarding): refresh landing artifacts

* chore(ui): sync translated i18n catalogs

* chore(ui): keep generated locale artifacts on the refresh workflow
2026-07-17 01:01:06 -07:00
Peter Steinberger
543244e7bb perf(ci): remove the anthropic-cli jiti stall and stripe the full-plan whales (#109769)
* perf(sdk): load Claude CLI identity from a narrow plugin artifact

src/plugin-sdk/anthropic-cli.ts snapshots CLAUDE_CLI_BACKEND_ID at module
scope through the sync facade loader, which jiti-evaluates the full
anthropic api.js barrel on source checkouts: 130.86s of self time per
cold worker on CI (Testbox import profile), silently stalling every job
whose graph reaches cli-runner/prepare.ts. A narrow cli-api.js artifact
carries the two static facts; Testbox proof: the reliability+helpers
agents-core pair drops from 157.6s to 14.3s.

* perf(ci): stripe unit-fast and tooling node tests on the full plan

core-fast ran the import-bound unit-fast graph as one job (247s vitest,
181s module evaluation) and core-tooling as one serial job (241s); both
now stripe on the full plan like the compact plan, so the compact-only
expansion is deleted and the docker helper config rides with the
isolated shard on both plans. Group hints refreshed from main run
29551077288; stale per-file commands hints dropped (the consolidation
landed); cache-writer selection and the warm workflow track the stripe
names.

* fix(state): tolerate vanished sqlite sidecars in agent-db permission sweep

existsSync+chmodSync raced SQLite's own WAL/SHM cleanup: a checkpoint or
close between the two calls throws ENOENT (observed from the transcript
reconcile worker in server-startup-web-fetch-bind on CI). chmod directly
and swallow only ENOENT, which removes the TOCTOU window.
2026-07-17 00:58:32 -07:00
Peter Steinberger
0e792b6de3 refactor(channels): centralize inbound orchestration and remove internal compat (#109716)
* refactor(channels): centralize inbound turn orchestration

* refactor(runtime): remove stale compatibility paths

* chore(guards): reject internal deprecated API use

* refactor(channels): simplify core turn planning

* chore(guards): keep deprecated checks boundary-focused

* refactor(memory): keep modern config off compat barrel

* fix(msteams): preserve feedback learning

* test(channels): align modern inbound fixtures

* refactor(channels): finish modern inbound migration

* refactor(channels): tighten core inbound kernel

* fix(channels): preserve turn assembly narrowing

* test(sdk): keep runtime mock binding immutable

* test(matrix): isolate read policy runtime

* test(msteams): mock canonical reply factory

* test(slack): mock core inbound turn dispatch

* test(telegram): inject core session recorder

* test(signal): inject core session recorder

* test(googlechat): assert canonical inbound routing

* test(synology-chat): align core turn fixture

* fix(sdk): preserve direct DM runtime compat

* refactor(channels): own inbound envelope compat in core

* refactor(channels): trim inbound dispatch seams

* refactor(channels): remove redundant async wrappers

* test(synology-chat): type canonical dispatcher mock

* refactor(channels): remove remaining dead compat seams

* chore(sdk): refresh API baseline after rebase

* fix(channels): preserve direct DM identity metadata
2026-07-17 00:56:46 -07:00
Peter Steinberger
765bb37364 feat(setup): stream provider prepare progress to every surface (#109764)
* feat: stream provider preparation progress

* fix(android): refresh gateway method constants
2026-07-17 00:55:04 -07:00
Peter Steinberger
f1cb2a8f20 perf(test): poll Chrome MCP state faster (#109776) 2026-07-17 00:42:52 -07:00
Peter Steinberger
2b18ef7426 feat(codex): surface native questions and goals (#109724)
* feat(codex): bridge native questions and goals

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

* fix(ui): preserve native question text encoding

* fix(codex): keep secret answers off action paths

* fix(codex): validate native action keys exactly

* fix(codex): isolate new goals and free-form answers

* style(codex): satisfy extension lint

* fix(codex): keep goal replacement non-destructive

* fix(codex): separate native goals from continuation

* fix(codex): preserve exact native answer labels

* test(codex): assert goal continuation stays disabled

* fix(codex): remove unused bridge exports

* test(codex): refresh goal feature snapshots

---------

Co-authored-by: EVA <eva@100yen.org>
2026-07-17 00:35:39 -07:00
Peter Steinberger
264a95c664 perf(test): poll xAI realtime state faster (#109762) 2026-07-17 00:28:13 -07:00