Commit Graph

69777 Commits

Author SHA1 Message Date
Peter Steinberger
d023e8b412 perf(test): poll ClickClack gateway faster (#109803) 2026-07-17 10:22:09 +01:00
LZY3538
45f36640dc fix(docker): bound smoke installer curl with connect timeout (#109698)
* fix(docker): bound smoke installer curl with connect timeout

Add --connect-timeout 30 and --max-time 300 to the direct installer
one-liner curl in the smoke test runner. The run_installer_for_package_spec
function is already bounded by timeout(1), but this direct invocation had
no curl-level or wrapper-level timeout.

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

* fix(docker): wrap complete installer pipeline in timeout, not just curl

Replace the stand-alone curl timeout flags on the direct installer one-liner
with a timeout(1) wrapper around the entire curl|bash pipeline, matching the
run_installer_for_package_spec pattern. This bounds the complete pipeline
(download + install) rather than just the network transfer.

The curl-level --connect-timeout 30 and --max-time 300 are retained as
defence-in-depth inside the timeout wrapper.

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

* refactor: centralize installer smoke pipeline bounds

Co-authored-by: LZY3538 <liu.zhenye@xydigit.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 10:20:40 +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
wangmiao0668000666
bd7b0ad85f fix(plugins): remove abort listener when channel runtime context is disposed (#109708) 2026-07-17 10:11:21 +01:00
Peter Steinberger
62db322715 chore(channels): mark the legacy plan-step wire branch for removal (#109773)
@openclaw/codex is force-updated with core, so string plan steps can only
reach the normalizer from a plugin pinned against an update. Record that
as a TODO instead of a standing version-skew contract.
2026-07-17 10:11:10 +01:00
krissding
4612b1692c fix: guard terminateStaleProcessesSync against non-ESRCH kill errors (#109702)
* fix: guard terminateStaleProcessesSync against non-ESRCH kill errors

The two catch blocks silently swallowed all errors, not just ESRCH.
Non-ESRCH errors (e.g. EPERM) indicate the process is still alive but
cannot be signaled — continuing as if it were killed risks leaving a
stale process on the port.

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

* fix: continue stale PID cleanup after signal errors

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

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 10:06:37 +01:00
Peter Steinberger
8ff4f0161f refactor(push-web): split legacy JSON parsing out of the doctor migration
7af9358841 (#109609) pushed state-migrations.web-push.ts past the
max-lines limit (709), failing check-lint repo-wide. Extract the pure
parsing layer (legacy subscriptions/VAPID JSON -> validated shapes) into
state-migrations.web-push-parse.ts; the migration module keeps
detection/claiming/DB import. No behavior change; 23/23 module tests
green.
2026-07-17 02:03:50 -07:00
krissding
af469c85cf fix(cli): guard secrets plan JSON.parse against malformed input (#109721)
* fix(cli): guard secrets plan JSON.parse against malformed input

readPlanFile reads a user-specified file and parses it with JSON.parse
without a try-catch. A malformed or corrupted plan file produces a raw
SyntaxError that is not user-actionable.

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

* test: tighten malformed secrets plan proof

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

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 10:00:35 +01:00
qingminlong
ce4a16b0d3 fix(e2e): keep text file tails UTF-8 safe (#109669)
* fix(e2e): keep text file tails UTF-8 safe

* fix: preserve malformed UTF-8 tail bytes

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

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 01:57:57 -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
Wynne668
07a36f6eda fix(config): preserve Unicode in validation received values (#109664)
* fix(config): preserve Unicode in validation received values

* test: tighten config diagnostic truncation proof

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

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 01:53:19 -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
mushuiyu886
7af9358841 fix(push-web): ignore blank VAPID environment overrides (#109609)
* fix(push-web): ignore blank VAPID environment values

* fix: normalize migrated web push VAPID inputs

Co-authored-by: mushuiyu886 <yang.haoyu@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 01:48:55 -07:00
Peter Steinberger
ced50f88e9 fix(ci): allow detached release children after parent success 2026-07-17 09:48:38 +01:00
Peter Steinberger
9ddd988c91 fix(scripts): add missing error-format declaration for test typechecks (#109818) 2026-07-17 01:47:24 -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
Peter Steinberger
f656d96fc3 fix(ci): add missing declaration for error-format.mjs
8858944a81 imports formatErrorMessage from scripts/openclaw-npm-postpublish-verify.ts,
but the .mjs had no sibling .d.mts like every other scripts/lib module imported
from .ts, so check-test-types fails repo-wide with TS7016.
2026-07-17 01:40:42 -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
Peter Steinberger
92e5a10f1a fix(doctor): diagnose ignored web fetch proxy settings (#109778)
* fix(doctor): diagnose direct web fetch proxy routing

* test(doctor): cover proxy diagnostic through public API

* test(doctor): validate emitted proxy diagnostic type
2026-07-17 01:24:32 -07:00
Peter Steinberger
a9ac13b2ef fix(ci): resolve trusted release loader 2026-07-17 09:21:20 +01: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
Peter Steinberger
edcf3131ad test(gateway): stop background plugin reloads from wiping test task runtimes (#109801)
Root cause of the flaky 120s timeout in "logs a swallowed finalize error
without blocking the background run" (CI run 29559328261, shard
agentic-gateway-methods): the preceding ACP plugin-subagent test registers a
subagent run whose completion keeps running in the background after the test
ends. That leaked chain (completeSubagentRunAttempt ->
emitSubagentEndedHookForRun -> ensureSubagentRegistryPluginRuntimeLoaded ->
ensureRuntimePluginsLoaded -> loadOpenClawPlugins) starts by calling
clearActivatedPluginRuntimeState(), which clears the process-wide detached
task lifecycle runtime registration. When it lands between the next test's
setDetachedTaskLifecycleRuntime(spy) install and that test's background
finalize, finalizeTaskRunByRunId re-reads the registration at call time,
falls back to the default executor, and finalizes the run successfully - so
the finalize spy is never called while the run itself completes with an ok
frame.

The prior event-driven rework (#109653, 883995f08d) could not fix this: it
only waits longer for a spy call that never comes. The older 2s
waitForAssertion flake ("expected 1 call, got 0") was the same mechanism.

Fix at the harness boundary: gateway agent handler tests now pin the
subagent-registry deps with a no-op ensureRuntimePluginsLoaded (matching
subagent-registry's own suites), applied at harness setup, in the shared
afterEach, and through the one wholesale deps override, so no leaked
ended-run hook can reload the plugin runtime and clear a later test's
runtime seam mid-test.

Proof:
- Deterministic repro (temporary env-gated interleaving patch in
  subagent-registry.ts, not committed): hold the ACP plugin-child run's
  ended-hook load until the next finalize-only runtime registration appears,
  then reload synchronously. Pre-fix this reproduces the exact CI failure
  (target times out at 120000ms; registration observed ABSENT right after
  the reload). Post-fix, with the identical forced interleaving, all 238
  tests pass and the registration stays present.
- Stress post-fix: 10x agent.test.ts and 5x src/gateway/server-methods with
  OPENCLAW_VITEST_MAX_WORKERS=6 - 0 failures (3765 tests per shard run).
- The same wipe-then-re-register window exists in prod plugin activation
  (loadOpenClawPlugins cache-miss path); flagged separately for an
  owner-reviewed atomic-swap follow-up rather than bundled here.
2026-07-17 01:16:34 -07:00
Peter Steinberger
8858944a81 fix(ci): isolate trusted release tooling dependencies 2026-07-17 09:12:58 +01: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
a69af59741 perf(ci): persist Node 22 build cache artifacts (#109780) 2026-07-17 01:04:57 -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
1859cdb231 feat(mac): Quick Chat — global-shortcut floating composer for the main session (#109720)
* feat(mac): add Quick Chat floating composer with global shortcut

- Spotlight-style non-activating key panel on Option+Space (KeyboardShortcuts
  3.0.1 exact-pinned, recorder row in Settings -> General) plus a menu bar item
- shows the main-session agent identity via agent.identity.get with a
  'main session' chip; Return sends via chat.send reusing the idempotency key
  on ambiguous retries; Cmd+Return also opens full chat; Shift+Return newline
- targeted permission strip (notifications/accessibility/screen recording)
  with a scoped 1s status poll while visible; grant flow keeps the bar alive
  and avoids PermissionMonitor's AppleScript probe
- extract shared ChatSendStatus acceptance mapping; TalkModeRuntime adopts it
- rename anchored-panel 'quick chat' wording to 'compact chat panel'; docs

* chore(mac): regenerate docs map and native i18n inventory for Quick Chat

* ci: retrigger checks after stalled push event

* chore(mac): refresh native locale artifacts for Quick Chat strings

* chore(android): regenerate locale strings for refreshed shared translations
2026-07-17 01:00:45 -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
73d04395de fix(ci): detach optional ClawHub publishing 2026-07-17 08:45:17 +01:00
Trevor Malone
b8d43ea49a fix(config): strip obsolete memorySearch keys before schema validation (#68664) (#68685)
* fix(config): strip obsolete memorySearch keys from defaults and list (#68664)

* fix(config): preserve canonical memory migration precedence

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 00:43:14 -07:00
Peter Steinberger
f1cb2a8f20 perf(test): poll Chrome MCP state faster (#109776) 2026-07-17 00:42:52 -07:00
Peter Steinberger
f095549d1d perf(agents): cut CLI runner reliability import cost (#109772) 2026-07-17 00:41:00 -07:00
Peter Steinberger
f69cb2f75e perf(ci): serve node_modules snapshots from O(1) protected sticky disks (#109752)
* perf(ci): serve node_modules snapshots from O(1) protected sticky disks

Every Blacksmith mount of the dependency sticky disk currently 429s:
the v2 key minted one backing disk per PR and per manifest hash, which
saturated Blacksmith's installation-wide 1000-sticky-disk budget (run
29559333389, job checks-node-compact-small-15: "Sticky disk limit
exceeded"). Same-repo shards then fall back to a cold, storeless pnpm
install (~40s) on every run - worse than the ~22s actions/cache path
the sticky rollout replaced.

Re-key the snapshot to one stable disk per node-version and move the
install inputs into a runtime fingerprint marker:

- Key is now `<repo>-node-deps-bind-v3-<node-version>`; dependency
  changes refresh the disk in place instead of allocating a new one.
- The fingerprint (manifest hashFiles set + node version + lockfile
  mode) is evaluated on the bind step, before the mount lands, so the
  '**/package.json' glob cannot sweep snapshot-internal manifests.
- Consumers mount read-only (commit: false); on fingerprint match they
  restore importer archives and skip pnpm install entirely, on mismatch
  they install against the clone's on-disk store (warm store, no
  actions/cache download) without capturing.
- Writers are trusted non-PR jobs only: build-artifacts on canonical
  pushes plus the scheduled vitest-cache-warm run as a deadline writer
  (main pushes cancel each other under merge traffic and would starve
  the snapshot). commit: on-change keeps warm no-op runs from
  committing.
- Roll the consumer flag out to every Linux Blacksmith lane that
  installs dependencies (build-artifacts, check-shard,
  check-additional-shard, check-docs, checks-ui, control-ui-i18n,
  native-i18n, qa-smoke-ci-profile, checks-fast-core, both contract
  shards) with the same fork/dispatch gates as the nondist shard.

Guards now enumerate the consumer set, pin the O(1) key shape, enforce
single-writer commit expressions, and cover the fingerprint marker in
the importer capture/restore helper.

Verified locally: importer archive capture 0.96s/228K and restore
0.07s against the real 2.0GB hoisted tree; a snapshot untarred into a
fresh workspace resolves modules, runs bin shims, `pnpm exec`, and a
Vitest suite (one-time pnpm reconcile only when the absolute path
changes, which Blacksmith's fixed /home/runner/_work layout avoids).

* fix(ci): commit dependency snapshots explicitly, not via on-change heuristic

stickydisk's on-change mode compares allocated disk bytes with a 4KB
threshold, so a fingerprint refresh whose reinstall keeps usage stable
(metadata-only manifest edits, same-sized dependency swaps) could be
silently discarded, stranding every consumer on a stale marker and a
permanent reinstall path. Writers now commit explicitly, mirroring the
Vitest transform disk's rationale; warm no-op writer runs re-commit an
identical snapshot, which is cheap and safe. Also document that the
non-PR commit gate binds cooperating code only - the enforced trust
boundary stays the fork/dispatch runner gate, matching the protected
node-compile disk's posture.

* test(ci): guard sticky consumers against writerless node-version key splits

Reviewer follow-up: the snapshot key is partitioned by node-version and
both writers (build-artifacts, vitest-cache-warm) rely on the action
default, so a consumer pinning any other version would split onto a
key nobody seeds and silently regress to permanently cold installs.
Pin the action default to 24.x and assert every sticky consumer
resolves to that same key segment.

* test: narrow sticky-consumer step.with before indexing

The filter's runtime narrowing did not carry into the map callback, so
step.with indexing failed check-test-types (TS18048). Collect a narrowed
stepWith instead.
2026-07-17 00:38:50 -07:00
Peter Steinberger
d26951ae9a fix(secrets): degrade stale auth profile refs on startup (#77213)
* fix(secrets): isolate unavailable auth profile refs

Co-authored-by: Val Alexander <68980965+BunsDev@users.noreply.github.com>

* fix(secrets): retain current auth profile metadata

Co-authored-by: Val Alexander <68980965+BunsDev@users.noreply.github.com>

* style(auth): use explicit materialized fields

Co-authored-by: Val Alexander <68980965+BunsDev@users.noreply.github.com>

* fix(secrets): scrub skipped auth profile material

Co-authored-by: Val Alexander <68980965+BunsDev@users.noreply.github.com>

* test(auth): separate setup fallback from secret refs

Co-authored-by: Val Alexander <68980965+BunsDev@users.noreply.github.com>

* fix(secrets): reuse prepared auth alias metadata

Co-authored-by: Val Alexander <68980965+BunsDev@users.noreply.github.com>

---------

Co-authored-by: Val Alexander <68980965+BunsDev@users.noreply.github.com>
2026-07-17 00:38:35 -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
Peter Steinberger
78e11ca2c0 perf(ci): keep prompt snapshot generation off the jiti loader (5.1min lane -> ~1.5min) (#109757)
Measured breakdown of check-prompt-snapshots in run 29557851276 (5m03s):
- 37s checkout + Node env setup
- 4m25s inside one `pnpm prompt:snapshots:check` process:
  - ~35s tsx import of the generator graph
  - ~3min first createOpenClawCodingTools call: the message-tool schema
    build resolves the scenario channel plugin, the empty loaded registry
    falls back to the bundled-channel jiti loader
    (extensions/telegram/index.ts), and jiti re-transpiles the core source
    graph (136.6s jiti self time in --cpu-prof; second generation call in
    the same process takes 0.3s)
  - ~1min more for the cold provider-plugin lookup in
    normalizeAgentRuntimeTools; no provider plugin owns tool-schema hooks
    for the `codex` harness provider, so the jiti load only rediscovers a
    no-op
  - <2s actual rendering + oxfmt + drift compare

Split axis decision: the planned 2-3 way scenario shard matrix cannot
lower the pole because the cost is a one-time per-process transpile;
every shard would pay the full ~4min again (jiti fsCache does not help:
a warm-cache rerun still took 200s). Fix the generator instead:

- Preload each scenario's channel plugin surface (channel-plugin-api.js,
  resolved via the bundled-plugin public-surface resolver) through the
  ambient tsx/vitest ESM graph, and pin exactly that channel in a scoped
  loaded registry while the scenario's tools are built. Snapshot bytes
  are unchanged: the loaded plugin object is the same export the bundled
  jiti fallback materializes, and cross-channel action discovery still
  sees no other loaded channels.
- Pass allowProviderRuntimePluginLoad=false to normalizeAgentRuntimeTools;
  registry-only resolution returns the same undefined plugin instantly.

Coverage guard: test/scripts/prompt-snapshots.test.ts now generates the
snapshot files and asserts zero jiti plugin-loader calls (with the
offending transform targets in the failure message), so a future scenario
or channel that misses the preload fails the suite instead of silently
restoring the 4-minute lane.

Proof: `pnpm prompt:snapshots:check` passes byte-identical against the
committed fixtures in 54s wall / 35s CPU locally (was 354s wall / 306s
CPU); focused vitest suites (32 tests incl. new guard), tsgo core-test +
extensions-test lanes, scoped oxlint/oxfmt, and `git diff --check` are
green. Expected CI pole when the lane fires: ~5.1min -> ~1.5-2min.
2026-07-17 00:27:23 -07:00
ooiuuii
6651813bd0 fix(logging): redact auth-style HTTP headers (#107999)
* fix(logging): redact auth-style HTTP headers

* fix(logging): redact structured auth headers

* test(logging): keep auth fixtures synthetic

* test(logging): preserve existing gateway fixtures

* fix(logging): cover serialized auth credentials

* fix(logging): harden auth header redaction

* fix(logging): cover serialized auth whitespace

* chore(logging): refresh reviewed PR head

* test(logging): expect complete API key redaction

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 00:25:15 -07:00
wangmiao0668000666
e01027dd28 fix(telegram): honor abortSignal in startup probe retry loop (#109604)
* fix(telegram): honor abortSignal in startup probe retry loop

* test(telegram): isolate probe retry abort proof

* fix(telegram): abort active startup probe requests

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 00:19:30 -07:00
tanshanshan
473dfc2e51 fix(compaction): add circuit breaker to stop token burn when summarizer unavailable (#86900)
* fix(compaction): stop repeated staged fallbacks

Co-authored-by: tanshanshan <tan.shanshan@xydigit.com>

* fix(compaction): preserve degraded summary state

* refactor(compaction): keep result state internal

* fix(compaction): cancel incomplete circuit-open runs

* chore: refresh PR checks

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 00:18:33 -07:00
Yiğit ERDOĞAN
e228a3ca3a fix: gateway.cmd launcher garbles non-ASCII profile paths on non-CJK Windows locales (#108967)
* fix(daemon): encode Windows cmd launcher to the console OEM code page

* fix(infra): unexport resolveWindowsSystemEncoding

The launcher encoder now resolves the boot-time OEM code page via
resolveWindowsOemEncoding, leaving resolveWindowsSystemEncoding with no
external importers; the dead-export ratchet (knip all-exports) fails CI
on exported-but-module-local functions.

* test(windows): cover OEM launcher encoding resolver

* fix(windows): declare launcher OEM code page

* fix(windows): fail closed on unsupported OEM pages

* fix(windows): reject CP1258 precomposition drift

* fix(windows): guard CP864 launcher syntax

* test(windows): pin OEM launcher code page

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 00:16:59 -07:00
Peter Steinberger
5c86a224c0 perf(test): poll Telegram webhook state faster (#109749) 2026-07-17 00:14:16 -07:00