Commit Graph

4860 Commits

Author SHA1 Message Date
Peter Steinberger 572e9f907a fix(skills): expand explicit references on agent turns (#124784)
* fix(skills): expand explicit references on agent turns

Route generic Gateway, CLI, webhook, and local agent turns through the same explicit skill-reference renderer as channel auto-replies. Keep original transcript text, preserve unknown slash behavior, and fail visibly for allowlist-hidden skills.

Maintainer review: scoped Option 1 — generic agent turns expand both $skill-name and leading /skill-name args through shared skill rendering; they do not run the channel command dispatcher, and all other slash commands retain their existing behavior.

* fix(skills): bound explicit reference prompts

* fix(skills): prefer allowed reference collisions

* fix(skills): preserve command invocation boundaries

* fix(skills): reject hidden channel slash commands

* perf(skills): skip literal dollar discovery
2026-08-16 16:09:21 -07:00
Peter Steinberger 9b468ccaa2 test: replace assertion chains with typed fixture builders — wave 2 (#124865) 2026-08-16 15:36:45 -07:00
Peter Steinberger efdfb69adc fix(agents): keep queued followups from missing post-compaction context (#124850)
* fix(auto-reply): order post-compaction context before followups

Amp-Thread-ID: https://ampcode.com/threads/T-01a00b6b-e4e9-74af-bb31-30363fae6c89

* test(auto-reply): clean compaction workspace fixture

Amp-Thread-ID: https://ampcode.com/threads/T-01a00b6b-e4e9-74af-bb31-30363fae6c89

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-16 15:06:39 -07:00
Peter Steinberger 86cfcd3833 fix(delivery): unify terminal settlement ownership (#124825)
* fix(delivery): unify terminal settlement ownership

Treat identityless adapter returns as potentially visible across channel, queue, and cron paths. Let recovery own terminal completion so ambiguity persists as notice debt instead of being double-settled or silently suppressed.

Co-authored-by: ruel225 <ruel225@users.noreply.github.com>

* refactor(delivery): narrow terminal internals

Remove now-unused internal exports after terminal-settlement ownership was consolidated.

* test(tts): preserve message runtime exports

Import and spread the actual message runtime so the focused mock retains every runtime binding while overriding only the durable send core.

---------

Co-authored-by: ruel225 <ruel225@users.noreply.github.com>
2026-08-16 14:28:26 -07:00
Peter Steinberger 2f98eeabfd feat(auto-reply): record message-tool mute outcomes (#124830)
* feat(auto-reply): record message-tool mute outcomes

* fix(auto-reply): require source delivery evidence

* test(infra): preserve historical agent schema fixtures
2026-08-16 14:26:20 -07:00
Peter Steinberger 32f056f011 refactor(agents): persist directive facts at the assistant write boundary (#124793)
* refactor(agents): persist directive facts at the assistant write boundary

Assistant final text is now stripped of inline delivery directives once, at
the SessionManager append boundary, with the parsed facts persisted as a
typed openclawDelivery field on the assistant message (openclawDeliveryMirror
precedent, inside event_json — no schema change). Live session state is
replaced with the persisted canonical bytes so same-run continuations and
next-turn store rebuilds never diverge (prompt-cache invariant).

Delivery and restart recovery consume the stored facts instead of re-parsing
persisted text; pre-upgrade in-flight messages without facts intentionally get
no text-parse fallback (commented tradeoff at the read site). Directive
parsing is now code-region aware, so markers quoted in inline code or fences
neither parse nor strip — fixes the empty-code-pill display bug.

The undocumented reaction marker DSL ([[react:]], [[react_to_current:]]) is
deleted; structured message-tool reactions remain the canonical path. Stale
assertion-safety baseline entry removed with the parser.

Production net -10, tests net +38. Focused suites: 9,068 passed; pre-fix
regressions fail for the intended reasons. Codex autoreview clean.

* fix(agents): satisfy directive persistence gates

* fix(config): drop unused directive export

* fix(agents): preserve indented directive examples
2026-08-16 13:44:11 -07:00
Peter Steinberger 541f373bc0 refactor(validation): type producers and drop internal re-validation — pilot lane C (#124808) 2026-08-16 13:38:17 -07:00
Peter Steinberger 4667d188f2 fix(codex): honor session node exec host (#124777) 2026-08-16 12:41:48 -07:00
Peter Steinberger 568b920b21 feat(lint): enforce import ordering and deduplication (#124730)
* refactor(imports): dedupe and hoist imports

* feat(lint): enforce import/no-duplicates and import/first
2026-08-16 11:44:52 -07:00
Peter Steinberger 98805b8584 fix(auto-reply): reject redeliveries without recreating drained queues (#124723)
enqueueFollowupRun called getFollowupQueue (which inserts into the
process-global FOLLOWUP_QUEUES registry) before the recent-message-id
dedupe peek. A provider redelivery arriving after the original queue
drained and self-deleted recreated the registry entry, was rejected by
the peek, and left an empty FollowupQueueState (AbortController, arrays,
WeakSets) in the map forever — registry entries are only deleted when a
drain finishes, and a queue with no items never drains. Long-lived
gateways leaked one state object per redelivered session key.

Root cause: mutation-before-validation ordering. The dedupe key
derivation does not need the queue, so the peek now runs first and the
registry entry is only created for admitted work.

Regression: new dedupe test drains a queue to self-deletion, replays the
message, and asserts no registry entry reappears — fails pre-fix.
2026-08-16 11:15:22 -07:00
Peter Steinberger 715c379fd9 refactor(config): consolidate context budget to one per-model knob (#124665)
* refactor(config): consolidate context budget settings

* test(config): type legacy context fixtures

* test(config): align context budget fixtures

* fix(status): honor runtime context discovery

* docs(config): clarify context budget fallbacks

* fix(ci): resolve context budget lint failures

* test(ci): align context budget shard fixtures

* fix(models): preserve catalog context metadata

* fix(config): surface context migration diagnostics

* test(plugin-sdk): keep live catalog coverage focused
2026-08-16 10:05:01 -07:00
Peter Steinberger 2aab6b8e37 refactor(reply): unify keyed FIFO leases (#124690)
Share one lifecycle-owned reservation primitive between reply admission and foreground delivery ordering, and remove the obsolete admission-wait callback plumbing.
2026-08-16 10:03:29 -07:00
Peter Steinberger 6a82431494 refactor: replace runtime mock seams with injection (#124634) 2026-08-16 07:33:13 -07:00
Peter Steinberger 19bcb23ba1 fix: preserve reply order across overlapping turns (#124623)
Deliver same-target channel replies in inbound order while keeping steer admission concurrent. Record accepted steer/followup ownership so intentional deferred turns do not look silently empty.

Fixes #124618
2026-08-16 07:17:53 -07:00
SunnyShu 16cde04136 fix(agents): allow required-preflight native Codex compaction (#120197)
* fix(agents): allow required-preflight native Codex compaction

Required reply-preflight compaction on a Codex app-server-backed session
returns the intentional `ok: true, compacted: false` "codex app-server owns
automatic compaction" no-op because the preflight caller never passes
`allowNonManualNativeRequest`. The reply/preflight path then misclassifies
that successful skip as a failure and throws, dropping the user's turn with
"Context is too large and auto-compaction could not recover this turn." The
equivalent CLI path was fixed by #88207; this is the second, unpatched caller.

Route required-preflight through the existing private
`compactAfterContextEngine` harness capability (which already passes
`allowNonManualNativeRequest: true`) by adding a typed
`nativeCompactionRequest: "required_preflight" | "after_context_engine"`
origin on `maybeCompactAgentHarnessSession` and the Codex compact bridge.
The non-manual skip guard is bypassed for preflight, so Codex actually
compacts the thread.

A binding change between the initial read and the native request is a
stale-binding race, not a benign skip. For `required_preflight` (and the
non-manual CLI path) it now surfaces as the canonical recoverable
`stale_thread_binding` failure so the queued harness falls back to the
context engine instead of treating an uncompacted `ok: true` result as a
completed turn. A genuine post-context-engine request may still skip,
because the context engine has already compacted. Required-preflight is also
the one scoped exception to the model-locked terminal rule: missing or stale
Codex thread bindings recover via the shared context-engine fallback while
the persisted harness lock stays intact; other locked failures remain
terminal.

Rebased onto main after #120740 restructured the guarded native compaction
block; the recoverable-binding semantics are reintroduced on the new
structure and scoped by `nativeCompactionRequest` so #120740's
post-context-engine skip behavior is preserved.

Closes #119971.

* test(evidence): commit inspectable required-preflight live proof scripts for #119971

Adds the two live codex app-server proof scripts (binding-race +
locked-preflight) so the redacted terminal traces in the PR body are
inspectable on the exact head. Both drive the real codex binary and real
maybeCompactCodexAppServerSession with nativeCompactionRequest:
"required_preflight"; neither runs in CI (no codex binary).

* fix(agents): scope locked-preflight compaction fallback to Codex

Restrict the required-preflight model-lock exception to the Codex harness
so missing/stale thread bindings in other locked native harnesses (e.g.
Copilot) stay terminal instead of escaping the persisted model-lock
boundary via context-engine fallback. Add a model-locked Copilot
required-preflight regression covering both missing and stale thread
bindings.

* fix(codex): require native preflight compaction

* chore(plugin-sdk): account for native compaction exports

* test(codex): use complete cron authority fixtures

* chore(lint): shrink compaction assertion baseline

* fix(lint): honor root boundary timeout

* fix(lint): extend package boundary timeout

* fix(plugins): verify native compaction owner

---------

Co-authored-by: fuller-stack-dev <263060202+fuller-stack-dev@users.noreply.github.com>
2026-08-16 08:00:38 -06:00
Peter Steinberger 147fa7e4c3 fix(auto-reply): fully read startup context files (#124597) 2026-08-16 06:40:36 -07:00
Peter Steinberger f43544f752 refactor: remove vestigial runtime indirection (#124554)
* refactor: remove vestigial indirection

* test: update Slack runtime API guard
2026-08-16 05:31:36 -07:00
Peter Steinberger d86593fa28 fix(gateway): prevent sustained-turn readiness stalls (#124528)
* perf(gateway): reuse prepared plugin generations

* fix(agents): break prepared runtime import cycle

* chore: keep release notes in PR body

* test(agents): preserve plugin snapshot mock exports

* test(agents): consolidate plugin generation coverage
2026-08-16 04:20:46 -07:00
Nehorai Hadad 7d05f7c5b9 fix(auto-reply): suppress fallback notices in rooms (#107209)
Hide model fallback and recovery notices in group and channel conversations while preserving direct-chat notices, persisted state, and lifecycle events.

Co-authored-by: NehoraiHadad <nehorai.hadad.projects@gmail.com>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-16 12:14:25 +05:30
Peter Steinberger 6aa27d6ecd refactor: retire August compat windows (embedding API, pi aliases, target parser, spawning hook, setup exports, WhatsApp inbound aliases) (#124416)
* refactor(plugin-sdk): retire embedded Pi aliases

* refactor(channels): retire explicit target compatibility

* refactor(plugins): retire subagent spawning hook

* refactor(plugin-sdk): retire shipped channel setup exports

* refactor(whatsapp): retire inbound callback aliases

Proof: focused build and WhatsApp E2E green; broad WhatsApp suite 188/189 files green. extensions/whatsapp/src/monitor-inbox.policy.test.ts flakes only in the parallel batch and passes isolated (10/10).

* refactor(plugin-sdk): retire memory embedding registrar

Migrate every bundled provider and manifest to registerEmbeddingProvider and contracts.embeddingProviders. Preserve memory-specific batching, local-service acquisition, index identity, and auto-selection through the canonical generic registry adapter, then remove the parallel registrar, registry, diagnostics, contracts, tests, and docs.

* chore(plugin-sdk): tighten retired surface budgets

Pin the post-retirement public SDK surface to 144 entrypoints, 4,312 exports, 2,564 callable exports, and 1,133 deprecated exports; agent-harness-runtime now permits exactly nine deprecated exports.
2026-08-15 22:43:47 -07:00
Eden a61417fef4 fix(mentions): match decorated identity names (#115278)
Allow group members to type an agent name without optional emoji or symbol decoration while preserving literal separators and Unicode boundaries. Bound raw joiner matching and replay QA startup patches in order.

Co-authored-by: 許元豪 <146086744+edenfunf@users.noreply.github.com>
Co-authored-by: Eden <146086744+edenfunf@users.noreply.github.com>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-16 11:09:03 +05:30
Peter Steinberger 8cf85e3ced fix: restore release-validation fixture coverage (#124401)
* test(release): refresh validation fixtures

* test(release): satisfy fixture lint gates

* test(release): preserve fixture owner contracts
2026-08-15 22:15:09 -07:00
Vito Cappello 9474e55076 fix: consume prepared images once in CLI-backed turns (#120721)
* fix(agents): preserve images across CLI dispatch

* test(agents): format CLI dispatch coverage

* fix(reply): consume prepared images once

* test: cover CLI inbound image reply path

* fix(auto-reply): preserve prepared image state

* fix(auto-reply): preserve queued image fallback

* fix(agents): keep CLI image marker internal

* fix(agents): keep image admission marker private

* fix(agents): preserve internal image admission state

* fix(auto-reply): keep image admission marker internal

* test: keep image preparation marker internal

* fix(cli): preserve queued image metadata

* test(cli): cover filtered media image indexes

* test: restore media fixture cleanup

* test: align filtered media fixture with resolver mock

* style: format CLI image forwarding changes

* fix(auto-reply): preserve queued media slot type

* fix(auto-reply): avoid spread in media slot mapping

---------

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
Co-authored-by: Patrick Erichsen <patrick.a.erichsen@gmail.com>
2026-08-15 20:49:08 -07:00
Peter Steinberger a6cb2fbc9f fix(agents): preserve context engine session ownership (#124376)
* fix(agents): preserve context engine session ownership

Unbound legacy context-engine hooks no longer execute LLM calls under the default agent. Explicit, agent-scoped, main-alias, and persisted session ownership remain supported.

* test(ci): avoid scheduler pid file race
2026-08-15 20:42:26 -07:00
wuqxuan 276e5579a4 fix(heartbeat): require explicit message targets (#103711)
Reject targetless proactive message-tool calls during heartbeat runs before mutation tracking, while preserving automatic owner/last heartbeat delivery and explicit plugin-alias recipients.

Co-authored-by: wuqxuan <wuqxuan@users.noreply.github.com>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-16 09:06:43 +05:30
Pavan Kumar Gondhi 8668aeb969 fix(discord): bind transcript capture to source account [AI] (#118579)
* fix(discord): bind transcript capture to source account

* style(agents): keep transcript tool wiring compact

* fix(transcripts): declare account binding channels

* fix(transcripts): report effective capture account

* fix(transcripts): enforce account lifecycle ownership

* fix(transcripts): preserve cross-surface control

* fix(copilot): preserve transcript channel context

* fix(transcripts): fail closed for legacy channel owners

* fix(transcripts): add trusted legacy recovery

* fix(transcripts): preserve auto-start cleanup ownership

* fix(transcripts): reject untrusted account starts

* fix(transcripts): keep persisted ownership authoritative

* fix(transcripts): harden legacy recovery

* fix(transcripts): preserve agent ownership boundary

* fix(transcripts): scope account binding to source channel

* fix(transcripts): preserve unattributed owner isolation

* fix(transcripts): own configured captures by account

* docs(plugins): clarify transcript auto-start ownership

* test(transcripts): cover account-less recovery

* docs(transcripts): scope legacy recovery by provider

* fix(discord): reuse eligible account ordering for transcripts

* test(discord): use neutral transcript account fixtures

* fix(transcripts): keep accountless recovery local

* fix(discord): resolve transcript accounts by voice capability

* fix(transcripts): bound account resolution failures

* fix(transcripts): bound account tool output

* fix(transcripts): honor unresolved provider accounts

* fix(transcripts): preserve binding when providers are missing

* fix(transcripts): fail closed on unknown binding provenance

* fix(transcripts): qualify account lifecycle capability

* fix(transcripts): normalize provable legacy owners

* fix(transcripts): bind scheduled capture to caller authority

* fix(transcripts): preserve scheduled caller identity tuple

* fix(transcripts): preserve channel-less scheduled authority

* fix(plugin-sdk): publish transcript provider types

* fix(transcripts): use exact lifecycle ownership tokens

* fix(transcripts): preserve local ownerless lifecycle access

* fix(transcripts): allow local configured capture control

* fix(transcripts): preserve scheduled caller channel

* fix(transcripts): retain named-agent legacy recovery

* fix(transcripts): deny unrelated remote channels

* fix(doctor): validate transcript owner inference

* fix(transcripts): restrict legacy remote recovery

* fix(ci): align transcript Doctor checks

* fix(transcripts): require Doctor-owned legacy metadata

* fix(transcripts): reject unowned remote capture starts

* fix(transcripts): reject unbound Discord lifecycle calls

* fix(transcripts): distinguish legacy owner rows

* test(discord): keep unavailable account fixture typed

* fix(transcripts): mark current imports for Doctor

* fix(transcripts): complete account ownership validation

* fix(discord): restore transcript package boundary

* fix(discord): preserve bundled transcript entry boundary

* docs(transcripts): clarify Discord auto-start account

* fix(transcripts): bind account-owned imports

* fix: preserve transcript and cron policy state

* fix(cron): preserve scheduled transcript authority

* fix(discord): keep legacy transcript rows local

* fix(transcripts): narrow account ownership boundary

* fix(transcripts): preserve trusted caller ownership

* fix(discord): enforce transcript source authorization

* fix(ci): bound Control UI gzip build variance

* test(qa): align transcript scenario contracts

* fix(agents): repair rebased caller context

* fix(discord): restore rebased account ownership

* test(discord): restore voice account fixtures

---------

Co-authored-by: joshavant <830519+joshavant@users.noreply.github.com>
2026-08-15 12:10:43 -07:00
Sascha Kuhlmann 987c73e793 fix(auto-reply): surface empty message-tool-only completions (#105765)
Ensure empty message-tool-only completions receive one marked fallback while preserving explicit silence and completed deliveries.

Co-authored-by: Sascha Kuhlmann <coolmanns@users.noreply.github.com>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-15 18:51:29 +05:30
Ayaan Zaidi 0134c781cd fix(agents): deliver Codex input choices in Telegram and web chat (#124146)
Mark harness-owned input prompts for source-suppression delivery so Codex choices and secret prompts reach the originating chat during message-tool-only turns.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-15 17:12:14 +05:30
Ayaan Zaidi f7b809933d fix(auto-reply): reject undelivered ask_user prompts (#124148)
Do not leave invisible ask_user prompts armed to consume later messages.

Reject only delivery outcomes proven invisible; preserve ambiguous post-transport failures and untracked dispatcher behavior.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-15 16:48:22 +05:30
Jason (Json) 30216f52fa fix(sessions): scope transcript fuse to reset window (#124126) 2026-08-15 03:23:41 -06:00
Peter Steinberger f1ced37ce5 refactor(config): delete dead compat surfaces and write-only error payload (#124067)
* refactor(config): delete dead compat surfaces and write-only error payload

Round-5 config-lane sweep; all three deletions verified against the strict
root schema and current consumers.

- ConfigMutationConflictError.currentHash was write-only: ~20 throw sites
  computed hashes (some hashing whole files on the failure path purely to
  populate it) and no consumer anywhere read it — responses carry only the
  message and .retryable. Field deleted, feeder expressions collapsed.
- Root-level channel-key fallbacks (cfg[provider] beside cfg.channels[...])
  in chunk limits, block streaming, and channel capabilities were unreachable:
  the root schema is z.strictObject, so a validated config cannot carry
  top-level channel keys; doctor owns those moves. Pre-strict-schema era
  leftovers, deleted.
- resolveHeartbeatAckMaxChars existed as three identical constant-returning
  stubs (heartbeat-runner-config, server-chat, get-reply) left over from the
  retired heartbeat.ackMaxChars key; inlined the constant, deleted the stubs.
- mergeScopedSearchConfig's legacy web-search key delete was a no-op — the
  agent-runtime schema rejects those keys at validation; helper and dead
  branch deleted (the schema-side Set remains the rejection boundary).

* fix(web-search): restore retired-provider strip in runtime scoped merge

The legacy-key delete in mergeScopedSearchConfig is runtime behavior, not
schema-shadowed dead code: the merge input is runtime-merged state, so
retired provider objects must still be stripped when no plugin config
exists (proven by the existing web-search.test.ts regression).
2026-08-15 01:17:31 -07:00
Peter Steinberger f4871eb86b refactor(types): remove chained assertions in runtime boundaries (#124082) 2026-08-15 01:03:26 -07:00
Peter Steinberger 2adbdd75c6 fix(gateway): preserve managed media lifecycle outcomes (#124048) 2026-08-14 23:35:23 -07:00
ClawSweeper c12745429a fix(ui): fork active sessions from stable history (#123718)
* fix(ui): fork active sessions from stable history

* fix(protocol): align active fork types

* test(ui): match main-session fork routing

* fix(sessions): unify stable fork admission

* fix(native): fork active sessions from stable history

* fix(android): fork active sessions from stable history

* style(android): simplify active fork result handling

* fix(native): preserve legacy fork transport API

* test(native): complete legacy fork transport stub

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-14 14:13:25 -07:00
Peter Steinberger 44fe1b15a3 test: trim compact command leftovers (#123810) 2026-08-14 13:29:00 -07:00
Peter Steinberger 0cd18e1fb9 test: split compact command lifecycle coverage (#123765) 2026-08-14 10:43:29 -07:00
ClawSweeper e03d1a42f8 improve(ui): collapse limited access notice (#123735)
* improve(ui): collapse limited access notice

* test(ui): follow limited access banner host

* test(ui): await limited access guidance host

* test(compaction): split context budget coverage

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-14 10:25:28 -07:00
Peter Steinberger 8885be4756 fix(codex): refresh session meters after /codex compact (#123640)
* fix(codex): route compact through session pipeline

Route /codex compact through host-owned manual compaction so native completion and token snapshots update session meters, and report the terminal outcome to the user.

* test(codex): cover unavailable compact outcome

* fix(plugins): fence command compaction capability

Bind compactCurrent to one command invocation and captured session generation so retained or stale callbacks fail closed without running compaction.

* fix(plugins): lazy-load command session revalidation

Keep compaction session freshness checks at the auto-reply owner without pulling the session accessor into generic plugin command module initialization.

* fix(plugins): keep session revalidation lazy

Avoid loading the session accessor through generic plugin command initialization while preserving pre-compaction session-generation checks.

* fix(compaction): fence session lifecycle admission

Revalidate the exact session id and lifecycle revision immediately before native compaction and again before accounting so resets and rebinds fail closed across awaited work.

* fix(commands): fence plugin compaction authority

* fix(compaction): require accounting commit

* test(compaction): keep regression under lint cap

* fix(codex): preserve compact admission

* fix(codex): preserve compaction target identity

* fix(compaction): bind admitted target

* fix(compaction): fence accounting commit
2026-08-14 09:47:43 -07:00
Vito Cappello f5c46de8ac fix(compaction): allow Claude CLI sessions to compact without API keys (#120496)
* fix(compaction): route manual CLI compaction natively

* fix(compaction): harden native CLI control operations

* fix(compaction): honor Claude native completion signals

* chore(plugin-sdk): refresh API baseline

* test(compaction): assert native session binding

* fix(compaction): preserve control session reuse

* fix(plugin-sdk): preserve boolean compaction ownership

* fix(agents): preserve native compaction ownership

* fix(compaction): bypass model auth for native control

* test(compaction): isolate authless control fixture

* test(compaction): isolate auth bypass regression

* fix(compaction): bypass generic auth for native CLI control

* fix(compaction): preserve native rejection failover

* test(compaction): isolate native queue regressions

* test(compaction): prevent native auth mock leakage

* fix(cli): isolate control operations from skill env

---------

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
Co-authored-by: Patrick Erichsen <patrick.a.erichsen@gmail.com>
2026-08-14 09:30:15 -07:00
Peter Steinberger e74671df05 fix(plugins): surface setup-required install warnings (#123727) 2026-08-14 09:24:51 -07:00
Peter Steinberger 59533cb0fb test: remove latest direct test mirrors (#123704) 2026-08-14 08:41:24 -07:00
Peter Steinberger 530b33e4e3 fix: keep gateway control traffic responsive under concurrent turns (#123608)
* fix(gateway): preserve control-plane responsiveness under load

* fix(plugins): accept prepared readonly manifests

* refactor(plugins): prepare workspace ownership before metadata reuse

* chore: leave changelog updates to release flow

* fix(gateway): finish control-plane load repair

* perf(gateway): reuse prepared workspace root facts

* perf(gateway): coalesce workspace root preparation

* test(gateway): calibrate control-plane load bound
2026-08-14 07:16:58 -07:00
Dallin Romney 83d53044a4 fix(channels): route commentary through one progress owner (#121009)
* fix(slack): keep commentary progress on draft lane

* fix(channels): route commentary through one progress owner

Keep non-verbose commentary in Slack and Discord draft lanes while preserving one durable commentary payload when verbose progress makes those drafts yield. Freeze that owner decision for the turn so session changes apply on the next turn.

Co-authored-by: Dallin Romney <dallinromney@gmail.com>

Punchcard-Session: amber-workshop-workshop-36

* fix(channels): refresh queued commentary owner

Recompute the frozen draft-versus-durable commentary owner for every queued follow-up turn and carry that decision into final payload projection.

Punchcard-Session: amber-workshop-workshop-36

* fix(channels): clarify commentary owner opt-in

* fix(channels): preserve queued draft preambles

* fix(channels): require explicit queued progress ownership

* refactor(channels): record commentary progress owner

* fix(telegram): tolerate unscoped queued updates

* test(discord): use canonical draft fixture after rebase

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-08-14 22:15:53 +08:00
Peter Steinberger c3887db7c1 feat: compact xAI sessions server-side (AI-assisted) (#123622)
* feat: add xAI Responses compact endpoint

* docs: explain xAI server-side compaction

* refactor: persist server compaction via session manager

* refactor: simplify server compaction results

* fix: preserve server compaction result kind

* test: satisfy server compaction CI contracts

* fix(xai): prepare server compaction requests

* refactor(ai): extract prepared compaction request

* fix(xai): preserve compaction fallback semantics

* test(xai): use the stream function type owner

* fix(xai): enable compact endpoint for provider alias
2026-08-14 07:02:47 -07:00
Josh Avant 97a53a9b35 feat: audit admitted channel participant identity (#122863)
* feat: audit admitted channel participant identity

* fix: preserve Telegram identity through thread recovery

* fix: signal held gateway process groups

* fix: keep audit evidence passive in collect routing

* fix: validate copied channel participant evidence

* fix: bind channel participant evidence to host ingress

* fix: honor Telegram proof credential roles

* fix: restart held Telegram proof through gateway

* fix: repair channel identity CI regressions

* test(matrix): bind thread routing owner

* fix: preserve direct DM SDK compatibility

* fix: bind channel provenance at host runtime

* test(feishu): provide channel context builder

* fix: defer record-bound channel runtime resolution

* fix: keep channel admission evidence core-private

* fix(audit): bind channel admission to plugin lifecycle

* fix(audit): bind ingress provenance to final context

* refactor(audit): split admission scope keys

* test(queue): cover combined metadata carriers

* refactor(audit): keep lifecycle helpers private

* fix(queue): preserve combined turn authority

* test(channels): provide ingress context builders

* test(channels): align integrated CI fixtures

* test(clickclack): resolve model-loop ingress

* docs: preserve channel participant evidence invariant
2026-08-14 08:57:01 -05:00
Josh Lehman c23c188902 fix: explicit agent ownership no longer breaks system surfaces (#123339)
* fix: honor explicit agent ownership in system surfaces

* oc-000: fix explicit-owner runtime preparation
2026-08-14 06:52:21 -07:00
Ayaan Zaidi 7fcddedaaf fix(heartbeat): prevent replies disappearing during active heartbeats (#123458)
* fix(heartbeat): prioritize visible turns over active runs

* fix(heartbeat): preserve embedded run ownership

* fix(heartbeat): drain preempted run ownership

* test(heartbeat): cover retained preemption work

* fix(heartbeat): retain work across visible preemption

* fix(heartbeat): fence finalizing supersession
2026-08-14 17:51:05 +05:30
Ayaan Zaidi e826501fdb fix(telegram): resolve native command names from the loaded registry only (#123607)
Telegram native-command registration resolved provider names through the bundled channel-plugin fallback, which jiti-transpiles the entire plugin plus core graph from source when no registry entry is loaded (~190s silent CPU) — tripping the 300s no-output CI watchdog on the two Telegram test files that register at module scope. Telegram defines no resolveNativeCommandName hook, so the load resolved nothing. Thread the existing includeBundledChannelFallback option through the spec-listing helpers and use loaded-registry-only lookups in the Telegram plugin, matching the Discord sibling. Runtime names are byte-identical; both files drop from 200s to ~5s.
2026-08-14 10:47:20 +00:00
Peter Steinberger 7aac8ee04b fix: preserve device sessions while runner is offline (#123477)
* fix(runners): recover offline device placements

* test(runners): model reclaimed launch dispatch

* ci: serialize macOS Swift test retries

* test: wait for steering subscription readiness

* fix(gateway): restore authority-safe steering

* test(gateway): align authority projector fixture

* fix(gateway): dispatch leaf authority mismatches

* refactor: keep authority overlay contract leaf-only

* test(ui): close place popover before details
2026-08-14 03:31:19 -07:00
Peter Steinberger 37c9a30f58 fix: stabilize steering tests and skill reconciliation (#123553)
* test: align steering fixtures with session owner

* test: wait for steering subscription readiness

* fix(skills): serialize proposal reconciliation

* test: cover skill proposal lease contention

* test: split skill workshop list coverage
2026-08-14 02:37:14 -07:00