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
18e5b0e3e3
test(web): trim duplicate provider test surfaces ( #121727 )
2026-08-10 15:44:54 -07:00
Peter Steinberger
fc9905edb2
refactor(providers): consolidate streaming fixtures ( #114475 )
2026-08-09 07:37:52 -07:00
Peter Steinberger
00194139ba
refactor(providers): consolidate contract fixtures ( #114424 )
2026-08-09 07:07:47 -07:00
Peter Steinberger
8616c0c374
refactor: finish shared test helper migrations ( #120996 )
...
* test: finish shared helper migrations
* test: fix helper migration CI
* style: fix test import ordering
* test(acpx): restore deferred void types
* test: fix helper migrations after rebase
2026-08-09 06:00:06 -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
sunlit-deng
89c792bf64
fix(google): reject malformed video operation JSON ( #115465 )
...
* fix(google): reject malformed video operation JSON
* fix(google): reuse shared provider JSON reader for video operations
Route successful Google video operation responses through the canonical
readProviderJsonResponse so fatal UTF-8 decoding and malformed-JSON wrapping
stay on the shared provider contract. Keep the lenient non-OK detail path.
2026-08-09 04:15:39 +03: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
bb019e4a53
fix(providers): preserve realtime tool-result delivery ownership ( #120776 )
...
Co-authored-by: Wan Yong <wan.yong@xydigit.com >
2026-08-08 17:03:43 -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
sunlit-deng
83963e5135
fix(google): accept base64url provider media ( #116204 )
...
* fix(google): accept base64url in Live audio
* fix(google): normalize base64url in one pass
* fix(google): normalize base64url at every Google media boundary
* fix(google): normalize image media and avoid double music validation
* test(google): exercise URL-safe base64 fixtures
---------
Co-authored-by: Patrick Erichsen <patrick.a.erichsen@gmail.com >
2026-08-06 19:00:25 -07: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
joshavant
43b1e375a9
fix: preserve healthy incompatible auth profiles
2026-08-06 01:48:09 -05:00
joshavant
9702134882
fix: settle Gemini CLI auth preparation failures
2026-08-06 01:48:09 -05:00
Peter Steinberger
8db2cb7a94
refactor(providers): deduplicate bundled model catalogs ( #119627 )
2026-08-05 07:40:07 -07:00
Vincent Koc
e35d22807e
perf(xai): lazy-load optional capability runtimes ( #119374 )
...
Punchcard-Session: coral-workshop-workshop-3f
2026-08-05 11:26:40 +08:00
Peter Steinberger
990fdcf6fd
fix(providers): recognize configured media credentials across provider boundaries ( #118761 )
...
* fix(providers): honor configured media credentials across owner boundaries
* test(providers): align configured auth fixtures and derived SDK surfaces
* fix(providers): enforce shared DashScope media credential policy
2026-08-03 13:26:31 -07:00
Peter Steinberger
8eaf917efb
fix(google): honor Cloud SDK credential location and Vertex billing project ( #118745 )
2026-08-03 10:47:13 -07:00
Peter Steinberger
8df0142771
fix(google): retry stalled Gemini response bodies ( #118511 )
...
Co-authored-by: Peter Steinberger <steipete@macos.shared >
2026-08-02 23:20:28 -07:00
Vincent Koc
9e81a9b51c
fix(google): restore image generation with blank base URL ( #116852 )
...
* fix(google): handle empty image generation base URL
* fix(google): preserve attribution for blank base URL
* test(google): cover blank media base URLs
* fix(google): normalize blank Gemini API URLs
---------
Co-authored-by: Ted Li <tl2493@columbia.edu >
2026-08-03 12:18:16 +08:00
Vincent Koc
2844876be3
fix(google): align unsupported CLI auth paths ( #118034 )
2026-08-03 00:13:19 +08:00
Vincent Koc
5be95ad4ba
fix(google): bound native realtime tool ownership
2026-08-02 15:59:47 +08:00
Vincent Koc
b620caabcb
Merge pull request #117490 from codex/qa402-google-live-session-activation-deadline
...
fix(google): honor Gemini Live new-session activation deadlines
2026-08-02 15:50:02 +08:00
Peter Steinberger
131b9e3904
refactor(voice): share realtime session lifecycle ( #117865 )
...
* refactor(voice): share realtime session lifecycle
* test(voice): normalize abort rejection
2026-08-01 23:35:57 -07:00
Vincent Koc
ee6302161a
fix(google): keep realtime queue policy internal
2026-08-02 05:54:34 +08:00
Vincent Koc
30f8fbc67a
perf(google): avoid copying rejected realtime audio
2026-08-02 05:27:36 +08:00
Vincent Koc
1ae9b1cfc5
test(google): preserve queued audio across fresh reconnect
2026-08-02 05:27:36 +08:00
Vincent Koc
213c05182f
refactor(google): centralize realtime audio queue bounds
2026-08-02 05:27:36 +08:00
Vincent Koc
24e6354ec2
fix(google): preserve realtime startup audio order
2026-08-02 05:27:36 +08:00
Vincent Koc
aab146eeec
fix(google): bound lazy realtime audio queue
2026-08-02 05:27:36 +08:00
Vincent Koc
53d227970e
fix(google): bound native realtime audio queue
2026-08-02 05:27:36 +08:00
Vincent Koc
cdf4c4ce7a
merge: refresh realtime continuity onto main
...
* origin/main: (53 commits)
fix(whatsapp): normalize future-proof QA poll and video note ingress (#117579 )
fix(perf): separate warm and first-device health probes (#117525 )
fix(ci): repair plugin prerelease validation (#117562 )
fix(tasks): sanitize every human task and flow detail (#117568 )
fix(feishu): cancel unread streaming-card error bodies before release (#117312 )
fix(status): honor explicit local RPC fallback timeouts (#117519 )
fix(tasks): validate notification policy before persistence (#117554 )
refactor: consolidate full release child workflows (#117385 )
refactor(policy): centralize doctor health-check descriptors (#117578 )
perf(gateway): mark recovery before model preparation (#117544 )
test(openai): parse realtime websocket frames safely
fix(openai): keep embedding identity stable across upgrades (#117557 )
fix(googlechat): drop invalid thread resource names before send (#108324 )
fix(skills): preserve profile in ClawHub command hints (#117555 )
fix(cli): explain filtered plugin policy without unsafe recovery (#117556 )
fix(irc): strip markdown from outbound text (#112961 )
refactor(plugins): consolidate registry snapshots (#117561 )
test(ui): cover reentrant Talk meter cleanup
fix(plugins): fail blocked enable commands (#117536 )
fix(ui): reclaim reentrant Talk audio meters
...
2026-08-02 03:32:45 +08:00
Vincent Koc
81abcdeba4
fix(google): reset continuity before reconnect backoff
2026-08-02 02:32:20 +08:00
Vincent Koc
d53772e984
fix(google): signal fresh realtime sessions
2026-08-02 01:29:18 +08:00
Vincent Koc
d60584ee2d
test(google): cover ready callback close precedence
2026-08-02 01:25:41 +08:00
Vincent Koc
814a2ebb61
fix(google): flush lazy prompts on provider readiness
2026-08-02 01:22:33 +08:00
Vincent Koc
a38dc473dc
fix(google): make continuity reset generation-idempotent
2026-08-02 01:06:14 +08:00
Vincent Koc
3a8afb2a71
Merge origin/main into fix/google-realtime-lazy-queue-bounds-20260801
...
* origin/main: (44 commits)
fix(plugins): compare authoring metadata by canonical JSON semantics (#117486 )
fix(doctor): reject contradictory lint check selectors (#117495 )
fix(anthropic): honor configured model pricing (#117275 )
refactor(plugins): reuse scoped loader for capability discovery (#117373 )
refactor(test): derive changed tooling routes (#117407 )
fix(kova): clarify extension memory attribution (#117500 )
fix(imessage): sanitize private context on every outbound path (#117501 )
fix(ci): align release validation fixtures (#117494 )
fix(talk): preserve owner authorization in realtime consults (#114163 )
fix(ui): surface aborted-run diagnostics (#117497 )
perf(models): skip Ollama row runtime loading (#117465 )
fix(cli): report user profile command outcomes (#117466 )
fix(active-memory): detect Chinese recall intent in escalate mode (#117338 ) (#117419 )
fix(workboard): ignore caller-supplied archivedAt when creating a card (#116412 )
fix(models): avoid waiting on promotions before listing models (#117322 )
refactor(plugins): inherit shared package boundary settings (#117474 )
fix(systemd): parse all inline environment assignments (#117484 )
feat(web-fetch): add tools.web.fetch.headers for operator request headers (#115545 )
fix(qa): Slack progress lane misses successful delivery (#117391 )
refactor: deduplicate Codex prompt snapshot fixtures (#117476 )
...
2026-08-02 01:02:06 +08:00
Vincent Koc
4f2429a817
merge: refresh realtime continuity onto main
...
* origin/main: (41 commits)
fix(plugins): compare authoring metadata by canonical JSON semantics (#117486 )
fix(doctor): reject contradictory lint check selectors (#117495 )
fix(anthropic): honor configured model pricing (#117275 )
refactor(plugins): reuse scoped loader for capability discovery (#117373 )
refactor(test): derive changed tooling routes (#117407 )
fix(kova): clarify extension memory attribution (#117500 )
fix(imessage): sanitize private context on every outbound path (#117501 )
fix(ci): align release validation fixtures (#117494 )
fix(talk): preserve owner authorization in realtime consults (#114163 )
fix(ui): surface aborted-run diagnostics (#117497 )
perf(models): skip Ollama row runtime loading (#117465 )
fix(cli): report user profile command outcomes (#117466 )
fix(active-memory): detect Chinese recall intent in escalate mode (#117338 ) (#117419 )
fix(workboard): ignore caller-supplied archivedAt when creating a card (#116412 )
fix(models): avoid waiting on promotions before listing models (#117322 )
refactor(plugins): inherit shared package boundary settings (#117474 )
fix(systemd): parse all inline environment assignments (#117484 )
feat(web-fetch): add tools.web.fetch.headers for operator request headers (#115545 )
fix(qa): Slack progress lane misses successful delivery (#117391 )
refactor: deduplicate Codex prompt snapshot fixtures (#117476 )
...
2026-08-02 01:00:52 +08:00
Vincent Koc
877843422e
fix(google): avoid dropping first realtime voice input ( #117450 )
...
* commit '2ccb11ac28daea1939e6666c1a0a3d346159d9fe':
test(google): satisfy realtime live lint
test(google): wait for realtime response drain
test(google): diagnose realtime live readiness
test(google): prove realtime ready owns live session
test(google): cover realtime setup activation ordering
fix(google): gate realtime readiness on session ownership
2026-08-02 00:59:02 +08:00
Vincent Koc
9cb647e735
test(google): prove lazy realtime prompt delivery
2026-08-02 00:15:41 +08:00
Peter Steinberger
568ea29d2e
refactor(plugins): inherit shared package boundary settings ( #117474 )
2026-08-01 09:11:09 -07:00
Jesse Merhi
d3f4530ce8
feat(google): allow operator headers on Gemini web search ( #115549 )
...
* feat(google): support Gemini web search headers
* fix(google): validate Gemini search headers
* docs(changelog): credit Gemini headers
* test(secrets): route config contracts through collector
* chore: remove release-owned changelog entry
* test(google): cover resolved search headers
2026-08-02 01:41:09 +10:00
Peter Steinberger
4b1d397221
fix(google): bound realtime browser activation expiry
2026-08-01 08:37:22 -07:00
Vincent Koc
9789093c26
fix(google): signal fresh realtime continuity
2026-08-01 23:08:57 +08:00
Vincent Koc
85d959ee61
test(google): satisfy realtime live lint
2026-08-01 22:58:29 +08:00
Vincent Koc
b1a0ee8539
test(google): wait for realtime response drain
2026-08-01 22:51:35 +08:00
Vincent Koc
b2320c84ee
fix(google): bound lazy realtime user messages
2026-08-01 22:47:12 +08:00
Vincent Koc
6f3f662a86
test(google): diagnose realtime live readiness
2026-08-01 22:46:14 +08:00