100 Commits
Author SHA1 Message Date
Ayaan Zaidi 19b5e564d7 fix(channels): clear type-aware lint debt and re-measure the drain seam after the split 2026-07-17 10:12:54 +05:30
Ayaan Zaidi 84c8b23835 refactor(channels): drop ingress exports orphaned by the whatsapp split 2026-07-17 10:12:54 +05:30
Ayaan Zaidi 08db31f7fa test(telegram): relocate non-fence dispatch coverage
Lifecycle invariants move to core contract tests; relocated dispatch suites
keep draft finalization, status reactions, and pipeline-init cleanup coverage
without fence machinery, and polling/webhook suites assert core-drain
semantics (#108656).
2026-07-17 10:12:54 +05:30
Ayaan Zaidi 1126ffba7f test(telegram): prove drain-backed transport invariants
Transport proof for the migrated ingress path: offset-after-spool-ack,
webhook redelivery on write failure, update_id/lane mapping, and the
authorization-gated supersede suite including paired-DM, owner, topic-override
and other-bot-command cases (#108656).
2026-07-17 10:12:54 +05:30
Ayaan Zaidi f7786a16cf refactor(telegram): drive ingress through the core drain
Both transports now enqueue durably and pump the shared drain: polling keeps
offset-after-committed-enqueue, webhook keeps 200-after-spool-write. Deletes
the reply fence, private claim-owner, retry policy, and per-transport
claim/replay/watchdog loops. Dispatch outcomes propagate: failed-retryable
releases for replay instead of tombstoning. Supersede policy stays
Telegram-owned, authorization-gated with pairing-store and owner identities
via the same resolver as normal ingress; room_event ambient pending remains
supersedable by a later user turn (#108656).
2026-07-17 10:12:54 +05:30
Ayaan Zaidi 16c14e5bbf feat(channels): expose the turn-adoption lifecycle seam
Replace the bare onTurnAdopted callback and queuedFollowupLifecycle with one
turnAdoptionLifecycle surface (onSettled guaranteed via finally; adoption-loss
aborts queued steering turns without transcript replay), threaded through the
turn kernel and agent runner, exposed to plugins via
runtime.state.openChannelIngressDrain and the channel-outbound SDK barrel,
with surface budgets re-measured against the narrowed baselines (#108656).
2026-07-17 10:12:54 +05:30
Ayaan Zaidi fc6b9dad0b feat(channels): add the durable ingress drain engine
Core drain modules over the existing channel ingress queue: claim recovery
via process-instance liveness (no same-process claim stealing), per-lane
serialization, complete-at-adoption with bounded claim-token-fenced tombstone
retry that never surrenders ownership on failure, retry/dead-letter
disposition with attempt floor and age gate, claim-refresh heartbeat,
pre-adoption stall watchdog, typed IngressAdoptionLostError for late adoption
after guillotine/supersede, and predicate-gated pre-adoption supersede that
tombstones. Contract tests encode the lifecycle invariants relocated from the
Telegram spool machinery (#108656).
2026-07-17 10:12:54 +05:30
Ayaan Zaidi 8160bbdf2e fix(telegram): deliver rich-message authoring contract to every runtime via inbound formatting hints 2026-07-15 16:42:27 +05:30
Ayaan Zaidi fa3b1b08fc test(telegram): use allowlisted token placeholders in contract fixtures 2026-07-15 16:42:27 +05:30
Ayaan Zaidi 02a5ce6306 refactor(telegram): split rich block modules under lint budgets 2026-07-15 14:57:55 +05:30
Ayaan Zaidi 2b4c03cae8 fix(telegram): keep rich HTML islands intact on message-tool sends 2026-07-15 14:57:55 +05:30
Ayaan Zaidi 195e29343b feat(telegram): map agent HTML islands to typed rich blocks 2026-07-15 14:57:55 +05:30
Ayaan Zaidi e3bc0f326c feat(telegram): emit Bot API 10.2 rich message blocks 2026-07-15 14:57:55 +05:30
Ayaan Zaidi 8170bdb556 test(telegram): drop rich-HTML formatter tests superseded by blocks emitter 2026-07-15 14:57:55 +05:30
Ayaan Zaidi c214fc4bee fix(commands): require explicit owner authority 2026-07-14 17:49:20 +05:30
Ayaan Zaidi 7d99de8e32 refactor(mcp): split session runtime modules for the LOC ratchet
Mechanical: manager, combined facade, install path, lifecycle, config
loading, and resolver types move to focused modules; the runtime facade
re-exports its prior surface so importers are unchanged. Deletes dead
tools-barrel re-exports flagged by check-dependencies. No behavior
change.
2026-07-14 17:09:53 +05:30
Ayaan Zaidi 98a1535fa3 fix(mcp): regenerate plugin SDK baseline after rebase 2026-07-14 17:09:53 +05:30
Ayaan Zaidi e85616940e fix(mcp): register full resolved URL for log redaction
Path-borne session tokens leak verbatim through fetch/undici transport
error strings; exact-value registration of the whole resolved URL closes
the last credential egress surface.
2026-07-14 17:09:53 +05:30
Ayaan Zaidi 8b66fe773f feat(mcp): deliver requester-scoped MCP to shared-thread harnesses
Requester-scoped servers never enter harness-native MCP config: Codex
thread and CLI user-MCP projections partition them out (fail-closed,
static-partition fingerprints stay sender-independent so shared threads
never rotate). Codex delivers them as per-attempt dynamic tools through
a scoped-only runtime path on the same core manager, with a
session-stable advertised catalog so authed and unauthed senders share
one spec surface; unauthed calls get a clean not-connected tool error.
New SDK seam materializeRequesterScopedMcpToolsForHarnessRun lets any
future harness consume the same contract.
2026-07-14 17:09:53 +05:30
Ayaan Zaidi d50feceadb fix(mcp): address maintainer review of requester-scoped connections
Fail-closed app views for requester-scoped servers, tools.effective
fingerprint parity, declaration-order safe names, fail-closed duplicate
resolver registration, resolved-credential redaction registration,
per-session LRU cap on idle requester runtimes, combined-catalog re-merge
on part refresh, and SDK contract docs (timings, schema ownership).
2026-07-14 17:09:53 +05:30
Ayaan Zaidi 834561ad67 feat(mcp): resolve MCP server connections per trusted requester
Plugins can register api.registerMcpServerConnectionResolver({serverName,
resolve}) to bind an MCP server's transport (url/headers) to the trusted
sender of each message. Server identity stays static; only the connection
is per-requester. Runtimes are cached per (sessionId, channel, accountId,
senderId); runs without a trusted requester fail closed (cron, subagent,
heartbeat). Resolved credentials never enter fingerprints or logs. Static
servers keep the existing session-scoped lifecycle byte-for-byte.

Enables per-user hosted MCP sessions (e.g. per-user OAuth email/calendar)
in multi-sender channels like Slack.

Refs #106229
2026-07-14 17:09:53 +05:30
Ayaan Zaidi 319a796079 fix(gateway): never leave the restart admission fence closed without a restart
A failed, refused, superseded, or thrown restart emission could leave the
reversible restart-signal admission fence closed forever: concurrent emitters
could overwrite the live rollback lease with a dead stand-in, the fenced body
had no try/finally, and the outer catch swallowed errors precisely because the
stuck fence made isGatewayRestartDraining() true. The gateway then rejected
every new task with GatewayDrainingError - silently - until an operator
restarted the process.

beginGatewayRestartSignalAdmission now returns null instead of stand-in
leases (single fence owner), emitPreparedGatewayRestart reopens the fence on
every non-delivery path via try/finally while preserving it whenever a queued
SIGUSR1 is unconsumed, refused-signal cleanup force-clears orphaned fences,
and admission close/reopen transitions are logged with their reason. The
self-contained SQLite restart-intent persistence moves to restart-intent.ts
to keep restart.ts within the LOC ratchet.

Fixes #107322
2026-07-14 16:14:48 +05:30
Ayaan Zaidi 42bd094c12 chore(telegram): keep test-only spool constants module-local
The retention bound, claim lease default, and liveness options type were
exported only for tests, which fails the dead-export gate. Tests pin the
policy literals locally instead.

Refs #107246
2026-07-14 15:40:29 +05:30
Ayaan Zaidi c130ceb5e1 fix(telegram): accept delayed cross-lane spool replays exactly once
Telegram update ids are global across chats, but the update tracker rejected
any id at or below its single high-water mark. When one lane was delayed
while other lanes completed newer ids, the delayed durable-spool replay was
rejected as accepted-watermark and tombstoned without dispatch - silent
message loss. The tracker now rejects only restored-offset ids and exact ids
it already accepted, with the accepted-id set pruned at the persisted offset
plus a bounded retention window; the startup-only floor-replay special case
is deleted.

Refs #107246
2026-07-14 15:40:29 +05:30
Ayaan Zaidi f942734bb1 fix(telegram): bind spool claim liveness to process start identity
Spool claim owners now encode pid:starttime:uuid, and live-owner detection
requires the pid to exist with a matching process start time. Bare
process.kill(pid, 0) treated Linux thread IDs and recycled PIDs of the new
gateway as a live foreign owner, wedging a chat lane behind a dead claim for
the full 30-minute lease after a restart. Legacy pid:uuid and explicit-x
owners keep existence-only lease protection so rolling upgrades and
no-starttime platforms cannot double-dispatch a live worker's claim.

Refs #107246
2026-07-14 15:40:29 +05:30
Ayaan Zaidi 7cc40d9e46 fix(claude-cli): hold live turn open while native background subagents and workflows run 2026-07-13 18:45:35 +05:30
Ayaan Zaidi 745ab05e6f fix(gateway): drain parked restart emit hooks on hooked emissions
A gateway-tool restart parks sentinel/continuation hooks in
pendingRestartEmitHooks, but emitPreparedGatewayRestartUnderAdmission only
drained them when emitting hookless. When the config-reload deferral won the
emission race with its own emitHooks, the restart sentinel was never written:
no post-restart notice, no continuation turn, stale pendingRestartSessionKey
surviving in-process restarts, and orphaned hooks never rejected.

Run the caller preflight first, then drain parked hooks with the original
replace/reject loop whose tail re-read also captures hooks accepted while the
caller's beforeEmit awaited; release session ownership only once the slot is
settled and no awaits remain before emission. Reject every prepared hook set
on non-emitted outcomes and error-isolate afterEmitFailed callbacks. The
empty-slot path stays await-free so mid-flight intent/deferral timing is
unchanged, and emission attempts remain single-flight behind the restart-signal
admission fence (now documented).

Fixes #106138
2026-07-13 16:23:04 +05:30
Ayaan Zaidi 6908e6a63b fix(gateway): allowlist default-model config edits and explain protected-path refusals
agents.list[].model was agent-tunable while agents.defaults.model was
refused — the same capability gated by config shape (partially reverts
the defaults-spelling removal from #90145; token/auth/exec paths stay
protected). The bare refusal string also caused agents to misread the
injection boundary as an authorization failure and argue with the owner;
it now states the contract, the remedy, and the agent-tunable paths.
Guard moved to gateway-config-guard.ts (gateway-tool.ts 652->390).

Closes #106059
2026-07-13 11:03:50 +05:30
Ayaan Zaidi 143fed81c1 feat(sessions): reopen history around search hits 2026-07-13 10:27:29 +05:30
Ayaan Zaidi 432da8b3cb feat(agent): preserve interrupted turn context
Inspired by Codex: codex-rs/core/src/context/turn_aborted.rs and codex-rs/core/src/tasks/mod.rs.
2026-07-13 10:27:29 +05:30
Ayaan Zaidi 9d07a96ac9 fix(agents): route unbound OAuth compaction through auth-aware harness selection
Out-of-run compaction (budget preflight, /compact, subagent announce)
forced harness selection to the core runtime whenever a session had no
bound/planned/explicit harness, so ChatGPT-OAuth-only sessions on the
implicit Codex runtime failed auth against openai/openai-responses and
subagent completion announcements were dropped after retries.

Leave the selection override unset in both compaction paths so prepared
OAuth auth can select the credential-owning harness (as live runs do),
and ensure the policy-selected harness plugin is loaded before
selection. Native transcript compaction stays gated on the resolved
harness only.

Fixes #90925
2026-07-13 10:11:08 +05:30
Ayaan Zaidi 4dc6e182c3 fix(codex): preserve legacy termination when final is omitted
Omitted final on a confirmed message-tool-only source reply keeps main's terminate-on-delivery semantics and records a completed marker; only explicit final=false defers termination. Project the Codex-only final schema property in place on attempt-fresh tools instead of adding a public plugin-SDK clone export, resolving the SDK surface budget failure.
2026-07-13 10:09:52 +05:30
Ayaan Zaidi 0aabf56242 chore(i18n): track accessibilityLabel(title) wrapper contract
5e9bc0916f switched two SettingsProTabSections accessibility labels
from .accessibilityLabel(Text(title)) to .accessibilityLabel(title);
title is LocalizedStringKey so lookup stays localized, but the wrapper
contract in apple-app-i18n.ts still required the old spelling and the
tooling shard only runs on PRs, so main broke silently.
2026-07-13 07:46:38 +05:30
Ayaan Zaidi c029d997a9 chore(i18n): resync native inventory line metadata
Direct iOS/Android commits on main shifted source line numbers without
running the path-filtered native-i18n job, so `native:i18n:check` fails
on any PR that touches a native path. Metadata-only resync; entry count
unchanged (4200).
2026-07-13 07:42:52 +05:30
Ayaan Zaidi 47ce757c0f fix(auto-reply): adopt the target run slot when command turns continue into agent turns
Native command turns keep #104144 source-keyed admission, but a turn that
continues into a full agent turn (/steer fallback, /goal, /learn, unhandled
body) now moves its reservation and lifecycle lease to the target session
before running. Concurrent target inbounds see the owner and queue/steer
instead of double-admitting and splitting the session into two conversation
families; steering also targets the registered run owner instead of a stale
source-keyed reservation.

Fixes #104844
2026-07-12 11:12:04 +05:30
Ayaan Zaidi 33186b0f54 test(plugins): fail closed when an api-key auth method cannot be probed
An unprobeable api-key choice left its flag/env literals unchecked while CI
stayed green (ClawSweeper finding). The probe now supplies a real agent dir
and placeholder preflight opts (sentinel still bound to the declared
optionKey only, preserving the key-correctness proof), so every api-key
method must reach resolveApiKey — this immediately exercised
cloudflare-ai-gateway's account/gateway preflight path.
2026-07-12 10:06:26 +05:30
Ayaan Zaidi fe9af7dfc7 test(plugins): keep auth-literal parity test out of the unit-fast lane
Loading built plugin dists pulls large module graphs into the shared vitest
worker cache and broke co-resident vi.mock unit tests (memory-host-sdk
embeddings, checks-node-compact-large-2). An explicit dynamic import of the
surface loader trips the lane classifier's dynamic-import rule, moving the
file to the plugins project where dist loading is the norm.
2026-07-12 10:06:26 +05:30
Ayaan Zaidi 8f14f88690 test(plugins): fail auth-literal parity when a declared provider never registers
Silent skip on missing runtime registration recreated the drift class the
test guards (ClawSweeper finding); capability-only plugins now must register
zero text providers to be exempt.
2026-07-12 10:06:26 +05:30
Ayaan Zaidi 0e154d0467 fix(auto-reply): keep typed overloaded failures on the surfaced-copy path
Shipped behavior pins overloaded FailoverErrors to immediate dedicated copy
(agent-runner-execution.test.ts 'surfaces typed overloaded failures'); only
timeout and server_error reasons join the transient retry gate.
2026-07-12 10:06:26 +05:30
Ayaan Zaidi 57e0ea8f75 fix(auto-reply): honor structured FailoverError reasons in terminal catch classification
context_overflow and transient (timeout/server_error/overloaded) FailoverError
reasons now classify structurally like billing/rate_limit already do, instead
of relying on message text that may lack overflow or HTTP-status tokens. A
typed transient failure without a leading status token now takes the single
transient retry; typed context overflow suppresses the generic failure reply.
Part of #104219 (row 12).
2026-07-12 10:06:26 +05:30
Ayaan Zaidi d03defb8b4 refactor(plugins): single-source CORE_BUILT_IN_MODEL_APIS and add provider auth-literal parity test
gateway-startup-plugin-ids duplicated the built-in model-API set byte-for-byte
with nothing enforcing sync; provider-config-owner now owns it. New parity
test proves bundled provider manifests and runtime provider.auth declare the
same optionKey/cliFlag/envVar/method literals, guarding against silent
wizard-vs-runtime auth drift. Part of #104219 (row 12).
2026-07-12 10:06:26 +05:30
Ayaan Zaidi 596603f7d3 refactor(sessions): route get-reply-run session refresh through the accessor
Drops the last non-doctor whole-store resolveSessionStoreEntry read in the
reply pipeline; exact working-set key plus accessor disk read match the
sibling refresh sites in runPreparedReply. Part of #104219 (seam 8).
2026-07-12 10:06:11 +05:30
Ayaan Zaidi 4bbca30990 fix(plugin-sdk): keep shipped ErrorKind/detectErrorKind as deprecated compat
The latest stable package exposes both names via the deprecated
openclaw/plugin-sdk/infra-runtime subpath. Compat now lives in the barrel
itself with the old substring semantics and a removal plan; core runtime no
longer uses them. Also converts the chat mapping switch to an if-chain for
switch-exhaustiveness lint.
2026-07-12 06:25:54 +05:30
Ayaan Zaidi a303ca607c fix(gateway): badge timeout only for timeout-shaped errors
FailoverReason timeout is the retryable-transient bucket and deliberately
swallows generic 5xx, so it cannot drive the user-facing timeout badge.
Rate-limit/overload/context mapping stays on the canonical reason; the
timeout badge now requires isTimeoutError. HTTP 500 badges stay unknown.
2026-07-12 06:25:54 +05:30
Ayaan Zaidi 5ffa6db0de fix(gateway): classify chat error kind via canonical failover reasons
Deletes the naive substring detectErrorKind from infra/errors; the chat error
badge now maps resolveFailoverReasonFromError into the protocol errorKind set,
with refusal kept as a chat-local stop-reason check. Fixes drift where a Groq
TPM 413 showed context_length instead of rate_limit and quota/CJK/socket
errors showed unknown.

Part of #104219 (seam 5, slice 1).
2026-07-12 06:25:54 +05:30
Ayaan Zaidi 4b33199a65 refactor(agents): converge run staleness policy onto diagnostic activity owner
One RUN_STALE_TAKEOVER_MS constant and one resolveRunStaleThresholdMs in
diagnostic-run-activity.ts replace the hand-paired constants and duplicated
blocked-tool-floor derivations in the reply and embedded run registries.
Thresholds are byte-identical before and after; zero behavior change.

Part of #104219 (seam 4).
2026-07-11 20:59:37 +05:30
Ayaan ZaidiandGitHub f506070188 improve(ci): shorten compact PR test critical path (#104508)
* perf(ci): rebalance compact PR test jobs

* fix(ci): preserve compact whole-job timeout
2026-07-11 20:32:59 +05:30
Ayaan Zaidi f02673882c fix(agents): keep CLI terminal-reason classification non-throwing
Run errors can expose hostile getters; classification must not replace the
original failure or suppress its terminal event. Matches the containment
contract of isProviderTimeoutError in the same module.
2026-07-11 17:32:13 +05:30
Ayaan Zaidi d3a8eb8a1c refactor(agents): converge CLI tool terminal reason onto run-termination
One shared resolveCliToolTerminalReason owns the timed_out/cancelled/failed
decision for one-shot and live CLI runners; abort-signal lifecycle fields are
authoritative, error shape is the fallback. Deletes both local derivations.
Fixes live-path drift where a timeout abort delivered as a generic AbortError
was reported as cancelled instead of timed_out.

Part of #104219 (seam 3).
2026-07-11 17:32:13 +05:30
Ayaan ZaidiandGitHub f2a0f00567 fix(agents): keep exact tool allowlists on owning factories (#104213)
* refactor(agents): centralize core tool factory descriptors

---------

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-07-11 12:44:37 +05:30
Ayaan ZaidiandGitHub 79bfa3771c refactor(gateway): centralize agent wait lifecycle (#104147)
* refactor(gateway): centralize agent wait lifecycle
* fix(gateway): preserve agent wait freshness

---------

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-07-11 10:56:40 +05:30
Ayaan Zaidi fab69517b3 fix(auto-reply): key command-turn reply operations to the source session 2026-07-11 09:26:25 +05:30
Ayaan Zaidi d11d1d0ee6 fix(telegram): scope reply-fence abort authority to pre-adoption dispatch 2026-07-10 17:08:31 +05:30
Ayaan Zaidi f12ad4a38e fix(agents): stop warning about recovered exec failures after a successful reply 2026-07-10 14:53:52 +05:30
Ayaan Zaidi d1a97f5503 test(telegram): fix promise-executor-return lint in adoption test 2026-07-10 14:32:11 +05:30
Ayaan Zaidi 77c84de510 fix(telegram): complete spooled updates at turn adoption, rescope ingress watchdog 2026-07-10 14:32:11 +05:30
Ayaan Zaidi ef103205ad feat(channels): add turn-adoption ack to channel inbound dispatch 2026-07-10 14:32:11 +05:30
Ayaan ZaidiandGitHub 08b6996cd5 fix(mcp): redact secrets from /mcp show in group chats (#103396)
* fix(mcp): redact secrets in /mcp show replies

Prevent owner /mcp show from dumping raw headers/env credentials into
group chats. Mark MCP env values sensitive, restore redaction sentinels
on set so show→set cannot overwrite real secrets.

Fixes #103053

* test(mcp): e2e redaction of /mcp show secrets on live gateway

Spin up an ephemeral gateway process, chat.send /mcp show with live
credential-bearing config, and prove secrets never leave the reply path.
Also prove show→set sentinel restore on disk via chat and CLI.
2026-07-10 11:28:23 +05:30
Ayaan Zaidi e6a9a5d182 docs(web): document Docker host-networking requirement for the Telegram Mini App 2026-07-10 07:53:37 +05:30
Ayaan Zaidi 6da0af1cd3 fix(ci): use public plugin-sdk test seams and refresh generated surfaces 2026-07-10 07:53:37 +05:30
Ayaan Zaidi 0521d848bb fix(telegram): fixed-length initData hash compare and base-path ws url 2026-07-10 07:53:37 +05:30
Ayaan Zaidi 04ff278a1d refactor(device-bootstrap): close bootstrap purpose type 2026-07-10 07:53:37 +05:30
Ayaan Zaidi 00aad83f43 fix(telegram): harden mini app URL and page serving 2026-07-10 07:53:37 +05:30
Ayaan Zaidi b2ee68780c docs(web): document Telegram dashboard entry 2026-07-10 07:53:37 +05:30
Ayaan Zaidi 3c99adb9ca feat(telegram): add dashboard mini app command 2026-07-10 07:53:37 +05:30
Ayaan Zaidi 9cca9afa70 feat(ui): accept dashboard bootstrap tokens 2026-07-10 07:53:37 +05:30
Ayaan Zaidi 0c4188b3ec feat(gateway): approve control-ui bootstrap handoffs 2026-07-10 07:53:37 +05:30
Ayaan Zaidi c64db7c9c7 feat(plugin-sdk): export dashboard bootstrap helpers 2026-07-10 07:53:37 +05:30
Ayaan Zaidi b7fa44abd3 feat(device-bootstrap): add control-ui bootstrap purpose 2026-07-10 07:53:37 +05:30
Ayaan ZaidiandGitHub f351288a0d chore(repo): remove stale repository artifacts (#103152)
* docs: remove merged cron design document
* chore(repo): remove stale planning and proof artifacts

---------

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-07-10 05:28:12 +05:30
Ayaan Zaidi 474d660137 fix(infra): converge legacy state migrations on archive collisions 2026-07-09 18:57:58 +05:30
Ayaan Zaidi f32c36cdc8 fix(auto-reply): surface periodic usage-limit failures in group chats 2026-07-09 16:58:23 +05:30
Ayaan Zaidi 34d257713e fix(context): show transcript conversation in /context map 2026-07-09 16:56:13 +05:30
Ayaan Zaidi e975d49238 fix(agents): skip wham probe when oauth access token is locally expired 2026-07-09 14:29:38 +05:30
Ayaan Zaidi 1ad346e465 test(codex): align shared-client version fixtures with the 0.143.0 floor 2026-07-09 14:26:05 +05:30
Ayaan Zaidi 8589759818 fix(codex): keep terminal idle backstop gated during in-flight app-server requests 2026-07-09 14:26:05 +05:30
Ayaan Zaidi 4af2ca0a4d fix(agents): extend live CLI no-output watchdog to the blocked-tool floor 2026-07-09 14:26:05 +05:30
Ayaan Zaidi bb1da73b14 fix(codex): fail detached-but-leased clients on suspect retirement 2026-07-09 14:26:05 +05:30
Ayaan Zaidi 80b2b709ca fix(codex): scope client fan-out to terminal liveness kills 2026-07-09 14:26:05 +05:30
Ayaan Zaidi ca3f247eb2 fix(codex): fan out app-server liveness retirement 2026-07-09 14:26:05 +05:30
Ayaan Zaidi e4949996d1 fix(agents): apply provider-class idle ceilings to explicit run budgets 2026-07-09 14:26:05 +05:30
Ayaan Zaidi 048f2096d2 fix(agents): keep provider-class idle tiers under agent budgets and cron 2026-07-09 14:26:05 +05:30
Ayaan Zaidi e00236d20c docs: correct cron self-hosted idle watchdog wording 2026-07-09 14:26:05 +05:30
Ayaan Zaidi 28e53b6817 fix(config): allow timeoutSeconds 0 and bound local stream creation 2026-07-09 14:26:05 +05:30
Ayaan Zaidi 215be4e4ee fix(agents): keep finite LLM idle watchdog under unlimited run budgets 2026-07-09 14:26:05 +05:30
Ayaan Zaidi c2789b52a7 fix(agents): respect the blocked-tool floor in stale takeover and steer gates 2026-07-09 14:26:05 +05:30
Ayaan Zaidi 480b5cbc67 fix(agents): expire live-handle stuck recovery as run_stalled 2026-07-09 14:26:05 +05:30
Ayaan Zaidi eedeb1eccb fix(agents): fall stale_run steer refusals through to direct delivery 2026-07-09 14:26:05 +05:30
Ayaan Zaidi 969efdac4f fix(agents): make run liveness evidence-based 2026-07-09 14:26:05 +05:30
Ayaan Zaidi 953f1c7d0c fix(auto-reply): stamp activity per event and deprecate recovery exports 2026-07-09 14:26:05 +05:30
Ayaan Zaidi f178553df6 refactor(auto-reply): drop injection activity stamp and orphaned recovery exports 2026-07-09 14:26:05 +05:30
Ayaan Zaidi 4cbe49ba88 fix(auto-reply): set run_stalled before backend cancel in stale expiry 2026-07-09 14:26:05 +05:30
Ayaan Zaidi ad32cc3607 fix(auto-reply): stamp CLI activity once at the lifecycle bridge seam 2026-07-09 14:26:05 +05:30
Ayaan Zaidi 19803a147f fix(auto-reply): bound terminal reply-run settle and reclaim stale lanes 2026-07-09 14:26:05 +05:30
Ayaan Zaidi f246fa3901 test(agents): fix cross-file mock and module-state leakage in auth-profiles suite 2026-07-09 12:59:54 +05:30
Ayaan Zaidi 20f355f236 fix(agents): adopt relogged credential inside locked cas-miss recovery 2026-07-09 12:04:24 +05:30
Ayaan Zaidi 2b98aec9ef fix(agents): stop auth bookkeeping from clobbering rotated oauth credentials 2026-07-09 12:04:24 +05:30
Ayaan Zaidi e3b43a0001 perf(slack): bound thread history pagination 2026-07-08 03:40:37 +05:30
Ayaan Zaidi 1993ead6f5 perf(slack): drop process-wide write client concurrency cap 2026-07-08 03:40:37 +05:30
Ayaan Zaidi 04b55c35d2 perf(slack): parallelize independent inbound prepare lookups 2026-07-08 03:40:37 +05:30