Commit Graph

4760 Commits

Author SHA1 Message Date
joshavant d636f5f8e0 fix(agents): gate Claude live session protocol 2026-08-04 02:08:23 -05:00
Vincent Koc 84d9e93dbb chore(qa): cover plugin testing harness contracts (#118933)
* test(qa): cover plugin testing harness contracts

* test(qa): narrow plugin harness tool factory
2026-08-04 09:07:27 +08:00
Peter Steinberger e16bc0108c fix(gateway): keep plugin model allowlists static (#118854) 2026-08-03 17:39:45 -07:00
Patrick Erichsen 1aea2df935 fix(plugins): refresh bundled channel skills (#119020) 2026-08-03 17:31:00 -07:00
Michael Christenson II 7f7a709b1d fix: Ollama missing from onboarding when its service is reachable (#118020) 2026-08-03 17:49:31 -06:00
Peter Steinberger a78f2c40bf test(plugins): align tool fixtures with owner policy (#118959) 2026-08-03 16:09:05 -07:00
Vincent Koc 1d446ad2cc fix(plugins): remove stale load paths during uninstall (#118930)
* test(qa): prove marketplace plugin updates

* fix(plugins): clean exact install load paths on uninstall

* fix(ci): register marketplace lifecycle assertions
2026-08-03 21:57:54 +00:00
Peter Steinberger 25aa29d7a1 refactor: delete dead post-landing plugin/hooks scaffolding (#118920)
* refactor: delete dead post-landing plugin/hooks scaffolding

* fix(security): resolve fast-uri and undici HIGH advisories
2026-08-04 04:26:22 +08: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
Vincent Koc dd656d973d test(qa): cover Plugin SDK import topology (#118878) 2026-08-04 03:33:52 +08:00
Peter Steinberger ded1ec0c28 fix(plugins): retain result provenance in cached tool descriptors (#118874)
* fix(plugins): retain result provenance in cached tool descriptors

* test(plugins): bind cached provenance outcome observer
2026-08-03 12:25:12 -07:00
Harjoth Khara bcc27f6726 perf(cli): carry prepared plugin metadata through cold read paths (#118460)
* perf(cli): carry prepared plugin metadata through cold read paths

* perf(plugins): thread prepared metadata into auto-enable detection

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-03 12:23:00 -07:00
Vincent Koc 3c678acc17 test(qa): cover plugin authoring contracts (#118821)
* test(qa): cover plugin SDK entrypoint discovery

* test(qa): cover plugin manifest authoring

* test(qa): cover plugin package metadata
2026-08-03 18:31:14 +00:00
Vincent Koc 21a767639f fix(plugins): unify HTTP route conflict handling (#118203)
* fix(plugins): unify HTTP route conflict handling

* fix(plugins): preserve source-less route replacement

* test(line): type webhook route source
2026-08-04 02:15:00 +08:00
Peter Steinberger 6c1ba3145d fix(plugins): enforce configured bundled-plugin execution policy (#118701)
* fix(plugins): enforce configured bundled-plugin execution policy

* fix(plugins): avoid heavy channel policy dependency in manifest eligibility

* fix(config): remove plugin eligibility architecture import cycle
2026-08-03 09:32:25 -07:00
tzy-17 53d442eb51 fix(test): bound shared git inventory lookup (#111171)
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-08-03 23:36:49 +08:00
Peter Steinberger 7fafaf50f4 fix(onboard): keep referenced provider secrets out of plaintext (#118702)
* fix(onboard): keep referenced provider secrets out of plaintext

* fix(onboard): retain public credential owner type usage

* docs(onboarding): explain preserved credential profiles in reference mode
2026-08-03 08:34:47 -07:00
Vincent Koc 7fabb55648 fix(channels): generate catalog from package manifests (#118097) 2026-08-03 23:17:09 +08:00
Peter Steinberger 8d263b4844 fix(plugins): reject external public-artifact hardlinks (#118689) 2026-08-03 07:22:40 -07:00
Peter Steinberger 6d8c1ed30d fix(voice-call): prevent unrelated session recall in fast context (#118498)
* fix(talk): authorize fast session context

* test(plugins): preserve memory runtime mock types

* fix(plugins): preserve memory authorizer binding

* fix(memory): forward search authorization in lazy runtime

* test(memory): verify lazy authorizer host binding

* docs(plugins): define memory search authorization contract
2026-08-03 03:38:02 -07:00
Peter Steinberger ecc49b5a87 refactor(tts): absorb speech core package (#118513)
* refactor(tts): absorb speech core package

* fix(tts): preserve runtime SDK exports

* refactor(tts): remove private package exports

* test(tts): align canonical runtime mocks

* test(tts): complete canonical settings mocks

* chore(plugin-sdk): regenerate API baseline for #118513
2026-08-03 02:25:48 -07:00
SunnyShu 61429ef57a fix(agents): retain durable transcript-repair record when assistant turn persistence fails (#117845)
* [AI] fix(agents): retain durable transcript-repair backlog for delivered assistant finals

A delivered assistant reply was silently lost when the canonical transcript
append failed after a successful send: the finalizer logged the failure and
continued delivery, and clearing the transport-replay marker removed the only
durable copy of the final (P1 data loss).

- finalizeEmbeddedAgentCommand now records a durable pendingTranscriptRepair
  backlog on the session entry whenever the transcript writer throws, while
  pendingFinalDelivery cleanup stays unchanged.
- The backlog is ordered and appended per turn (deduplicated by per-run
  lifecycle generation, never by reply text), so consecutive failures and
  identical reply texts each keep their own recoverable record.
- The next CLI/embedded turn best-effort re-appends each missing assistant
  turn through the real SQLite writer (loaded via the existing lazy
  attempt-execution runtime boundary) and clears recovered entries; failures
  keep the backlog and never block the turn.
- Replays use exact per-turn idempotency (a per-run idempotency key with
  scan-assistant lookup) instead of tail-text gap-fill, so a distinct failed
  turn is re-appended even when an earlier persisted assistant message has
  identical text, and repeated replays stay idempotent.
- Finals owned by another transcript writer (assistantTranscriptOwned) are
  never queued, avoiding duplicate assistant messages after a user-turn-only
  writer failure.
- Session-entry shape normalization round-trips the backlog and upgrades a
  legacy single record into the array; slot-key registry updated.
- Regression tests: delivery-success + failed write keeps the repair record,
  next-turn recovery, consecutive failures (distinct and identical texts),
  recovery after an equal-text earlier assistant message, runtime-owned-final
  exclusion, and shape normalization; the scoped max-lines exception for the
  compaction-rotation suite is mirrored in oxlint-config.test.ts.

Fixes #117793

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

* [AI] fix(agents): recover transcript repairs across session rotation; split repair tests

assistant-transcript-repair now migrates a pending repair record to the
rotated successor session instead of retaining a predecessor-scoped
record that can never be written: rotation keeps the same session key
while replacing the entry's session id, so the guard previously skipped
the record on every later pass and the delivered turn stayed missing
from durable history. The recovered turn is appended to the successor
transcript under a tested ownership rule.

The transcript-repair scenarios moved out of the oversized
compaction-rotation suite into a focused test module
(assistant-transcript-repair.test.ts), and the new max-lines override
plus its oxlint-config assertion were removed per repo policy. An
end-to-end regression covers failed predecessor persistence followed by
a rotated successor and a successful repair.

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

* refactor(sessions): keep transcript repair array-only

* fix(agents): repair transcript before next turn

---------

Co-authored-by: Codex <noreply@anthropic.com>
Co-authored-by: Dallin Romney <dallinromney@gmail.com>
Co-authored-by: sallyom <somalley@redhat.com>
2026-08-03 02:40:16 -04:00
Peter Steinberger 133323875f fix(cli): close standalone memory managers after commands (#118500) 2026-08-02 22:57:59 -07:00
Peter Steinberger a6e0002eca perf(agents): carry prepared plugin load context into per-attempt tool construction (#118398)
* perf(plugins): carry prepared load context into tools

* fix(agents): keep prepared context setter private

* fix(agents): reuse prepared plugin metadata context

* refactor(agents): relocate prepared plugin context wiring

* test(agents): cover prepared plugin context owner path

* refactor(plugins): remove duplicate metadata type exports
2026-08-02 21:07:06 -07:00
Peter Steinberger bd3c2b8f49 refactor(plugins): consolidate SDK alias test fixtures (#118410)
* test(plugins): consolidate sdk alias fixtures

* test(plugins): satisfy alias fixture lint
2026-08-02 20:36:29 -07:00
Alex Knight d7def97638 fix(cli): one-shot agent --local runs never export OTel diagnostics (#100845)
Diagnostics exporters are plugin services that only ever start inside the
Gateway process, so embedded `openclaw agent --local` turns emitted
diagnostic events in the CLI process with no subscriber: zero spans,
metrics, or logs reached the OTLP collector while identical Gateway-
dispatched turns exported fine.

The CLI now starts the `diagnostics-otel` service around embedded agent
runs via a scoped, non-activating plugin load that honors the same
plugin-enablement config as the Gateway, and flushes before exit: drain
the async diagnostic-event queue, then shut the SDK down (force flush).
Each step is bounded separately (5s drain, 10s flush) so an unreachable
collector cannot hold the CLI open, and a stalled drain cannot consume
the flush window and discard telemetry that was already buffered.

When OTel is configured but the plugin is absent, the run now says so
instead of exporting nothing with nothing explaining why.

`diagnostics-prometheus` stays Gateway-only: it is a pull-based scrape
server that is useless in a short-lived process and would race the
Gateway for its port. No new config surface; configs without OTel enabled
short-circuit before any plugin load.

Co-authored-by: Alex Knight <15041791+amknight@users.noreply.github.com>
2026-08-03 13:29:46 +10:00
Peter Steinberger ff175b881b test(plugins): consolidate npm install fixtures (#118292) 2026-08-02 20:27:45 -07:00
Peter Steinberger d347cd1097 refactor: canonicalize cache mechanics (#118262)
* refactor: adopt shared map pruning

* refactor: share config-scoped ttl cache

* refactor: share backup link cache

* refactor: centralize native relay retention cap

* chore: remove obsolete bundled channel lint suppression

* chore: shrink max-lines baseline

* refactor: remove cache pruning wrappers
2026-08-02 19:33:13 -07:00
Peter Steinberger 6ee406b1bf fix(plugins): repair stale host packages after OpenClaw upgrades (#118304)
* fix(plugins): repair stale registered host package links

* refactor(plugins): isolate authoritative host-link repair owners

* fix(plugins): constrain host repair to registered install roots
2026-08-02 18:10:26 -07:00
Peter Steinberger 74c4d1cc7e perf(plugins): memoize auto-enable fingerprints (#118334) 2026-08-02 18:09:02 -07:00
Peter Steinberger 357087b9c7 refactor(gateway): lifecycle-owned ambient state via factory-registered drains (#118271)
* refactor(runtime): own ambient state lifecycle cleanup

* chore(plugin-sdk): refresh additive API baseline

* fix(runtime): restore agent wait listener lifecycle

Keep agent-job data process-shared while preserving module-local event subscription ownership. Ratchet the public wildcard budget down after replacing text-runtime's wildcard singleton export with named exports.
2026-08-02 18:06:46 -07:00
Peter Steinberger bb5c649e31 fix: bound pending approvals and preserve delivery order (#118252)
* refactor: centralize pending request lifecycles

Share timeout and settlement registries across worker, LSP, node-host, and approval fanout paths. Bound plugin conversation-binding approvals and preserve terminal notification ordering during slow delivery.

* style: satisfy pending registry lint rules

* test: await deferred plugin approval delivery

* test: satisfy forwarder type-aware lint
2026-08-02 17:30:53 -07:00
Peter Steinberger c43ba8e3fc fix(cli): speed up hook status reads through the Gateway (#118288)
* perf(cli): reuse gateway hook status (#118222)

* chore(protocol): register hooks.status schema module in generated surfaces
2026-08-02 17:21:28 -07:00
Peter Steinberger 9b8e50b9f6 refactor(scripts): consolidate redundant tooling paths (#118259) 2026-08-02 16:20:09 -07:00
Peter Steinberger a4110c31b3 refactor: adopt canonical async serialization (#118235)
* refactor: adopt canonical async serialization

* style: satisfy dedupe parameter lint

* style: resolve dedupe timestamp internally
2026-08-02 16:12:04 -07:00
Peter Steinberger 6adbd0901a test(plugins): dedupe capability provider fixtures (#118248) 2026-08-02 16:02:45 -07:00
Peter Steinberger 7866ecae4b fix(release): keep npm 12 pack checks working (#118209)
* fix(release): accept npm 12 pack json

* fix(release): share npm pack normalizer in plugin workflow
2026-08-02 14:57:49 -07: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 57809f4474 test(plugins): canonicalize native resolver fixtures (#118174) 2026-08-02 13:26:10 -07:00
Peter Steinberger 1400b5242a fix(plugins): remove disabled channel plugin configuration on uninstall (#118127) 2026-08-02 13:25:00 -07:00
Peter Steinberger 023ea4615d refactor(plugins): root-owned conversation-binding pending requests (#118075) 2026-08-02 11:10:45 -07:00
Peter Steinberger c28b524f38 refactor(auth): move Copilot OAuth ownership to plugin (#118063)
* refactor(auth): move Copilot OAuth ownership to plugin

* test(auth): cover plugin-owned Copilot OAuth

* test(auth): align OAuth runtime mocks

* refactor(auth): extract session OAuth adapter

* refactor(auth): centralize session OAuth dispatch

* test(auth): type OAuth refresh mock

* chore(plugin-sdk): regenerate API baseline for provider oauth dispatch
2026-08-02 10:59:28 -07:00
Peter Steinberger 74f3ec1223 test(plugins): consolidate loader fixtures (#118076) 2026-08-02 10:31:43 -07:00
Peter Steinberger 0ac3368c8f fix(plugins): contain rejected synchronous hook results (#117988)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-08-02 06:42:17 -07:00
Dallin Romney e9b25aa21d refactor(cua-computer): replace daemon MCP with CUA Driver SDK (#117205)
* chore(cua-computer): freeze CUA Driver 0.14.1 fixtures

* refactor(cua-computer): use CUA Driver SDK directly

* fix(cua-computer): repair CUA CI checks

* style(cua-computer): format driver cleanup

* fix(cua-computer): migrate retired driver path

* fix(cua-computer): start direct driver sessions
2026-08-02 20:03:24 +08:00
Peter Steinberger 92c7400a54 perf(cli): finish cold read paths (#117957)
* perf(cli): finish cold read paths

* test(cli): satisfy cold path lint gates

* test(cli): fix cold path fixture typing
2026-08-02 03:59:24 -07:00
Simone 3f9b4519a9 fix: prevent fractional chunk limits from stalling text splitting (#117727)
* fix: normalize fractional text chunk limits

* fix: normalize markdown chunk limits

* fix: normalize direct newline chunk limits

* fix(matrix): reuse progress-safe text chunker

* test(matrix): align runtime API guard

* test(matrix): keep outbound shard topology stable

* fix(matrix): preserve facade chunk compatibility

* test(matrix): keep runtime export guard stable

* fix(matrix): normalize render-aware chunk limits

* test(matrix): type real-send assertions

* fix(matrix): preserve one-unit event limits

---------

Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-08-02 04:53:31 -05:00
Peter Steinberger 26cf4e6130 test(gateway): reuse startup plugin metadata snapshot (#117897)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-08-02 01:10:31 -07:00
Peter Steinberger 37de5678ca fix: remove duplicate plugin CLI registry mock (#117894)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-08-02 00:57:57 -07:00
Peter Steinberger 1e9a620a28 refactor(gateway): remove deferred channel load flag; 503 plugin routes until runtime ready (#117852)
* refactor(gateway): remove deferred channel load flag; 503 plugin routes until runtime ready

* test(agents): make setup middleware load intent explicit

* test(gateway): pin webhook startup routing outside SPA
2026-08-02 00:36:21 -07:00