Jason (Json)
09c6d66d19
fix(ui): render managed chat media under base paths ( #113163 )
2026-07-23 16:49:14 -06:00
Peter Steinberger
5fb3136be0
feat(telegram): render rich markdown lists natively ( #113158 )
2026-07-23 15:41:21 -07:00
Peter Steinberger
5efd616413
refactor(memory): drop media-marker text from LanceDB memory ingestion ( #113145 )
...
The memory plugin's LanceDB path no longer regex-extracts or rewrites
[media attached:] marker text. Media-note lines are classified as
presentation-only and dropped wholesale during capture/query ingestion
(bracket-safe classifier: filenames may contain ']'); captions and
non-media text are preserved; legacy inline tokens stay inert escaped text.
Recall-side neutralization is deleted deliberately: image discovery is
scoped to the current-turn imagePrompt, so recalled memory text (markers
or bare path-shaped tokens) never reaches attachment scanning. Regressions
prove that boundary at the embedded, CLI, and plugin-harness entry points.
2026-07-23 14:36:07 -07:00
Peter Steinberger
f9708083f8
refactor(imessage): unify outbound markdown ranges ( #113138 )
...
* refactor(imessage): use shared markdown ranges
* test(imessage): keep format profile private
2026-07-23 13:33:14 -07:00
Peter Steinberger
197741ac4e
refactor(zalouser): unify inline emphasis rendering ( #113134 )
2026-07-23 12:29:50 -07:00
Peter Steinberger
2e4df03b30
test(discord): authorize voice e2e fixtures ( #113132 )
2026-07-23 12:20:10 -07:00
Peter Steinberger
c453c03979
refactor(media): delete internal MsgContext.Media* parallel fields for fact-only runtime ( #113042 )
...
* refactor(media): delete internal MsgContext.Media* parallel fields for fact-only runtime
Internal runtime now carries a fact-only RuntimeMsgContext: the legacy
MediaPath/MediaUrl/MediaType parallel fields (and plural/transcribed
variants), their alignment and default helpers, and bundled legacy payload
builders are removed from internal paths. Staging, hooks, Gateway, media
understanding, and the Telegram, QQ, Signal, Slack, iMessage, Discord, QA,
and Zalo plugins consume ordered MediaFact[] directly.
Retained boundaries per the program audit: public Plugin SDK MsgContext,
persisted transcript Media* rows, and documented template variables keep
working via projectMediaFacts at the five declared seams (fact owner,
channel payload, inbound-event, transcript persistence, SDK adapter).
Review-round hardening, each with regressions:
- hasStagedMediaProjection requires every path-bearing fact staged (was
any-satisfied; mixed contexts skipped staging unstaged facts).
- finalizeInboundContext returns Omit<T, LegacyMediaContextKey> so deleted
legacy fields leave the type when they leave the object.
- QQ image facts carry explicit kind: "image" (remote URLs have no MIME).
- resolveStagedMediaFacts adopts staged legacy paths positionally while
retaining canonical fact metadata and cardinality (staged projections
previously replaced canonical facts wholesale).
1,615 tests across 47 files; goldens untouched; delegated check:changed
green (run 30009882062).
* test(media): migrate remaining legacy Media* consumer suites to structured facts
Exact-head CI caught suites outside the curated affected set that still
asserted internal legacy fields. All were stale internal-field assertions
migrated to facts, except QA Channel, which had a real migration gap: it
still constructed the bundled legacy payload internally and now normalizes
saved attachments with toInboundMediaFacts and passes the declared media
parameter directly. Exhaustive rg sweep over every test referencing the
deleted fields (133 files, each run individually) is green.
2026-07-23 11:45:40 -07:00
Peter Steinberger
129f86bbf5
feat: auto-collect durable meeting transcripts ( #113122 )
...
* feat(meetings): auto-collect durable transcripts
* chore(plugin-sdk): refresh meeting transcript API baseline
* fix(plugin-sdk): keep meeting transcript options implicit
* fix(meetings): satisfy transcript bridge typecheck
* fix(google-meet): preserve optional caption policy context
* fix(google-meet): retain caption mode callback type
* refactor(meetings): split transcript lifecycle helpers
* chore(plugin-sdk): refresh split meeting runtime baseline
* refactor(google-meet): split session helpers
* fix(meetings): decouple transcript retries from leave
* fix(meetings): isolate provider subscribers
* fix(meetings): harden capture lifecycle
* fix(meetings): preserve capture during storage outages
* fix(meetings): preserve pending transcript ordering
* fix(meetings): retry capture initialization
* test(agents): reflect default transcript registration
2026-07-23 11:41:08 -07:00
Peter Steinberger
da0a9e1531
refactor(signal): adopt format capability profile ( #113120 )
2026-07-23 11:31:06 -07:00
Peter Steinberger
fefeff2b36
refactor(telegram): deduplicate polling session tests ( #113117 )
...
* test(telegram): deduplicate polling session scenarios
* test(telegram): type interleaving labels as tuples
2026-07-23 11:11:13 -07:00
Peter Steinberger
3e2b3ea4d5
feat(cron): database-backed heartbeat monitor scratch replaces HEARTBEAT.md ( #112967 )
...
* feat(cron): move heartbeat context into database-backed per-job cron scratch
- new additive cron_job_scratch SQLite table (revision tombstones keep
compare-and-swap monotonic across unset/recreate; 256KiB cap)
- heartbeat runner reads monitor scratch instead of workspace HEARTBEAT.md;
heartbeat_respond gains a private scratch replacement parameter
- openclaw doctor --fix migrates HEARTBEAT.md into scratch (hash-verified,
archived under state backups, idempotent, symlink-contained)
- gateway cron.scratch.get/set admin RPCs + openclaw cron scratch CLI
- workspace bootstrap no longer seeds HEARTBEAT.md; Codex heartbeat file
guidance removed; docs and prompt snapshots updated
* fix(cron): review round 2 — shared-workspace heartbeat migration and non-default agent monitors
- doctor migration groups agents by heartbeat source file and imports into
every monitor before archiving/removing the shared file once
- exempt heartbeat payloads from the main-session default-agent restriction:
monitors only poke the wake bus, so non-default agents converge again
- document why disabled monitors retain their last cadence (config default
already resolves before the fallback)
* fix(cron): honor configured cron store, legacy heartbeat fallback, and safer doctor claim
* fix(cron): claim HEARTBEAT.md before committing scratch and restore without clobbering
* fix(cron): pin migration CAS to precondition revision, re-verify claim on release, archive first, report scratch as pending
* docs(heartbeat): remove retired config options
* fix(cron): crash-recoverable migration claims, partial-import rollback, latest-response scratch pairing
* test(heartbeat): keep latest scratch proposal paired
* fix(cron): roll back committed scratch on changed-claim release and restore no-row state
* fix(cron): revision-guarded rollback delete and recreated-file detection on claim release
* fix(cron): treat every failed claim re-verification as a migration conflict
* test(heartbeat): rename ack test after ackMaxChars retirement
* fix(heartbeat): keep monitor scratch out of bypass-scope runs
* fix(cron): resolve claimed symlinks on release and gate legacy fallback on proven scratch state
* fix(cron): strict claim-name recovery and per-entry migration grouping
* fix(ci): heartbeat scratch gate repairs — lint causes, dead exports, since-train, inventory path, prompt snapshot, regenerated docs map, SDK baseline, protocol bindings
* fix(cron): live-owner claim guard and canonical entry-key migration grouping
* fix(cron): archive claimed inode on release and flag orphan claims beside recreated files
* docs(cron): document process-global state-db invariant for scratch service ops
* chore(i18n): refresh native inventory line numbers after protocol binding regen
2026-07-23 11:10:49 -07:00
Peter Steinberger
1c102d419f
refactor: unify Teams and QQ markdown rendering ( #113100 )
...
* refactor(channels): unify Teams and QQ markdown
* fix(channels): narrow markdown formatter types
* style(channels): satisfy markdown lint
* fix(channels): keep format profiles private
* fix(msteams): make raw table scan deterministic
2026-07-23 10:46:06 -07:00
Peter Steinberger
1f051da39d
refactor(browser): split Chrome MCP lifecycle ( #113114 )
2026-07-23 10:45:21 -07:00
Peter Steinberger
7e44ba6276
test(telegram): deduplicate bot creation scenarios ( #113102 )
...
* test(telegram): deduplicate bot creation scenarios
* test(telegram): satisfy bot fixture type checks
2026-07-23 10:12:44 -07:00
Jason (Json)
ee07bb8e66
fix(anthropic): keep adopted Claude CLI chats working after first turn ( #113078 )
...
* fix(anthropic): resume adopted Claude CLI chats
* fix(agents): limit CLI alias lookup to bound sessions
* refactor(agents): keep stored override normalization bounded
2026-07-23 11:07:38 -06:00
Peter Steinberger
3608baa853
test(codex): deduplicate run-attempt scenarios ( #113076 )
...
* test(codex): deduplicate run attempt scenarios
* test(codex): satisfy run-attempt lint
2026-07-23 09:27:44 -07:00
RileyJJY
f20e747c8f
fix(elevenlabs): reject blank realtime transcription keys ( #108916 )
...
* fix(elevenlabs): treat blank env API key as unconfigured in speech and transcription providers
* fix(elevenlabs): normalize realtime auth lookup
Co-authored-by: RileyJJY <0668000974@xydigit.com >
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-23 09:22:17 -07:00
Peter Steinberger
acd92f6a3d
chore(deps): refresh repository dependencies ( #112453 )
...
* build(deps): update QA broker dependency
* build(deps): refresh repository dependencies
* build(deps): reconcile rebased shrinkwraps
* test(plugins): remove stale loader test state
* test(deps): stabilize updated dependency coverage
* fix(swift): use caller-isolated TaskLocal overload
* build(deps): regenerate rebased shrinkwraps
* test(msteams): preserve DNS validation in fetch helper
* fix(deps): avoid vulnerable optional image stack
* test(deps): validate generated LRU override
* refactor(ui): extract chat resizable divider
* test(ui): update divider ownership path
* fix(matrix): retain restart-compatible SDK
* style(cron): format update test
2026-07-23 16:17:13 +00:00
Peter Steinberger
09672312c4
feat(gateway): incognito sessions for the web Control UI ( #113006 )
...
* feat(gateway): add web-only incognito sessions held in process memory
* feat(ui): add incognito toggle and badges to the web new-session flow
* fix(sessions): classify incognito by key shape, fail closed on stale keys, and gate memory writes
* fix(codex): start harness threads ephemeral for incognito sessions
* fix(sessions): reshape internal-effects incognito keys and add doctor repair for reserved key collisions
* refactor(plugin-sdk): export canonical incognito key classifier and guard the sentinel path
* fix(state): classify incognito DB handles from the recorded open-time set
* fix(gateway): isolate incognito sessions from durable lineage and allocation on read-only misses
* docs(sessions): pin the reserved incognito namespace ownership decision
* feat(gateway): admin-scope incognito visibility and incognito-blind cross-session surfaces
* fix(ci): repair kysely guardrails, dead export, docs map, protocol bindings, and ACP reset rotation
* fix(gateway): remove non-admin observability side channels for incognito sessions
* fix(gateway): enforce admin-scope incognito access and cover all parent-reference creation paths
2026-07-23 09:04:36 -07:00
Peter Steinberger
88963299e7
test(codex): deduplicate turn watch scenarios ( #113061 )
2026-07-23 09:03:05 -07:00
Peter Steinberger
12d7009f71
feat(google-meet): enable plugin by default ( #113053 )
...
* feat(google-meet): enable plugin by default
* docs(google-meet): preserve browser enable recovery
2026-07-23 07:34:32 -07:00
Peter Steinberger
8108b9637b
fix: preserve Discord bold and Mattermost tables ( #113037 )
...
* refactor(channels): unify Discord and Mattermost markdown
* build(discord): refresh shrinkwrap
* refactor(discord): split markdown formatter
2026-07-23 06:42:22 -07:00
Peter Steinberger
ad505a7b55
fix(swarm): keep collector results reliable through races and restarts ( #112989 )
...
* fix(swarm): harden collector lifecycle and dashboards
* fix(swarm): initialize collector completion state
* test(swarm): satisfy cross-environment type checks
* test(codex): allow direct request handler calls
* style(ui): avoid Swarm widget shadowing
* test(swarm): keep internal helpers private
* refactor(ui): own Swarm roster helpers in runtime
2026-07-23 06:26:31 -07:00
Peter Steinberger
09f5f2d305
fix(googlechat): render outbound markdown for Chat ( #113024 )
...
* fix(googlechat): render outbound markdown dialect
* fix(googlechat): type rendered chunks
* fix(googlechat): satisfy renderer checks
2026-07-23 06:25:20 -07:00
Peter Steinberger
41404f669a
feat: enable Teams and Zoom meeting plugins by default ( #113022 )
...
* feat(plugins): enable meeting plugins by default
* docs: refresh meeting plugin map
2026-07-23 06:18:37 -07:00
Peter Steinberger
245795ce64
fix(whatsapp): unify outbound markdown rendering ( #113010 )
2026-07-23 08:54:28 -04:00
Peter Steinberger
525a7f4c96
ci(release): restore full validation after config migrations ( #112740 )
...
* fix(browser): preserve scoped CDP authority policy
* test(release): migrate canonical config fixtures
* ci(release): repair acceptance harness drift
* ci(release): extend Anthropic setup budget
* test(release): align remaining CI contracts
* test(release): align Docker and QA contract tests
* docs(release): preserve validation evidence inputs
* test(plugins): align unprepared metadata reads
* ci(release): separate QA live suite filters
* test(release): bind cron MCP cleanup device
2026-07-23 08:46:55 -04:00
Peter Steinberger
d124fb235f
refactor(meetings): share plugin entry registration ( #113007 )
2026-07-23 07:18:38 -04:00
Peter Steinberger
852548ce05
feat(onboard): stage migration imports before promotion ( #112798 )
...
* feat(onboard): stage migration imports before promotion
* fix(onboard): harden migration recovery
* fix(onboard): commit promoted config with CAS
* fix(onboard): resume setup after migration recovery
* test(onboard): split noninteractive migration coverage
* refactor(onboard): split migration promotion helpers
* fix(onboard): normalize migration preparation cleanup
* fix(onboard): preserve recovered inference ownership
* fix(codex): complete empty deferred plugin config
* fix(codex): reconcile deferred plugin config retries
* fix(onboard): resolve verification target after rebase
* refactor(onboard): trim retired migration exports
* test(onboard): assert read-only auth prompt store
2026-07-23 07:06:01 -04:00
Peter Steinberger
9ffebcadea
fix(telegram): preserve valid tg-time markup ( #112911 )
2026-07-23 07:00:00 -04:00
Peter Steinberger
9a3a5ae818
refactor(markdown): formalize channel profiles ( #113002 )
2026-07-23 06:16:06 -04:00
Peter Steinberger
9f13f9b140
feat(openai): make million-token context an explicit opt-in ( #112916 )
...
* feat(openai): add safe long-context opt-in
* fix(ci): keep long-context checks within gates
* fix(ci): keep Codex usage helpers internal
2026-07-23 05:34:54 -04:00
Peter Steinberger
82ac110479
refactor(meetings): share runtime probes and node wrappers ( #112992 )
2026-07-23 05:28:46 -04:00
Peter Steinberger
1781e2e8f7
test(discord): table-drive voice manager scenarios ( #112977 )
...
* test(discord): table-drive voice manager scenarios
* test(discord): classify voice fixtures as test support
2026-07-23 04:55:27 -04:00
Peter Steinberger
6522ce37d9
fix(release): unblock Telegram QA and Copilot media proof ( #112972 )
...
* fix(release): build Telegram candidate with private QA
* fix(copilot): preserve offloaded prompt images
2026-07-23 04:43:53 -04:00
Peter Steinberger
6bfdc9e474
refactor(meetings): share Teams and Zoom Chrome transport ( #112931 )
...
* refactor(meetings): share Chrome transport
* refactor(meetings): split platform adapter contract
* refactor(meetings): remove stale contract re-exports
* test(meetings): import adapter contract types
2026-07-23 04:27:48 -04:00
Jason (Json)
93c48a6adb
fix: steer active Codex tasks from the Control UI ( #112858 )
...
* fix(codex): enable transcript-backed active steering
* test(codex): keep persistent fixture tool policy
* test(codex): type mock tool capability
* test(codex): scope persistent policy fixtures
* chore: refresh PR CI base
* test(codex): stabilize persistent run fixtures
* test(codex): preserve lifecycle cached-search baseline
2026-07-23 01:59:50 -06:00
Peter Steinberger
9b050232a1
feat(tlon): render Markdown lists as native listings ( #112968 )
...
* feat(tlon): render markdown lists natively
* fix(tlon): preserve unsupported loose lists
2026-07-23 03:48:48 -04:00
Peter Steinberger
a229456f48
feat(agents): relay Claude native tool requests as Gateway approvals ( #112918 )
...
* feat(agents): relay Claude native tool requests as Gateway approvals
* fix(agents): keep approval relay types local and refresh docs map
2026-07-23 03:21:08 -04:00
Jason (Json)
307b3060a9
fix: hide memory maintenance turns from chat ( #112942 )
...
* fix: hide memory maintenance turns from chat
* chore: update plugin SDK API baseline
* chore: account for harness visibility export
2026-07-23 01:02:27 -06:00
Peter Steinberger
bac2bbd243
refactor(google-meet): split CLI modules ( #112937 )
...
* refactor(google-meet): split CLI modules
* test(google-meet): align CLI split routing
* refactor(google-meet): isolate CLI command contract
2026-07-23 03:00:34 -04:00
Peter Steinberger
cca67fc842
fix(meetings): verify talk-back loopback signal ( #112939 )
...
* fix(meetings): verify talk-back loopback signal
* refactor(meetings): keep verification helper private
* fix(meetings): type loopback buffers generically
* fix(meetings): bound loopback reference buffers
* fix(meetings): align loopback proof with playback
* chore(meetings): defer release note ownership
* fix(meetings): keep loopback health type private
2026-07-23 02:32:24 -04:00
Peter Steinberger
d893f79ccc
fix(matrix): preserve encryption keys across snapshot upgrades ( #112919 )
...
* fix(matrix): migrate legacy crypto snapshots via doctor
* fix(matrix): harden snapshot migration failures
* fix(matrix): preserve unreadable crypto snapshots
* test(matrix): consolidate crypto snapshot coverage
2026-07-23 02:25:52 -04:00
Peter Steinberger
282ddaf96b
refactor(line): preserve formatting in flex messages ( #112921 )
2026-07-23 02:17:35 -04:00
Peter Steinberger
b67217ffab
fix(channels): stop leaking markdown on plain-text transports ( #112926 )
...
* fix(channels): unify plain-text markdown projection
* fix(synology-chat): satisfy link formatter lint
* test(ui): repair sidebar catalog activity fixture
2026-07-23 02:13:55 -04:00
RileyJJY
4ff11a84e4
fix(ollama): release reader lock when parseNdjsonStream exits early ( #111641 )
...
* fix(ollama): release reader lock when parseNdjsonStream exits early
* test(ollama): prove real stream lock cleanup
Co-authored-by: RileyJJY <0668000974@xydigit.com >
* style(ollama): format stream cleanup tests
Co-authored-by: RileyJJY <0668000974@xydigit.com >
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-23 02:03:04 -04:00
Peter Steinberger
a12fba422c
test(active-memory): consolidate recall fixtures ( #112881 )
2026-07-23 01:50:37 -04:00
Peter Steinberger
6c49cae2bc
test(feishu): consolidate bot fixtures ( #112884 )
2026-07-23 01:49:49 -04:00
Peter Steinberger
9735945083
refactor(markdown): share attributed range rendering ( #112907 )
2026-07-23 01:41:56 -04:00
Peter Steinberger
5cc1e6be62
test(memory): consolidate qmd manager fixtures ( #112885 )
2026-07-23 01:33:58 -04:00