Commit Graph

69572 Commits

Author SHA1 Message Date
xingzhou
afd0fe32c2 fix(qa-lab): preserve boundary emoji in gateway startup diagnostics (#104840)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 18:26:26 -07:00
Peter Steinberger
523c07d20e docs(agents): add correct-but-pragmatic code guidance
Two Code-section bullets: correctness on real inputs is mandatory but
over-engineering for imagined ones is a defect; extremely unlikely edge
cases are tradable for real simplification when the tradeoff is named.
2026-07-17 02:24:41 +01:00
qingminlong
d6a561e92b fix(gateway): clarify malformed call params errors (#105217)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 18:24:08 -07:00
EVA
368941ae7a feat(workspaces): add secure preview widget (#101354)
* feat(workspaces): add secure preview widget

* fix(workspaces): type preview reload assertion

* fix(workspaces): harden preview widget

* fix(workspaces): honor preview URL binding ownership

* chore(workspaces): remove unused widget exports

---------

Co-authored-by: Eva <eva@100yen.org>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 18:21:54 -07:00
Leon-SK668
8fef264f70 fix(release): preserve emoji in ClawHub error details (#108172)
* fix(release): keep ClawHub errors valid Unicode

* fix(release): keep ClawHub helper source-resolvable

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 18:20:34 -07:00
Peter Steinberger
0a19e1ed58 refactor(channels): centralize mention and group activation decisions (#109480)
* refactor(channels): adopt shared mention-gate decision; consolidate group activation

* fix(matrix): carry effective mention decision

* test(session): pin qqbot accessor migration
2026-07-16 18:15:58 -07:00
Wynne668
54f1800d2a fix(matrix): bound recovery key stdin input (#108120)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 18:14:33 -07:00
Peter Steinberger
784ede0af1 feat(system-agent): local-model viability — context cap, thinking off, route-aware timeout (#109445)
* feat: improve system agent local model viability

* fix: forward Ollama effective context cap

* fix(system-agent): keep flat 120s agent-turn budget

* fix(system-agent): keep manifests timeout helper module-local
2026-07-16 18:11:22 -07:00
Peter Steinberger
92146f9f80 refactor(talk): share audio-energy stats and speech-threshold gate across voice surfaces (#109466) 2026-07-16 18:10:26 -07:00
Peter Steinberger
0f1b0e6679 test: defer migration fixture cleanup (#109475) 2026-07-16 18:01:18 -07:00
Leon-SK668
3da3318c56 fix(audit): preserve emoji in npm registry errors (#108208)
* fix(audit): keep registry errors valid Unicode

* style(audit): format registry error boundary test

* docs(audit): document direct Node import floor

Co-authored-by: Leon-SK668 <0668001470@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 17:53:09 -07:00
Peter Steinberger
c6ebd6be34 feat(watch): inbox mascot with Always-On-safe rendering (#109365)
The watch inbox's empty and waiting surface gets a 72pt Clawd: sleepy
(nightcap and all) when nothing is waiting, thinking while the watch
waits for iPhone sync, attentive when an approval needs a decision.
The Always-On display renders a static pose so the animation loop
never runs dimmed, and the active loop is throttled to 15fps for
battery. The shared mascot gains a defaulted minimum frame interval;
mascot sources compile directly into the watch target following the
TalkWaveformView pattern.
2026-07-16 17:47:07 -07:00
Leon-SK668
56d0721eb7 fix(release): preserve emoji in cross-OS response diagnostics (#108193)
* fix(release): keep cross-OS responses valid Unicode

* style(release): format cross-OS boundary test

* fix(release): resolve UTF-16 helper in direct Node runs

* fix(release): keep cross-OS summaries UTF-16 safe

Co-authored-by: Leon-SK668 <0668001470@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 17:43:56 -07:00
Peter Steinberger
dde6af2199 fix(docs): defer localized orphan deletion 2026-07-16 20:43:06 -04:00
Peter Steinberger
edd052989b refactor(google-meet): merge host and node realtime engines behind one audio transport (#109413)
* refactor(google-meet): merge host and node realtime engines behind one audio transport

* refactor(google-meet): internalize engine helpers left test-only after realtime-node removal
2026-07-16 17:39:53 -07:00
Peter Steinberger
0136bb4dca test: shorten cron process-group timeout probe (#109457) 2026-07-16 17:37:55 -07:00
smthfoxy
eb4f3d792f fix(agents): wake top-level requester when its last parallel child settles (#99396)
* fix(agents): wake top-level requester when its last parallel child settles [AI]

A top-level session (normal chat/dashboard, not itself a subagent) that
spawns parallel subagents and waits via sessions_yield never receives the
"all descendants settled -> synthesize" wake: wakeSubagentRunAfterDescendants
only targets orchestrators with a subagent-registry run record. The parent
only sees passive per-child announces, commonly mis-tracks the outstanding
set on the final completion turn (or never hears results whose announce gave
up), and then parks until a human sends a message.

Fix: when a child reaches a terminal settle (announce delivered, give-up, or
delivery suspended) and its requester has no more descendants awaiting
settle, deliver a one-shot "all spawned subagents settled - synthesize and
deliver now" wake to the parked top-level requester through the existing
announce delivery pipeline (active requesters get it steered into the live
turn; parked ones get a new origin-routed turn).

- hasDescendantRunAwaitingSettle: early-exit drain check where a suspended final
  delivery counts as settled (suspension is terminal for automatic retries).
- maybeWakeRequesterAfterAllChildrenSettled (subagent-announce.ts): scopes
  the batch to the settling child's parallel wave (the connected component of overlapping run
  lifetimes), skips nested/cron requesters (owned by the descendant-settle
  wake), skips single delivered completions and fire-and-forget children,
  and dedupes concurrent last-sibling settles via a batch-stable
  announce idempotency key (requester-settle:<requester>:<sorted runIds>).
- Trigger fires from completeCleanupBookkeeping (all cleanup-terminal paths)
  and suspendPendingFinalDelivery, and is skipped by the suspended-delivery
  discard sweep, so the wake is outcome-independent: a child whose announce
  gave up with NO_REPLY still counts toward - and can trigger - the drain.

Companion to the nested-orchestrator wake; covers the top-level case it
left open.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rukuut98qvDwzSwMp3u4kN

* fix(agents): retry the requester settle wake on transient turn failures [AI]

The settle wake is the only event that ever fires after a fan-out drains, so
a wake turn lost to a transient infra failure re-parked the requester
permanently. Observed live: the wake turn survived dispatch, reconciled all
investigators, and then died to a provider stream stall (LLM idle timeout)
mid-synthesis — with nothing left to retry it.

Bounded recovery: up to 3 attempts with 30s/120s backoff. Each retry uses a
fresh `:retry-N` idempotency suffix because the gateway dedupe caches
terminal run outcomes per key, so re-dispatching the same key would no-op. A
legitimately silent wake reply already classifies as delivered and never
retries; terminal failures and an abandoned requester stop immediately.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rukuut98qvDwzSwMp3u4kN

* fix(agents): ledger retired delete-cleanup rows for the requester settle wake [AI]

cleanup="delete" retires a child's registry row in the same funnel pass
that schedules the settle wake, so a pure delete-mode fan-out could never
rebuild its drained wave from live rows: empty batch, no wake, requester
parked — the exact incident class this wake exists to close.

Retiring cleanup paths (delete branch, reconciled-killed tombstone) now
pass settledRowRetired, and the wake ledgers the in-hand record before
its first await: concurrent last-sibling settles all see the same
ledgered rows by the time any batch computation runs, keeping batch
membership and the idempotency key stable — the guarantee keep-mode gets
from rows persisting in the registry. Ledgered rows merge into the batch
candidates (a live registry row wins by runId); entries clear on
delivered/terminal wakes and the nested/requester-gone exits, with a 24h
TTL prune as the memory backstop. In-memory only: a restart degrades a
mid-wave delete fan-out to waking with the surviving rows.

* fix(agents): snapshot delete-mode child results before cleanup clears them [AI]

The delivered-finalize path clears completion.resultText (delete mode) and
the frozen delivery payload before cleanup bookkeeping runs, so the
requester-settle wake ledgered a row whose findings had already been
emptied: a cleanup="delete" fan-out woke its requester with "(no output)"
for successfully delivered children.

Capture an immutable snapshot of the entry (completion + delivery payload)
at the top of finalizeSubagentCleanup and in the resumed-announce give-up
path — before any clearing — and pass it through completeCleanupBookkeeping
to the settle wake for the retired-row branches. Keep-mode is unchanged:
its registry rows keep their result text and win over ledgered copies.

Regression: a lifecycle-driven test drives the real delivered delete-mode
cleanup (completeSubagentRun -> announce -> finalize -> funnel) and asserts
the wake's settledEntry still carries the child's result text after the
live entry was cleared and the row retired.

* fix(agents): release drained no-wake batches from the settle ledger [AI]

The zero-required and single-delivered guard exits decline to wake a wave
that has already fully drained. Ledgered delete-mode rows in such a batch
can never join a later wake (a child spawned after the drain cannot
lifetime-overlap rows that already ended, and any still-running overlap
would have failed the drain gate before these exits), so holding their
child-result snapshots for the 24h TTL was pure retention: high-volume
delete-mode fan-outs could pin large result texts in process memory.

Release the batch at both exits. No behavior change: waves with pending
overlapping children return earlier at the drain gate, which still keeps
their rows.

* test(agents): route e2e session fixture through the sqlite accessor [AI]

Upstream flipped session reads to the sqlite-backed session accessor
(#98236), which bypasses the loadSessionStore mock this e2e used for its
in-memory session fixture — requester entry lookups came back empty and
the settle wake exited at the usable-session guard. Serve loadSessionEntry
from the same fixture; everything else in the accessor stays real.

* refactor(agents): move the requester settle wake into its own module [AI]

Two pieces of fallout from rebasing across upstream tooling changes:

- The max-lines lint budget (#107315) has no grandfathered suppression for
  subagent-announce.ts, and the settle wake + retired-row ledger pushed it
  past the cap. The wake is a coherent unit, so it moves to
  subagent-announce.requester-settle-wake.ts (matching its test file) with
  its own registry-runtime seam; the registry's lazy dep and the lifecycle
  type alias point at the new module. announce.ts drops back well under
  the budget with no suppression needed.

- The announce read-path refactor rewired the runtime barrels onto
  subagent-registry-announce-read.js, orphaning the
  hasDescendantRunAwaitingSettle re-export on subagent-registry.ts, which
  the deadcode-exports gate now flags. Removed; the retry-grace e2e reads
  the announce-read implementation directly.

* fix(agents): admit the requester settle wake as tracked gateway root work [AI]

The settle wake was launched as a detached promise from cleanup
bookkeeping, so registry cleanup or shutdown could reach quiescence
before the wake admitted its gateway turn and the last-child completion
could still be lost during restart or teardown. Route the wake through
runWithGatewayIndependentRootWorkContinuation: a live cleanup parent
reserves the root synchronously, and restart drain now waits for the
in-flight wake. Adds a deterministic quiescence-race regression.

* fix(agents): persist requester settle recovery

Store requester-settle wake obligations on subagent run rows, replay them after restart, and retire cleanup rows only after a durable outcome. Persist admitted attempts and retry deadlines, coalesce live restores, drain disconnected waves, and let the sweeper recover stranded processors.

Co-authored-by: smthfoxy <263563487+smthfoxy@users.noreply.github.com>

* test(agents): allow durable settle persistence

Keep the bulk-cancellation regression focused on recovery after the injected persistence failure instead of assuming an exact write count; requester-settle bookkeeping now adds a legitimate durable write.

Co-authored-by: smthfoxy <263563487+smthfoxy@users.noreply.github.com>

* style(agents): declare settle wake scheduler

Use a hoisted function declaration for the lifecycle scheduler so lint accepts the intentional callback cycle without a mutable binding.

Co-authored-by: smthfoxy <263563487+smthfoxy@users.noreply.github.com>

* fix(agents): harden requester settle recovery

Co-authored-by: smthfoxy <263563487+smthfoxy@users.noreply.github.com>

* fix(agents): release settle wake during retry backoff

Co-authored-by: smthfoxy <263563487+smthfoxy@users.noreply.github.com>

* test(agents): type settle wake fixtures

Co-authored-by: smthfoxy <263563487+smthfoxy@users.noreply.github.com>

* style(agents): bind settle wake transition callbacks

Co-authored-by: smthfoxy <263563487+smthfoxy@users.noreply.github.com>

* test(agents): restore past-due settle wake

Co-authored-by: smthfoxy <263563487+smthfoxy@users.noreply.github.com>

---------

Co-authored-by: smthfoxy <263563487+smthfoxy@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 17:37:18 -07:00
Leon-SK668
bdf3886024 fix(scripts): preserve emoji in GitHub API errors (#108184)
* fix(scripts): keep GitHub errors valid Unicode

* style(scripts): format GitHub error boundary test

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 17:33:35 -07:00
NianJiu
7ba436ac70 fix(cron): enforce max concurrent runs across triggers (#103323)
* fix(cron): enforce max concurrent runs across triggers

* fix(cron): cleanup failed run reservations

* fix(cron): retain queued disabled force runs

* refactor(cron): tighten shared run admission

* fix(cron): stop activation after shutdown

* fix(cron): preserve queued reservation ownership

* fix(cron): harden queued run cleanup

* fix(cron): drain admitted timer runs on failure

* fix(cron): make run reservations durable

* refactor(cron): keep admission state internal

---------

Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 17:31:57 -07:00
Lu Wang
2972db5649 fix: preserve Claude resumed synthetic turns (#90799)
Preserve Claude CLI replies that continue after a resumed-session synthetic placeholder while retaining bounded fallback for terminal no-output cases.

Fixes #99131.
Related #90789.
Prepared head SHA: 08cd27aaeb
Co-authored-by: Lu Wang <7668944+wangwllu@users.noreply.github.com>
Co-authored-by: Shakker <165377636+shakkernerd@users.noreply.github.com>
Reviewed-by: @shakkernerd
2026-07-17 01:30:59 +01:00
Peter Steinberger
d71c1fe596 feat(onboarding): prefer strongest local model in guided detection (#109250)
* feat(onboarding): rank detected local models

* docs(sdk): comment local-model rank bucket layout

* feat(sdk): rank gemma4 first for local setup-assistant models
2026-07-16 17:30:49 -07:00
Peter Steinberger
167a8ef20a fix(onboarding): harden fresh local startup and activation (#108764)
* fix(macos): preserve gateway during fresh setup

* fix(macos): validate reusable gateway service

* chore(macos): sync native i18n inventory

* fix(macos): preserve latest gateway service request

* test(macos): isolate gateway port concurrency coverage

* fix(macos): recover gateways after failed readiness

* fix(macos): repair wedged gateway listeners

* fix(macos): bound gateway startup probes

* chore(macos): sync native i18n inventory

* fix(onboarding): activate verified inference immediately

* fix(macos): isolate readiness failure generations

* chore(macos): refresh native i18n inventory

* fix(macos): serialize gateway service lifecycle

* fix(macos): sequence gateway startup persistence

* fix(macos): close gateway readiness races

* fix(macos): publish recovered gateway state

* fix(macos): make gateway readiness generation-safe

* chore(macos): refresh native i18n inventory

* fix(macos): preserve gateway endpoint identity

* fix(macos): refresh gateway ownership after attach

* fix(macos): distinguish transient gateway readiness

* refactor(macos): split gateway readiness lifecycle

* chore(macos): refresh native i18n inventory

* chore(release): keep changelog release-owned
2026-07-16 17:24:53 -07:00
sunlit-deng
a8dc0683cc fix(xai): ignore blank audio env api key (#108953)
* fix(xai): ignore blank audio env api key

* test(xai): focus blank env regression

Co-authored-by: sunlit-deng <yang.jiajun1@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 17:24:35 -07:00
Peter Steinberger
b78cf56349 improve(ci): persist warm Vitest and Node caches (#109425)
* perf(ci): harden persistent test caches

* ci: document trusted cache cleanup trigger

* ci: harden composite cache inputs

* perf(ci): isolate Node build bytecode cache
2026-07-16 17:22:28 -07:00
Peter Steinberger
85d375c1b2 chore: add live tool-surface benchmark (#109374)
* test(agents): add tool-surface live benchmark

* chore(agents): narrow live benchmark exports

* fix(agents): pin live bench models
2026-07-16 17:20:47 -07:00
Peter Steinberger
08b071ee50 test: avoid duplicate updater timeout probe (#109438) 2026-07-16 17:20:33 -07:00
ooiuuii
396194b96b fix(install): reject PATH runtimes with broken npm (#107825)
* fix(install): reject runtimes with broken npm

* test(installer): use real Node for npm selection

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 17:17:07 -07:00
iloveleon19
382d570cbf feat(channels): add unified implicit mention policy (#108829)
* feat(mattermost): add thread.requireExplicitMention to opt out of thread auto-follow

Mattermost treats any reply in a thread the bot has participated in as an
implicit mention, so requireMention only gates the first message and the bot
then answers follow-ups addressed to other people for the participation TTL.
Slack exposes channels.slack.thread.requireExplicitMention for exactly this;
Mattermost had no equivalent and its strict schema rejected the key.

Add channels.mattermost.thread.requireExplicitMention (channel + per-account),
mirroring Slack. When set, thread participation no longer counts as a mention.
Default (unset/false) keeps today's auto-follow behavior unchanged.

Related: #108269

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

* feat(channels): add implicit mention policy foundation

* feat(channels): unify implicit mention policy

Co-authored-by: leon <dodoma0919@gmail.com>

* refactor(channels): keep implicit policy inside evaluator

* fix(channels): use exported implicit mention type

* chore(channels): satisfy extension lint

* fix(config): break implicit mention type cycle

* fix(plugin-sdk): account for implicit mention config export

* refactor(config): isolate implicit mention schema

* chore(plugin-sdk): align implicit mention surface budget

* fix(config): remove unused schema re-export

---------

Co-authored-by: leon <dodoma0919@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 17:16:01 -07:00
Peter Steinberger
dbf3597f9b fix(cli): restore lint after restart health growth (#109359)
* fix(cli): split restart-health over max-lines

* fix(cli): drop dead export from restart-health test helpers
2026-07-16 17:13:58 -07:00
qingminlong
f3e8164e7c fix(ci): keep boundary output tails UTF-8 safe (#109167)
* fix(ci): keep boundary output tails UTF-8 safe

* fix(ci): preserve split UTF-8 output tails

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

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 17:12:50 -07:00
pacoa
14dc557cee fix: use effective daemon port flag (#109294)
* fix: use effective daemon port flag

* fix(daemon): unify effective port parsing

Co-authored-by: pacoa <29181120+pacoa-kdbg@users.noreply.github.com>

* fix(daemon): skip consumed port values

Co-authored-by: pacoa <29181120+pacoa-kdbg@users.noreply.github.com>

* style(daemon): format effective port handling

Co-authored-by: pacoa <29181120+pacoa-kdbg@users.noreply.github.com>

---------

Co-authored-by: Paco Avelar <[email protected]>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 17:11:09 -07:00
Peter Steinberger
9cda66123b fix(ci): address reviewer findings across the perf-lever batch (#109254)
* fix(ci): address reviewer findings across the perf-lever batch

Seven follow-ups from Codex review feedback on the landed CI perf PRs:
docker packaging switches to the full build profile (the ciArtifacts
step env clobbered its canonical-dts requirement); the boundary sticky
restore gates on generative source tree OIDs in both lanes, making
restored artifacts valid by construction (kills the clock-skew mtime
false-skip and ghost declarations from deleted sources); the node-test
worker budget derives from nproc instead of the runner label (labels
over-promise under load) and keeps the 2-worker cap when plans can
overlap; the deadcode task falls back to serial Knip below 8 cores;
the lint-lane i18n verify also runs for any ui-touching diff (keys are
extracted from all ui sources, not just ui/src/i18n); the oxlint
concurrency diagnostic moves to stderr; and workspace packages join
the prompt-snapshot always-run surface.

* fix(ci): fingerprint every generative source the boundary artifacts consume

Autoreview flagged inputs outside the tree-OID gate; toolchain, config,
and script inputs were already covered by the sticky key hash, but the
old actions/cache key also fingerprinted src/plugins/types.ts and
src/video-generation sources the OID list missed. Add those plus
src/channels (the plugin-sdk declaration graph reaches its public
types) to the fingerprint in all three sites.

* fix(ci): fold runner toolchain identity into the boundary sticky fingerprint

Autoreview: the sticky key hashes config/scripts/package.json/lockfile,
but a node/pnpm toolchain bump (pinned in the workflow, not the key)
could leave the key unchanged and bless artifacts built with the prior
toolchain. Record node/pnpm versions alongside the source tree OIDs in
all three fingerprint sites so a toolchain-only change forces a cold
build.
2026-07-16 17:09:56 -07:00
xingzhou
2b4b688581 fix(github-copilot): release failed catalog responses (#109071) 2026-07-16 17:07:24 -07:00
Peter Steinberger
83d82c9302 refactor(channels): persist runtime state in plugin SQLite (#109380)
* refactor(channels): move reef, msteams, matrix, zalouser file state to SQLite with doctor imports

* fix(channels): harden SQLite state migrations

* test(reef): use SQLite flow stores in receipt suites

* fix(reef): validate restored request policy

* fix(reef): retain replay state through relay window

* docs(reef): describe durable state import

* fix(reef): honor configured legacy state path

* chore: leave changelog to release flow

* fix(reef): use managed temp root in flow tests

* fix(matrix): omit undefined device id from state
2026-07-16 17:05:28 -07:00
Peter Steinberger
333409908d docs: define SecretRef failure isolation policy (#109430) 2026-07-16 17:05:20 -07:00
Wynne668
ccb251c570 fix(process): report actual elapsed time for early lane timeouts (#109287)
* fix(process): clarify command lane timeout cause

* fix(process): complete timeout cause formatting

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 17:03:43 -07:00
Shakker
2f23642719 fix: allow local HTTP ClickClack setup codes (#109429) 2026-07-17 01:00:18 +01:00
Peter Steinberger
9899121b61 test: reduce redundant state database race stress (#109426) 2026-07-16 16:56:25 -07:00
mushuiyu886
3ba08dbf77 fix(qa): bound process snapshot probes (#109207) 2026-07-16 16:54:54 -07:00
mushuiyu886
91df2d1812 fix(cli): bound container runtime probes (#109199)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-16 16:54:23 -07:00
Peter Steinberger
2a52e45e2b fix(ci): avoid flaky commit pulls lookup 2026-07-17 00:52:44 +01:00
EVA
4a7abe1556 Workspaces: add trusted chart widgets (#101792)
* feat(workspaces): add trusted chart widgets

* fix(workspaces): keep chart helpers private

* test(workspaces): prove chart widgets in control UI

* fix(workspaces): validate empty chart bounds

* fix(workspaces): expand subnormal chart ranges

* fix(workspaces): normalize chart ranges

* fix(workspaces): keep zero bars at baseline

* fix(ui): sync chart widget locales

* fix(ui): translate chart widget locales

---------

Co-authored-by: Eva <eva@100yen.org>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 16:50:49 -07:00
ooiuuii
b1eaf53672 fix(feishu): avoid local media fallback leaks (#98251)
* Fix Feishu local media fallback leaks

* refactor(feishu): clarify media fallback link style

* fix(feishu): reject credentialed media fallbacks

* fix(feishu): reject ambiguous media fallback URLs

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 16:48:31 -07:00
Peter Steinberger
05980207c6 test: deflake test-group-report SIGTERM descendant-cleanup test (#109347)
The child published its pid with a non-atomic writeFileSync while the test
polled file existence only, so a loaded runner could read an empty pid file
(NaN -> isProcessAlive false). Publish the pid via rename and widen the
spawn-chain poll deadlines; assertion strength is unchanged.
2026-07-16 16:47:30 -07:00
Peter Steinberger
349f78776d fix(models): refresh bundled provider catalogs (#109410)
* fix(models): refresh bundled provider catalogs

* docs(models): refresh generated docs map

* fix(xiaomi): keep provider helper private

* chore(release): defer catalog release note
2026-07-16 16:47:25 -07:00
Peter Steinberger
334c182c27 refactor(diffs): move ephemeral artifacts to SQLite (#109328)
* refactor(diffs): move ephemeral artifacts to SQLite

* fix(plugin-state): satisfy SDK validation gates

* test(diffs): satisfy lint contracts

* fix(plugin-state): count expired blobs toward quotas

* fix(plugin-state): harden blob storage boundaries

* fix(plugins): replace stale install provenance
2026-07-16 16:47:19 -07:00
Peter Steinberger
7a58956768 fix(docs): drop duplicate pruneOrphanLocaleDocs declaration
The generated hand-edited d.mts declared pruneOrphanLocaleDocs twice
with resolveClawHubRepoPath between them, tripping the
adjacent-overload-signatures lint on every PR. Keep the documented
declaration.
2026-07-16 16:36:49 -07:00
Peter Steinberger
d6a33b539f fix(ci): retry Telegram provenance API reads 2026-07-17 00:29:04 +01:00
Peter Steinberger
a419270cc5 chore: refresh generated baselines 2026-07-16 16:25:33 -07:00
Peter Steinberger
d6026ff1fa fix(clickclack): clear deadcode and lint breaks in setup flow
Recent setup commits left the hard-zero gates red on every PR:
parseClickClackSetupCodeInput was exported but only used internally,
ClickClackSetupCodeClaimError was exported yet consumed only by its
test (production catches it structurally through a status field), a
string spread tripped no-misused-spread, and a computed "token" key
tripped no-useless-computed-key. Un-export both symbols, switch the
test to a structural claim-error stand-in matching what the formatter
reads, and apply the two mechanical lint fixes.
2026-07-16 16:23:24 -07:00