Commit Graph

82596 Commits

Author SHA1 Message Date
Dallin Romney 3c88353388 test(ui): split CJK markdown coverage 2026-08-25 19:43:50 -07:00
Dallin Romney b970336e62 fix(ui): preserve standalone safe line breaks 2026-08-25 19:22:13 -07:00
Dallin Romney 09057b8a0f fix(ui): activate CJK-friendly markdown parsing 2026-08-25 19:14:47 -07:00
Dallin Romney 5281b320ec fix(ui): render CJK emphasis and safe line breaks 2026-08-25 19:14:19 -07:00
Peter Steinberger c841a9958a fix(android): preserve notification forwarding consent (#129715) 2026-08-25 18:59:03 -07:00
Voidra 3be24fe714 fix(plugins): report missing manifest instead of misleading id mismatch on install (#128527)
* fix(plugins): report missing manifest instead of misleading id mismatch on install

Added comments to clarify error handling for missing or invalid plugin manifests.

* fix/comfy-manifest-mismatch-error

* fix(plugins): require manifests for trusted npm installs

Co-authored-by: Voidra <151359367+NirvanJain@users.noreply.github.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-25 18:53:27 -07:00
RoboClaw e5e90fb629 fix(gateway): make restart recovery state authoritative (#129316)
* fix(gateway): make restart recovery state authoritative

Fixes #129285 and #129300.

Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>

* fix(gateway): preserve restart recovery terminal fence

Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>

* fix(gateway): cancel rootless work during restart

Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>

* fix(gateway): keep restart abort lifecycle-scoped

Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>

---------

Co-authored-by: roboclaw-bot <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
2026-08-25 18:48:19 -07:00
Peter Steinberger 5af41d881e fix(android): preserve omitted image-only chat messages (#129711) 2026-08-25 18:34:23 -07:00
Masato Hoshino 9c30c920fe fix(doctor): surface the resume failure cause for interrupted auth-profile archives (#123459)
maybeMigrateAuthProfileJsonStoresToSqlite discarded the error from
resumePendingAuthProfileMigrationArchives entirely, so the warning was always
the same generic string regardless of which of 5 distinct causes fired
(invalid receipt, target verification failure, lock failure, SQLite failure,
corrupt JSON). PR #123164 fixed the identical defect class in the sibling
shared-OAuth catch block 20 lines below in this same function, explicitly
modeling the fix on the third, already-correct sibling. This was the
unaddressed third catch block in that same family.
2026-08-25 18:27:48 -07:00
Peter Steinberger 8f2253497e fix(macos): cancelled Talk sessions can spin at full CPU (#129682)
* fix(macos): stop cancelled Talk silence monitors

* fix(macos): reuse cancellable periodic task owner
2026-08-25 18:26:43 -07:00
Josh Avant 1c37c8cdc7 fix(exec): scope reusable approvals to their working directory (#129636)
* fix(exec): bind durable approvals to working directory

* chore(apps): refresh native string inventory

* test(node-host): preserve prepared working directory

* fix(exec): use shared path safety facade

* fix(exec): revalidate approved directory identity
2026-08-25 18:24:14 -07:00
Peter Steinberger 4c4152e71d fix(channels): honor supported group history limits (#129710)
Co-authored-by: ayaangazali <ayaangazali.work@gmail.com>
2026-08-25 18:23:07 -07:00
Peter Steinberger 4a846f1d61 refactor(reef): remove obsolete JSONL protocol stores (#129698)
* refactor(reef): remove obsolete JSONL protocol stores

* test(reef): remove orphaned protocol test helper
2026-08-25 18:22:54 -07:00
RoboClaw 238c884986 fix(ui): expose mobile Inbox dismiss actions (#129379)
Keep per-item dismissal visible on touch layouts, add selected-tab Dismiss shown for dismissible entries, and preserve non-dismissible approvals.

Co-authored-by: roboclaw-bot <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
2026-08-25 18:09:17 -07:00
Peter Steinberger 3d0df74b0f fix(openshell): sandbox cleanup, workspace sync, and gateway setup failures (#129641)
* fix(openshell): harden sandbox lifecycle and workspace sync

* fix(openshell): preserve shipped workspace root layouts

* test(gateway): reset shared agent harness state between cases

* test(qa): measure channel health startup grace directly

* chore(release): leave changelog updates to release automation
2026-08-25 18:08:55 -07:00
Vincent Koc 2d465c2d75 fix(sqlite): replace synthetic stable migration fixture (#129695) 2026-08-26 09:08:21 +08:00
RoboClaw d6510fa961 fix(ui): show delegated work on selected threads (#129328)
Fixes #129318

Co-authored-by: roboclaw-bot <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
2026-08-25 18:07:10 -07:00
Dallin Romney cc1c61034f fix(qa): publish readiness only from final artifacts (#124189)
* fix(qa): publish readiness from final artifacts

* fix(qa): isolate runtime parity readiness

* test(qa): type runtime parity artifact mock
2026-08-25 18:02:17 -07:00
Peter Steinberger 91cc37b788 fix(gateway): stop fabricating scope-upgrade requests on trusted-proxy reconnects (#129563)
* fix(gateway): stop fabricating scope-upgrade requests on trusted-proxy reconnects

Same-key trusted-proxy reconnects whose auto-approvable scopes are already
covered by the paired grant now narrow the session in place instead of
running the pairing request/approve machinery: no pending-store writes and
no false 'device access upgrade requested' / 'auto-approved' security-audit
warns on every Control UI page load. The upgrade audit warn moved into
requirePairing so it fires only when a pairing request is materialized.
Durable widening (broadened deviceAutoApprove.scopes) and key-mismatch
repairs keep the existing lanes.

* fix(gateway): revalidate the live paired grant in the reconnect fast path

Address ClawSweeper P1: the narrowing decision now rereads the
authoritative paired row as the last await before returning, so a
concurrent revoke, key replacement, or grant reduction fails closed into
the pairing lane instead of riding the pre-plan snapshot. Extract the
pairing approval-plan resolver into connect-pairing-approval-plan.ts to
keep the authorization owner under the 700-line lint boundary.
2026-08-25 17:59:51 -07:00
Peter Steinberger 84c469a76c fix(apple): bind widget snapshots to their document owner (#129666) 2026-08-25 17:59:47 -07:00
Patrick Erichsen 004b06b6a0 Release validation: add isolated campaign skill runner (#129726) 2026-08-25 17:58:39 -07:00
Peter Steinberger 1ecc35f95f fix(crabbox): keep cloud worker credentials out of process arguments (#129665)
* fix(crabbox): keep worker setup secrets out of argv

* fix(crabbox): use managed temp root
2026-08-25 17:56:09 -07:00
Dallin Romney 12dff76235 fix(qa): pin Slack draft progress transport (#127298) 2026-08-25 17:53:51 -07:00
Vincent Koc 0036788055 refactor(android): reuse node JSON param parser (#120456) 2026-08-26 08:48:50 +08:00
Peter Steinberger 5ce9b61ceb fix(doctor): preserve managed container services (#129527)
* fix(doctor): preserve managed container services

* fix(doctor): scope linger checks to user services

* fix(doctor): limit container repair to user services

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-08-25 17:48:32 -07:00
Peter Steinberger 75a034d49b test(whatsapp): remove duplicate setup replays (#129713)
Amp-Thread-ID: https://ampcode.com/threads/T-01a037b5-3918-749f-90bd-5c9ac1dced16

Co-authored-by: Amp <amp@ampcode.com>
2026-08-25 17:47:06 -07:00
Peter Steinberger 16858a42f5 fix(cron): recover reminders missed across spring-forward gaps (#129478) 2026-08-25 17:42:20 -07:00
Vincent Koc f457c2cea1 refactor(ios): share Agent Pro detail components (#119868)
* refactor(ios): share Agent Pro detail components

* test(ios): update Agent Pro i18n source contract
2026-08-26 08:41:06 +08:00
Peter Steinberger 1172d68d31 perf(anthropic): reuse provider usage suite for profile parity (#129703) 2026-08-25 17:39:54 -07:00
Peter Steinberger 7c0a691955 fix(ai): preserve local-model tool calls in standalone streams (#129664) 2026-08-25 17:39:47 -07:00
Yuval Dinodia 78c5d7ceb5 fix(buzz): messages sent during Gateway downtime are dropped after restart (#117259)
* fix(buzz): messages sent during Gateway downtime are dropped after restart

Every new Gateway process subscribed to Buzz rooms starting at its own
start time, because the lookback flag that enables backlog paging is
process-local. That cutoff is applied as the NIP-01 since filter, so any
room message a human sent while the process was down was never returned
by the relay and never reached the agent or the transcript.

The account gateway now persists a per-account recovery watermark in the
plugin state store. First-ever setup still starts from the current time;
later process starts resume from the saved watermark, clamped to the
existing 24 hour retention floor. The watermark advances only after
inbound handling completes and is stored at the admitted message
created_at, so the inclusive since boundary re-offers the last admitted
message to the existing persistent event-id dedupe guard.

* fix(buzz): keep the cold-start recovery cursor behind unfinished work

Codex review found two ways the recovery watermark could still drop room
messages. Backlog replay dispatches up to eight handlers concurrently, so
a newer message finishing before an older one committed the newer
timestamp; a crash then left the older message with no dedupe record and
a cursor already past it. The stored timestamp was also the sender
controlled created_at, so a future dated room event pushed the cursor
past locally observed time and excluded real downtime messages on the
next start.

The account gateway now tracks a recovery frontier per session. A
checkpoint is the highest completed message time bounded by the oldest
still running message, the oldest failed message, and the receipt time
observed when the message was admitted. Checkpointing stays closed until
the bus reports the room backlog fully drained, so a session that is
still paging history cannot commit past events it has not seen yet.
catchUpHistory now reports drained or incomplete for that signal.

* fix(buzz): scope cold-start recovery per room and fence it at enqueue

Admit replay work into the recovery frontier when it enters the dispatch queue instead of when a worker starts it, so a crash cannot persist a cutoff past an event that is still queued.

Key recovery cursors by room instead of by account, so a room configured after the first start resolves to the current time and gets no backfill, while existing rooms resume from their own cursor.

Record an account-level start marker so the first start under a watermark-aware build recovers the existing retention window instead of repeating the reported loss on the first restart after an upgrade.

* fix(buzz): keep cold-start recovery to accounts that already ran

An account with no persisted cursor is a fresh install as often as it is a
pre-watermark upgrade, and stored state cannot tell them apart, so the first
start no longer replays the retention window. It records the current time as
each room cursor and recovers only from the second start onward.

Dropping the account start marker also removes the interrupted-bootstrap
window where a marker written before the room cursors made the next start
treat cursor-less rooms as initialized.

Recovery state capacity is now derived from the supported room limit instead
of a smaller fixed number, and any non-complete history paging outcome, not
just timestamp-over-limit, holds the recovery frontier undrained.

* fix(buzz): bound the recovery cursor store to each account

ClawSweeper found that the recovery watermark opened one fixed plugin-state
namespace for every account while sizing it at the per-account supported room
count. Plugin-state capacity is enforced per plugin and namespace, so once one
account registered its full room allowance, a second account's register call
threw and its rooms stayed at the current-time cutoff, which is the same
dropped-message outcome this PR set out to fix.

The store is now opened against a namespace derived from the account identity,
so each account carries its own supported room capacity. The account moves out
of the entry key into the namespace, which leaves one account-scoped store path
rather than a fallback, and makes cross-account cursor mixing unrepresentable.

* fix(buzz): simplify durable restart recovery

Co-authored-by: yetval <yetvald@gmail.com>

* test(buzz): use real relay response in recovery fixture

Co-authored-by: yetval <yetvald@gmail.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-25 17:39:30 -07:00
Erick Kinnee cbdfedee84 fix(plugins): scope runtime catalog discovery by provider (#129624)
* fix: scope provider catalog discovery by selected identities

* fix(plugins): enforce agent-scoped live catalog discovery

Co-authored-by: Erick Kinnee <ekinnee@gmail.com>

* chore: keep provider release notes in pull request context

---------

Co-authored-by: Erick Kinnee <ekinnee@gmail.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-25 17:37:31 -07:00
Peter Steinberger 6133ad92a0 fix(ui): show resolved agent workspace and effective model consistently (#129701) 2026-08-25 17:36:28 -07:00
Peter Steinberger 6f61184d1e fix(telegram): support polls lasting up to seven days (#129461) 2026-08-25 17:36:11 -07:00
Peter Steinberger 68e7942ffc fix(node-host): drain all workers before shutdown failures (#129699) 2026-08-25 17:35:56 -07:00
Josh Avant 49f4240118 fix: keep session catalog mirroring within isolated profiles (#129638)
* fix: bind catalog HOME policy in active facade

* fix: report isolated catalog mirroring
2026-08-25 17:31:38 -07:00
Peter Steinberger 6a246f70d1 refactor(state): retire six dead shared-state tables at schema v10 (#129626)
* refactor(state): retire six dead shared-state tables at schema v10

agent_model_catalogs, android_notification_recent_packages,
command_log_entries, diagnostic_stability_bundles, media_blobs, and
model_capability_cache landed with the database-first squash but their
runtime writers never reached main; every stable since v2026.6.10 created
them empty (agent_model_catalogs held only rebuildable catalog cache rows
until #111173 removed its writer). State schema 10 drops all six tables
and seven indexes through both the runtime-open and doctor migration
paths, records the retirements, bumps the native reader ceiling, and
corrects stale database-first doc claims that still named these tables
as canonical stores.

* test: move cross-lane schema-version pins to v10

The v10 retirement missed current-version pins outside src/state: the
native guard vitest wrapper, placement-move and node-worker-launch
same-version assertions, and the audit outbound-progress tripwire. The
pinned pre-C04 audit reader is a v9-era build that now refuses v10
databases by the version contract, so the test projects the file back to
the exact v9 shape with the documented 10-to-9 downgrade fixture before
the reader proof; the shared fixture also seeds the v10 retirement
regression.

* test: keep only the used downgrade fixture export
2026-08-25 17:31:32 -07:00
Vincent Koc 2671eff4bf refactor(ios): share voice permission support (#120176) 2026-08-26 08:30:06 +08:00
RoboClaw 37a32708c3 fix: agent-created automations appear under the session creator (#129371)
* fix: attribute agent-created automations to session creator

* fix: preserve session creator through spawn context

---------

Co-authored-by: roboclaw-bot <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-25 17:29:05 -07:00
Josh Lehman 2dbaeef693 fix(ui): keep active commentary after session navigation (#129640)
* fix(ui): restore active commentary after navigation

* test(ui): wait for responsive activity layout
2026-08-26 00:27:41 +00:00
Peter Steinberger 3c022b8479 refactor(progress-card): remove limit constant forwarders (#129687)
Amp-Thread-ID: https://ampcode.com/threads/T-01a037b7-6475-7130-8be6-39147410914b

Co-authored-by: Amp <amp@ampcode.com>
2026-08-25 17:24:22 -07:00
Peter Steinberger 4a029e5279 fix(twitch): include attachments in normal agent replies (#129644) 2026-08-25 17:24:12 -07:00
Peter Steinberger c1bab399ab refactor(cli): consolidate image option validation (#129463) 2026-08-25 17:19:09 -07:00
Peter Steinberger 1bce4d3d24 fix(cron): deliver auto-disable warnings when heartbeats are disabled (#129560)
* fix(cron): deliver auto-disable warnings without heartbeat cadence

* test(cron): recognize canonical auto-disable notification wakes

* test(cron): pair auto-disable wakes with deferred notices
2026-08-25 17:18:52 -07:00
Peter Steinberger 18ad0dda91 test: remove duplicate model-readiness assertion (#129683)
Amp-Thread-ID: https://ampcode.com/threads/T-01a037b5-3918-749f-90bd-5c9ac1dced16

Co-authored-by: Amp <amp@ampcode.com>
2026-08-25 17:18:20 -07:00
Peter Steinberger 66a939526e fix(skills): bound installer downloads (#129630)
* fix(skills): bound installer downloads

Direct skill dependency response bodies are capped at 256 MiB while streaming, preventing headerless or broken endpoints from consuming unbounded staging disk while preserving supported bundled artifacts.

Refs #81817

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
Co-authored-by: Andrii Furmanets <furmanets.andriy@gmail.com>

* fix(skills): reject oversized declared downloads

Cancel trustworthy identity Content-Length values above the shared 256 MiB
ceiling before opening the staging writer. Keep encoded or malformed
declarations on the authoritative decoded-stream byte cap.

Refs #81817

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
Co-authored-by: Andrii Furmanets <furmanets.andriy@gmail.com>

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
Co-authored-by: Andrii Furmanets <furmanets.andriy@gmail.com>
2026-08-25 17:17:35 -07:00
Peter Steinberger df962dd559 fix(cli): emit JSON failures when existing config is invalid (#129578)
* fix(cli): preserve invalid-config failures in JSON output

* test(cli): assert structured invalid-config process failures
2026-08-25 17:17:26 -07:00
Peter Steinberger 94b73083bf fix(cli): honor prefixed channel targets when creating threads (#129671) 2026-08-25 17:17:13 -07:00
Peter Steinberger c2602193d6 fix(ui): honor forced filtered session roster refreshes (#129484) 2026-08-25 17:13:48 -07:00
Peter Steinberger d3c5d8e33a fix(gateway): point admin auto-approve warnings at identityScopes (#129538)
The startup SECURITY WARNING and the critical security-audit remediation for
gateway.auth.trustedProxy.deviceAutoApprove.scopes containing operator.admin
still told operators to wait "until per-identity roles are available".
Per-identity admin grants shipped as gateway.auth.identityScopes and the
trusted-proxy docs already recommend them; the runtime guidance now names
that shipped fix instead of a nonexistent future feature.
2026-08-25 17:13:38 -07:00