Commit Graph

1134 Commits

Author SHA1 Message Date
zhifu gao 42ad83142e fix(whatsapp): label voice transcripts as untrusted (#113111)
* fix(whatsapp): label voice transcripts as untrusted

* fix(whatsapp): preserve audio provenance in group history

Frame deferred voice transcripts while retaining their structured audio facts for later model-visible replay.

Refs #87269

---------

Signed-off-by: zhifu gao <lauragpt@users.noreply.github.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
Co-authored-by: zhifu gao <lauragpt@users.noreply.github.com>
2026-08-12 17:14:55 +08:00
Peter Steinberger 08142099da refactor(plugins): remove test-only facades and adapter (#122532)
* refactor(plugins): trim test-only facades

* refactor(whatsapp): remove legacy outbound adapter
2026-08-12 01:20:09 -07:00
Peter Steinberger fc0147b529 test(plugins): remove duplicate setup cases (#122515) 2026-08-12 00:19:22 -07:00
Peter Steinberger b080dd1e76 refactor: consolidate coercion contracts (#122458)
* refactor: consolidate coercion contracts

Centralize exact string, record, numeric, date, Boolean, argument, and structured-error coercions while preserving call-site semantics.

Migrate canonical-name collisions and deprecated internal SDK bypasses, deleting 55 net production/tooling lines. Expand declaration ownership enforcement to 101 allowed helpers and add a narrow export-completeness audit.

* fix: preserve standalone script coercions

Keep copied Control UI tooling self-contained and retain the trusted release harness module-relative source seam when the harness runs against an old target cwd.
2026-08-11 23:26:37 -07:00
Peter Steinberger 964c8c84c1 refactor: consolidate coercion ownership (#122299)
* refactor: consolidate coercion ownership

Centralize four canonical coercion helpers, migrate exact core and plugin duplicates through narrow Plugin SDK facades, and enforce declaration and plugin-normalization ownership boundaries.

The sweep adds eight focused SDK exports while deleting more production and tooling code than it adds. User-visible behavior is unchanged except for safer equivalent object and UI parsing at existing boundaries.

* fix: guard integer option ownership

Register resolveIntegerOption with the canonical function owner and extend the declaration-guard fixture so future local duplicates fail validation.

* fix: keep integer helpers on numeric facade

Remove the unshipped duplicate string-coerce exports and route every affected plugin consumer through the existing number-runtime contract.

* fix: point numeric coercion to number runtime

Make boundary and declaration diagnostics recommend the canonical numeric facade, with failing-before coverage for both guidance paths.
2026-08-11 17:14:53 -07:00
Peter Steinberger b350f76484 fix(channels): preserve failed agent run reactions (#122009) 2026-08-11 15:26:44 -07:00
Peter Steinberger 86bc5aa726 test(plugins): remove stale test plumbing (#122175) 2026-08-11 11:01:05 -07:00
Peter Steinberger fa03d9b913 refactor: consolidate coercion helpers (#121366)
* refactor: consolidate coercion helpers

* fix: remove duplicate coercion imports

* fix: preserve serialized coercion guard

* chore: ratchet coercion helper carve-outs

* fix(test): keep gauntlet subprocess startup lean

* fix: preserve imported session timestamp semantics

* fix: preserve catalog timestamp string semantics

* chore: align plugin SDK surface ratchet

* fix: preserve trajectory and SDK string contracts

* fix(test): preserve QA record assertion semantics

* fix: complete standalone record guard rename

* refactor(cron): use canonical string coercion

* fix(acpx): preserve Pi timestamp parsing

* test(channels): adapt custody test harnesses

* test(telegram): classify media harness as test support

* test(acpx): split timestamp contract coverage

* test(channels): support generated custody contracts

* chore: ban the full coercion helper name set

Extends the declaration guard to all eleven consolidated helper names and
renames the cron schedule-identity readNumber wrapper to readScheduleInteger
so the banned generic name cannot regrow.

* fix(scripts): repair release-validation guard drift and lint cause

Restores the renamed isJsonRecord guard in assertTrustedWorkflowHarness after
main added isRecord call sites in parallel, and attaches the caught YAML error
as the thrown error cause (preserve-caught-error was red on main).

* fix: preserve Claude timestamp string semantics

* fix: preserve persisted timestamp string semantics

* fix: preserve date-first timestamp contracts

* fix(openai): harden delegation failure formatting

* chore: close coercion helper guard gaps

* test(openai): model non-error delegation rejection

* chore: refresh plugin SDK API contract

* fix(tasks): use canonical string field reader

* fix(ai): use canonical provider error field coercion

* fix(browser): migrate native bootstrap coercion

* docs(plugin-sdk): clarify text record export compatibility

* fix(gateway): normalize approval execution identity

* test(outbound): isolate message action poll harness
2026-08-11 00:02:18 -07:00
Peter Steinberger fd1b965f2b refactor(plugins): remove orphan test API barrels (#121761)
* test(plugins): remove orphan test API barrels

* refactor(plugins): remove orphan test-only exports

* refactor(imessage): remove orphan test plugin

* test(plugins): remove stale package guard timeout
2026-08-10 16:42:34 -07:00
Ayaan Zaidi 9935ca3b30 fix(approvals): bind native requests to channel accounts (#121673)
Native approval delivery and resolution now stay bound to the originating or explicitly targeted channel account. Unbound requests fail closed across multiple eligible accounts; trusted reviewer-less SDK callers remain compatible.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-11 01:42:41 +05:30
Peter Steinberger 3b3c540896 refactor: remove dead branches and test-only helpers (#121345)
* refactor: remove dead branches and test-only helpers

* fix: preserve codex cleanup error causes

* fix: preserve gateway error code compatibility

* chore: update plugin sdk api baseline

* docs: fix live cache runner path
2026-08-10 06:47:43 -07:00
Peter Steinberger 0efd5b4bc9 refactor(channels): move owner policy into plugins (#121257)
* refactor(channels): move owner policy into plugins

* test(plugin-sdk): lower surface budget after export removal
2026-08-09 15:46:18 -07:00
Peter Steinberger 40dbc7a65a test(plugin-sdk): remove repo-local test helper fossils (#121190) 2026-08-09 11:44:18 -07:00
Peter Steinberger 54ae94530c refactor(approvals): simplify resolver plumbing (#120923) 2026-08-08 23:09:24 -07:00
Peter Steinberger e1ec95dcbf refactor(auth): dedupe profile upserts and approval resolvers (#120831)
* refactor(auth): dedupe profile upserts and approval resolvers

* test(auth): mock canonical locked upsert

* test(auth): mock locked upsert during onboarding
2026-08-08 21:14:16 -07:00
Peter Steinberger 75dbe52e3e refactor: one code path behind doctor legacy-state migrations (#120716)
* refactor(doctor): prefer manifest route-state owners

* refactor(doctor): unify config repair declarations

* refactor(doctor): unify legacy state migrations

* fix(doctor): satisfy migration pipeline guards

* fix(plugin-sdk): keep doctor adapter inside boundary
2026-08-08 18:23:15 -07:00
Peter Steinberger 8cb53c7b55 perf(doctor): keep bundled doctor contract closures dependency-light (#120698)
* perf(doctor): keep bundled doctor contract closures dependency-light

Doctor contract enumeration cold-loads each plugin's doctor-contract-api
closure via jiti, so a static value import of openclaw/plugin-sdk/runtime-doctor
pulled the state-db/kysely graph (~4.3s per closure) into
listPluginDoctorLegacyConfigRules / listPluginDoctorStateMigrationEntries.

- migrate all light doctor-contract closures (66 files) to the
  dependency-light openclaw/plugin-sdk/runtime-doctor-migrations subpath
- voice-call: load detect/repairOpenClawStateDatabaseSchema* lazily inside
  the migration bodies; keep only a type-only static runtime-doctor import
- matrix: split pure credential record shapes/normalizers into
  credentials-state.ts so the doctor closure no longer imports the sync
  plugin-state store through credentials-read
- guard: doctor-contract-closure-guard.test.ts now forbids static value
  imports of runtime-doctor in closures alongside agent-runtime

* fix(matrix): keep credential revocation record type module-local

Knip production scan flags the export as consumer-less; the type is only
referenced by the exported union and revocation guard signature.
2026-08-08 17:51:31 -07:00
Peter Steinberger da4a656cdb improve: doctor migration checks no longer load every bundled plugin runtime (#120678)
* perf(plugins): declare doctor contract surfaces

* perf(doctor): slim migration import closures

* perf(plugins): narrow doctor declaration record surface and wire owner-test lane

Registry records carry only the doctorContract declaration instead of the whole
parsed manifest, and check:changed now selects the src/plugins-owned declaration
honesty and closure-guard tests for extension module/manifest changes so
cross-lane drift cannot pass PR classification.

* fix(doctor): keep control-plane dist imports require-safe

Keep doctor and channel control-plane chunks off exec-class dependencies, and enforce native require(esm) loading during postbuild.

* chore(plugin-sdk): regenerate API baseline

* chore(plugin-sdk): sync export ordering

* fix(plugins): satisfy doctor contract CI boundaries

* perf(doctor): make qqbot doctor closure dependency-light

qqbot was the last plugin above 5s in doctor state-migration enumeration
(~8s under tsx/jiti). The cost was not the state-key builder (already a
leaf): its doctor closure value-imported the runtime-doctor SDK barrel,
whose plugin-state-store/state-db re-exports pull kysely (~330 modules),
plus security-runtime for one fileExists (~200 modules), all resolved
per-module by jiti during enumeration.

Split the migration-define helpers and light re-exports into a new
private-local plugin-sdk/runtime-doctor-migrations subpath; runtime-doctor
re-exports it so its public surface is byte-identical (API baseline hash
unchanged). qqbot's doctor-contract and state-migrations now import only
the light subpath, swapping fileExists for the equivalent async
legacyStateFileExists already in the closure.

qqbot enumeration: ~8.0s/531 modules -> ~0.25s/18 modules.

* chore(plugin-sdk): drop private-local subpath from API baseline

runtime-doctor-migrations is private-local-only; the baseline tracks public
modules, and the earlier line was generated before the classification.

* fix(plugins): register runtime-doctor-migrations boundary paths

The private-local subpath list feeds the extension package boundary map;
the shared paths config and xai's derived overrides must carry the same
entry or the boundary contract test fails.
2026-08-08 13:29:18 -07:00
Peter Steinberger 48639663b0 chore(release): prepare 2026.8.1 (#120375) 2026-08-07 18:44:12 -07:00
joshavant 87156bab23 fix(typing): keep long active turns visible 2026-08-07 16:11:52 -05:00
Josh Avant c691f2e41c fix(progress): preserve callback acceptance results (#120171)
* fix(progress): preserve callback acceptance results

* fix(progress): require transport acknowledgements

* fix(progress): preserve direct acceptance outcomes
2026-08-07 14:40:33 -05:00
Peter Steinberger b4a26783f7 refactor(test): consolidate duplicated requireRecord and provider HTTP mock helpers (#119982)
* refactor(test): consolidate duplicated test helpers

* test: remove stale record guard import

* fix(test): remove orphaned record guards

* refactor(test): keep record requirement messages exhaustively typed

* fix(test): keep packages/ai record guard package-local
2026-08-06 14:48:01 -07:00
Peter Steinberger f5e3b5ef54 refactor(plugins): single-source question reactions and preflight audio (#119987) 2026-08-06 14:47:36 -07:00
Peter Steinberger 6aee2792d9 fix(whatsapp): exercise descriptor-safe credential persistence (#119621) 2026-08-05 10:36:36 -07:00
Peter Steinberger 60a8ec821c refactor(plugins): reuse canonical error coercion (#119451) 2026-08-04 21:05:45 -07:00
Patrick Erichsen 1aea2df935 fix(plugins): refresh bundled channel skills (#119020) 2026-08-03 17:31:00 -07:00
Peter Steinberger f9d9d1225a refactor(channels): own the lifecycle status contract in SDK patch factories (#118795)
* refactor(sdk): add channel lifecycle patch factories

* refactor(channels): adopt lifecycle patches in a-m

* refactor(channels): adopt lifecycle patches in n-z

* refactor(runtime): lifecycle-own ambient registries

* test(slack): assert lifecycle factory fields

* fix(sdk): preserve lifecycle patch extras types

* test(zalouser): widen lifecycle status sink

* test(irc): avoid shadowed status patch

* fix(zalo): reuse account-agnostic media route

* fix(gateway): accept explicit channel ready recovery

* test(qa): assert terminal Slack block fact

* test(qa): restore Slack blocked lifecycle scenario

* test(gateway): lock explicit lifecycle recovery contract
2026-08-03 12:39:48 -07:00
Peter Steinberger 09e40d0b74 fix(whatsapp): honor disabled self-chat without widening group access (#118711) 2026-08-03 07:57:23 -07:00
Peter Steinberger 3b6cad7e31 fix(whatsapp): preserve terminal retry exhaustion lifecycle (#118659)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-08-03 06:19:00 -07:00
Peter Steinberger fe6fa891ea fix(whatsapp): clear and migrate every Baileys credential class (#118610)
* fix(whatsapp): clear and migrate every auth credential class

* test(whatsapp): await nullable legacy migration detector
2026-08-03 03:54:41 -07:00
Peter Steinberger 8e35fb4963 test(channels): consolidate remaining channel scaffolding (#118493)
* test(channels): consolidate channel scaffolding

* test(channels): fix helper typings
2026-08-02 23:03:54 -07:00
Vincent Koc f32a266134 fix(whatsapp): render quoted self-chat replies with cached LIDs (#116814)
* fix(whatsapp): align quoted replies with resolved jid

* fix(whatsapp): preserve inbound media type import
2026-08-03 12:54:28 +08:00
Vincent Koc f5637c0685 fix(qa): restore prerelease validation (#118255)
* test(whatsapp): return accepted monitor send results

* fix(qa): recognize Code Mode write results
2026-08-03 10:09:19 +08:00
Vincent Koc b35b8e286d fix(plugins): unblock prerelease validation (#118103)
* fix(plugins): align compatibility registry identity

* fix(slack): compact response URL native fallbacks

* test(plugins): stabilize prerelease runtime checks

* fix(packaging): include CUA driver in root package

* fix(packaging): declare CUA runtime dependency

* fix(cua): defer native driver loading
2026-08-03 04:48:05 +08:00
Peter Steinberger 0c32879d45 feat(channels): publish recorded lifecycle from bundled channel transitions (#118110)
* feat(channels): publish recorded lifecycle from bundled channel transitions

* chore: remove lifecycle changelog entry
2026-08-02 13:04:49 -07:00
Santiago a2ffa4850d docs(whatsapp): document wacli messages show verification (#116410) 2026-08-02 12:03:42 -07:00
Peter Steinberger 641a4bf7b0 fix(whatsapp): reject unaccepted provider deliveries (#118114)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-08-02 12:01:38 -07:00
Dinesh H Suthar 35b00ddd14 fix(reply): preserve retryable final delivery recovery (#117597)
* fix(reply): preserve retryable final recovery

* fix(reply): preserve partial-delivery recovery markers

* fix(reply): keep delivery classification cycle-free

---------

Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-08-02 05:17:02 -07:00
Peter Steinberger 0aa262a795 fix(whatsapp): keep inbound media diagnostics safely redacted (#117939) 2026-08-02 03:16:24 -07:00
clawsweeper[bot] c8688051ed fix(whatsapp): log terminal inbound media failures (#117717)
* fix(whatsapp): log terminal inbound media failures

* fix(whatsapp): log terminal inbound media failures

* fix(whatsapp): surface media enrichment failures

* test(whatsapp): preserve caught media errors

---------

Co-authored-by: clawsweeper <274271284+clawsweeper[bot]@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-08-02 17:13:16 +08:00
Peter Steinberger d6aafb3dfc refactor(whatsapp): split inbox lifecycle coverage (#117910)
* test(whatsapp): split inbox lifecycle coverage

* test(whatsapp): import metadata cache type
2026-08-02 02:09:47 -07:00
Peter Steinberger dc38411ca4 test: consolidate WhatsApp monitor suites (#117854)
* test: consolidate WhatsApp monitor suites

* test: preserve WhatsApp max-lines ratchet path
2026-08-02 00:20:17 -07:00
Peter Steinberger e7f1202bbb refactor(whatsapp): consolidate QA message extraction (#117836) 2026-08-01 23:18:09 -07:00
clawsweeper[bot] 749226265c fix(whatsapp): preserve source direction for automatic reactions (#117697)
Co-authored-by: clawsweeper <274271284+clawsweeper[bot]@users.noreply.github.com>
2026-08-01 23:16:08 -07:00
Peter Steinberger 8ae21a6ae5 refactor(approvals): share native channel factory routing (#117811)
* refactor(approvals): share native channel factory routing

* fix(approvals): pin routed factory target types

* refactor(approvals): isolate forwarding factory entrypoint

* refactor(plugin-sdk): rename flat approval params type; budget +1 for routed approval factory

* chore(plugin-sdk): regenerate API baseline for routed approval factory

* fix(channels): bind approval authorizer references for lint
2026-08-01 23:08:36 -07:00
Peter Steinberger d6e537a859 refactor(channels): share persistent state error reporting (#117813) 2026-08-01 22:06:25 -07:00
Peter Steinberger ccee629359 refactor(plugins): delete registry compat scaffolding (#117749)
* refactor(plugins): delete registry compat scaffolding

* test(plugins): update CLI registry handle mock

* fix(plugins): preserve explicitly initialized hook registries

* test(plugins): update registry ownership fixtures

* fix(channels): restore registry snapshot memo
2026-08-01 21:18:47 -07:00
Peter Steinberger 95c037863f refactor(whatsapp): deduplicate reply delivery test fixtures (#117710) 2026-08-01 18:46:59 -07:00
Peter Steinberger 7c9794b5c6 fix(whatsapp): normalize future-proof QA poll and video note ingress (#117579)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-08-01 12:30:49 -07:00
Vincent Koc 263741b1f0 fix(ci): align release validation fixtures (#117494)
* fix(release): align beta 6 e2e fixtures

* fix(doctor): preserve missing state startup signal

* test(release): align beta e2e contracts

* test(agents): use canonical empty auth store

* test(agents): isolate prompt cooldown scheduling

* test(release): align main validation fixtures

* test(release): accept Code Mode plugin tool evidence

* fix(test): repair release validation checks

* test(cron): assert structured session targets
2026-08-02 00:39:36 +08:00