d9ac878ea3
fix(telegram): clear generic callback buttons after click ( #90169 )
...
* fix(telegram): clear generic callback buttons
* test(telegram): simplify callback cleanup coverage
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-20 22:28:21 -07:00
Peter Steinberger and GitHub
0adc2cf606
refactor(media): consolidate parallel media-kind unions onto canonical MediaKind ( #112063 )
...
* refactor(media): consolidate parallel media-kind unions onto canonical MediaKind
One canonical MediaKind union (media-core constants) replaces ~40
duplicate/parallel kind declarations across core and channel plugins;
channel-specific narrower contracts derive via Extract/Exclude. Also
fixes a review-caught fallback bug where a stored "unknown" reply-chain
kind preempted MIME inference and relabeled images as documents.
* refactor(ui): derive attachment kinds from MediaKind
* fix(telegram): drop type-dead unknown guard in reply-context kind fallback
* style(telegram): format media kind fallback
2026-07-20 22:27:22 -07:00
Peter Steinberger and GitHub
5197428add
feat(channels): batch 4 Telegram drops media placeholder bodies ( #111855 )
...
Final producer batch of the media-placeholder program: Telegram primary
bodies are caption-only with one aligned structured fact per native
media; the message-cache kind-parsing regex is deleted (native kind
stored directly); reply-chain, debounce/forward, group-history, and
ambient transcript lines render structured facts via the shared
formatter (removing the plugin-local duplicate of the caption-less
literal); audio-transcript and sticker-description replacements gate on
structured facts instead of exact placeholder strings. Also restores
unconditional failed-retryable recording when media resolution is
aborted for live updates, so shutdown cannot silently settle an
undispatched update.
2026-07-20 07:31:10 -07:00
Peter Steinberger and GitHub
c7e7ac2728
refactor: remove expired plugin compatibility surfaces ( #111451 )
...
* docs(secrets): remove retired web credential paths
* refactor(web): remove retired provider compatibility paths
* refactor(providers): delete retired compatibility routes
* refactor(secrets): remove retired credential aliases
* refactor(plugin-sdk): delete retired compatibility surfaces
* docs(plugin-sdk): remove retired migration guidance
* chore(plugin-sdk): refresh rebased surface budgets
* chore(plugin-sdk): refresh API removal baseline
* refactor(compat): migrate retired internal callers
* chore(plugin-sdk): refresh current-main baselines
* test(config): migrate plugin-owned secret assertions
* test(gateway): narrow plugin secret refs
* fix(plugin-sdk): preserve private boundary type identity
* chore(compat): remove stale sweep references
* chore(lint): lower max-lines budget
* refactor(secrets): remove unused web helper
* build(plugin-sdk): drop removed compat entries
* chore(plugin-sdk): refresh rebased API baseline
* chore(plugin-sdk): use Linux API baseline hash
* fix(plugin-sdk): preserve private bundled build entries
* fix(plugin-sdk): package private runtime facades
* fix(plugins): preserve external credential contracts
2026-07-19 11:04:48 -07:00
Peter Steinberger and GitHub
7aedca21b2
test(release): align built-in timing proofs ( #111483 )
2026-07-19 09:42:16 -07:00
Peter Steinberger and GitHub
ca3a1873a6
fix(test): make broad shard execution deterministic ( #111416 )
...
* fix(test): harden broad shard execution
* test: allow broad-profile contention
* style(telegram): remove redundant chat id cast
* style(test): preserve setup test spacing
2026-07-19 08:39:16 -07:00
Peter Steinberger and GitHub
783a5d21cf
refactor(config): purge numeric tuning knobs behind built-in defaults ( #111382 )
2026-07-19 07:35:45 -07:00
Peter Steinberger and GitHub
06f5f73e47
refactor: own model discovery by runtime lifecycle ( #111173 )
...
* refactor(agents): prepare model runtime catalogs
Build lifecycle-owned model and auth snapshots, carry prepared stores into hot agent paths, and serialize config/auth publication.
Credits @zeroaltitude's #90741 investigation and benchmark approach.
* refactor: finish lifecycle-owned model discovery
* fix: align prepared model catalog contracts
* test: align lifecycle catalog mocks
* test: fix prepared catalog type fixtures
* refactor: split prepared model runtime ownership
* fix: import prepared runtime replacement gate type
* test: split media runtime coverage
* test: preserve image auth fixture key types
* test: isolate lifecycle gate fixtures
* chore: keep release changelog owned
* refactor: finish prepared model catalog migration
* test: keep catalog review fixtures scanner-safe
* refactor: preserve lifecycle model runtime ownership
* fix: close prepared runtime lifecycle races
* fix: preserve compaction workspace fallback
* chore: document btw generation rebinding
* fix: preserve prepared generation boundaries
* fix: keep model-list discovery flag explicit
* fix: serialize standalone model runtime activation
* refactor: migrate subagent model catalog lookup
* refactor: clarify doctor catalog lookup seam
* chore: refresh plugin sdk api baseline
* test: migrate swarm catalog dependency
* refactor(telegram): rename runtime catalog seam
* refactor: extract model-aware tool context
* test(models): isolate lifecycle catalog fixtures
* refactor(agents): avoid btw parameter rebinding
* fix(net-policy): align root ipaddr dependency
* fix(build): keep net policy dependency bundled
* fix(deadcode): document net policy compile dependency
2026-07-19 05:30:54 -07:00
Peter Steinberger and GitHub
58452de711
refactor(config): config-surface reduction tranche 1 — retire dead keys, dedupe channel schemas, add growth ratchet ( #111142 )
...
* refactor(config): retire dead and aliased config keys via doctor migrations
* refactor(config): dedupe bundled channel config schemas into shared builders
* feat(config): add config-surface count ratchet to doc-baseline check
* test(config): drop stale fixtures for retired config keys
* fix(doctor): migrate only positive finite MCP timeout aliases
* fix(migrate-hermes): emit canonical MCP timeouts only
* fix(config): satisfy lint and contract gates
2026-07-19 00:52:37 -07:00
Jason (Json) and GitHub
9c7800467c
feat(mcp): open App views from channel replies ( #111211 )
...
* feat(mcp): add portable channel app actions
* test(gateway): keep origin reset private
* fix(mcp): require a resolved reply channel
2026-07-19 01:44:15 -06:00
Peter Steinberger and GitHub
ee0e3a4d47
refactor(channels): share durable ingress monitor ( #111214 )
...
* refactor(telegram): share durable ingress monitor
* refactor(whatsapp): share durable ingress monitor
* refactor(feishu): share durable ingress monitor
* refactor(qqbot): share durable ingress monitor
* refactor(zalouser): share durable ingress monitor
* refactor(nostr): share durable ingress monitor
2026-07-18 23:33:24 -07:00
198d2f000f
fix(telegram): preserve authored file-reference links ( #105911 )
...
* fix(telegram): preserve authored file links
* fix(telegram): preserve authored file links after wrapping
* refactor(telegram): rely on markdown link provenance
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-18 20:33:05 -07:00
bdfe2a4e60
fix(telegram): polling worker pins a CPU core when the Bot API answers empty getUpdates instantly ( #111063 )
...
* fix(telegram): pace fast empty ingress polls
Some Bot API deployments (notably self-hosted telegram-bot-api servers and
intermediary proxies) can answer getUpdates immediately instead of holding
the connection for the requested long-poll timeout. With no pending updates
that turns the polling ingress worker loop into a busy spin: each empty
poll completes in milliseconds and the next one starts right away, pinning
a CPU core.
Enforce a 1s floor between consecutive empty getUpdates cycles, measured
from poll start so responses that honor the long-poll timeout are never
delayed. The wait listens to the worker stop signal, keeping shutdown
immediate. Non-empty polls are not paced, so pending traffic still drains
at full speed.
* fix(telegram): adapt empty poll backoff
---------
Co-authored-by: Arseniy Palagin <valeradzigurda3@gmail.com >
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-18 19:54:03 -07:00
Jason (Json) and GitHub
047232bd16
fix(telegram): fall back for web apps outside DMs ( #111116 )
2026-07-18 19:52:19 -06:00
Peter Steinberger and GitHub
333a3297af
refactor(plugin-sdk): consolidate persistent dedupe claim loop ( #110984 )
2026-07-18 23:36:59 +01:00
Peter Steinberger and GitHub
264a7b0d12
refactor(channels): consolidate manifest descriptors ( #110985 )
2026-07-18 23:18:28 +01:00
Peter Steinberger and GitHub
fc777a35bb
test(telegram): mock core turn dispatcher ( #110967 )
2026-07-18 22:35:56 +01:00
Peter Steinberger and GitHub
90a6256370
test(telegram): isolate miniapp bootstrap fixtures ( #110895 )
2026-07-18 19:59:02 +01:00
Peter Steinberger and GitHub
884fdba81c
fix(telegram): local turn tests complete on macOS ( #110894 )
...
* test(channels): mock core turn dispatch for delivery traces
* test(telegram): scope bot tests to a fresh state dir
Assembled turns resolve session/agent bindings through the state DB; an
ambient operator Codex binding fails generation reclaim and drops the turn,
adding misleading noise to reply-wait timeouts.
* test(telegram): drive bot turn tests through a prepared-dispatch mock
Core's turn lifecycle hard-wires its own provider dispatcher for assembled
turns, so the harness's injected dispatcher never fires and every reply-wait
turn test hangs to timeout locally. Convert resolved turns to prepared ones
that dispatch through the harness mock, restoring the file's original
authored contract.
* test(telegram): mark trace token as synthetic
* test(telegram): centralize trace dispatch mocks
* test(telegram): preserve assembled dispatch wiring
* test(telegram): guard trace dispatch seam
* test(telegram): avoid duplicate turn lifecycle
2026-07-18 19:52:27 +01:00
Peter Steinberger and GitHub
d7de67ae02
feat: ask_user follow-ups — harness convergence, channel finalization + reactions, native cards, docked web panel ( #110372 )
...
* feat(ask-user): follow-up harness slice
* feat(ask-user): follow-up channels slice
* feat(ask-user): follow-up native slice
* feat(ui): dock question panel above composer with stepper and compact stream summaries
* docs: refresh follow-up integration maps
* test(ui): align terminal summary proof
* fix(infra): echo declared option answers in terminal status when free-text is allowed
* fix(infra): keep reaction answering when display labels are formatter-adjusted
* fix(agents): settle plain-text claims only after question registration commits
* fix(agents,apps): commit-ordered claim persistence, claim-aware prompt delivery, non-blocking question refresh
* fix(harness,infra): reaction-appropriate question copy, caller presentations honored
* fix(native,infra,agents): local-expiry eviction, value-addressed reactions, reserve-before-request
* fix(infra,android): dual-mode question resolver for compact callbacks; reset terminal retention on replayed pending
* fix(harness,discord): claim-aware prompt delivery in run helper; escape finalization labels
* fix(macos): merge transient-content visibility with question cards after main sync
* fix: repair ask user follow-up CI
* test: update limited bootstrap scope expectation
* fix: retain shared question card API
* chore: refresh native i18n inventory
2026-07-18 03:32:39 -04:00
Peter Steinberger and GitHub
3e74534a70
fix(channels): keep healthy accounts running when credential files fail ( #110360 )
...
* fix(channels): isolate unavailable credential files
* fix(channels): complete credential file type contract
* fix(channels): preserve credential path handling
* test(channels): cover credential file edge cases
* fix(channels): ignore blank credential file paths
* test(secrets): keep empty credential files unavailable
* test(googlechat): keep temp cleanup plugin-local
* fix(channels): keep credential diagnostic internal
* chore: defer release note to release automation
2026-07-18 06:27:59 +01:00
Peter Steinberger and GitHub
bee40b9e8e
fix(messaging): align lifecycle follow-ups ( #110413 )
2026-07-18 06:14:24 +01:00
Peter Steinberger and GitHub
31ed59bdf6
feat: keep main agents aware of group activity ( #110332 )
...
* feat(sessions): auto-watch group activity from main
* feat(sessions): allow watchers to read watched sessions
* fix(sessions): skip group watches for system turns
* fix(sessions): preserve watched session semantics
* fix(channels): propagate effective dm scope
* fix(sessions): canonicalize main watch identity
* fix(sessions): distinguish ambient group watches
* fix(sessions): revoke ineligible ambient watches
* chore: drop CHANGELOG edit (release generation owns it)
2026-07-18 04:06:58 +01:00
Peter Steinberger and GitHub
601ffa2530
refactor(channels): move inbound turn execution into core ( #110095 )
...
* refactor(channels): centralize turn execution lifecycle
* refactor(extensions): adopt core channel turn plans
* test(channels): ratchet modern dispatch ownership
* chore(channels): drop stale max-lines exemption
* fix(channels): allow async delivery error cleanup
* test(channels): await async delivery cleanup
* test(channels): await delivery error callbacks
* fix(channels): preserve delivery error contract
* fix(plugin-sdk): preserve channel inbound declarations
* test(channels): exercise core delivery plans
* fix(channels): await delivery error cleanup
* fix(channels): preserve async cleanup contract
* refactor(channels): trim dispatch boilerplate
* fix(channels): mask observe-only dispatch results
* refactor(channels): delete unused dispatch exports
* fix(msteams): preserve resolver config overrides
* refactor(channels): keep Teams turn config internal
* test(plugins): drop retired Teams runtime export guard
2026-07-18 00:55:46 +01:00
Peter Steinberger and GitHub
da44d52ac6
feat: ask_user — structured questions from the agent with web card, channel buttons, and text answers ( #109922 )
...
* feat(gateway): add transient question runtime (question.* methods + broadcasts)
* feat(agents): add blocking ask_user question tool with chat prompt delivery and text-reply claim
* feat(ui): interactive in-thread question cards for ask_user
* feat(channels): native tap-to-answer buttons for ask_user on Telegram, Discord, and Slack
* feat(ui): unify codex and gateway question cards with interactive gateway answering
* refactor(agents): collapse ask_user pending state to one registry; docs for ask_user
* fix(agents): include ask_user in normal gateway runs; add question-flow control-ui e2e
* test(ui): avoid credential-shaped fixture in question card test
* refactor(ui): reorder stream-group context keys
* fix(gateway,ui): validate question answers at resolve; reject secret/duplicate-label questions; UI retry and reconnect hardening
* fix(gateway,agents): canonicalize accepted option answers; bound ask_user option labels to 64 chars
* chore(ci): prune unused question exports, allowlist mobile question events, fix discord lint
* chore(ci): regenerate protocol/i18n/docs/tool-display artifacts for question surface
* fix(protocol): flatten QuestionRecord for native codegen; drop TS-only alias from schema registry
* chore(android): regenerate ask-user localization resources
* docs: regenerate docs map after rebase
* fix(ci): avoid stale read-only dependency disks
* test: remove stale reef lint suppression ratchet
* fix(ci): keep source locale drift advisory in release gates
* fix(ci): scope locale advisory handling to parity check
2026-07-17 22:24:17 +01:00
Peter Steinberger and GitHub
433b3ce86d
fix(line): await deferred ingress release on stop ( #110104 )
...
* fix(channels): await abandoned ingress claims
* fix(channels): preserve abandonment boundaries
2026-07-17 20:56:17 +01:00
Peter Steinberger
b48c801623
test(release): repair extension runtime fixtures
2026-07-17 14:24:13 +01:00
Peter Steinberger and GitHub
9b5eb04221
improve(tests): tighten async polling across suites ( #109919 )
...
* test: tighten signal delivery polling
* test: tighten async polling across suites
* test: use virtual time for signal ingress drain
2026-07-17 12:20:58 +01:00
clawsweeper[bot] and GitHub
2dee283ad0
Open fix(infra): import legacy plugin state partially (newest-first) instead of skipping when capacity is short ( #109679 )
2026-07-17 16:08:04 +05:30
Peter Steinberger and GitHub
2920ec1fab
docs(channels): settle replay-guard vs ingress-drain layering contract ( #109799 )
...
* docs(channels): settle replay-guard vs ingress-drain layering contract in code comments and SDK docs
* docs: refresh SDK channel docs map
2026-07-17 11:13:00 +01:00
Peter Steinberger and GitHub
0e792b6de3
refactor(channels): centralize inbound orchestration and remove internal compat ( #109716 )
...
* refactor(channels): centralize inbound turn orchestration
* refactor(runtime): remove stale compatibility paths
* chore(guards): reject internal deprecated API use
* refactor(channels): simplify core turn planning
* chore(guards): keep deprecated checks boundary-focused
* refactor(memory): keep modern config off compat barrel
* fix(msteams): preserve feedback learning
* test(channels): align modern inbound fixtures
* refactor(channels): finish modern inbound migration
* refactor(channels): tighten core inbound kernel
* fix(channels): preserve turn assembly narrowing
* test(sdk): keep runtime mock binding immutable
* test(matrix): isolate read policy runtime
* test(msteams): mock canonical reply factory
* test(slack): mock core inbound turn dispatch
* test(telegram): inject core session recorder
* test(signal): inject core session recorder
* test(googlechat): assert canonical inbound routing
* test(synology-chat): align core turn fixture
* fix(sdk): preserve direct DM runtime compat
* refactor(channels): own inbound envelope compat in core
* refactor(channels): trim inbound dispatch seams
* refactor(channels): remove redundant async wrappers
* test(synology-chat): type canonical dispatcher mock
* refactor(channels): remove remaining dead compat seams
* chore(sdk): refresh API baseline after rebase
* fix(channels): preserve direct DM identity metadata
2026-07-17 00:56:46 -07:00
e01027dd28
fix(telegram): honor abortSignal in startup probe retry loop ( #109604 )
...
* fix(telegram): honor abortSignal in startup probe retry loop
* test(telegram): isolate probe retry abort proof
* fix(telegram): abort active startup probe requests
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-17 00:19:30 -07:00
Peter Steinberger and GitHub
5c86a224c0
perf(test): poll Telegram webhook state faster ( #109749 )
2026-07-17 00:14:16 -07:00
Peter Steinberger and GitHub
86e807241c
perf(test): tighten Telegram polling waits ( #109696 )
2026-07-16 23:11:50 -07:00
5e13f459a7
fix(telegram): preserve forward origins in debounce batches ( #108985 )
...
* fix(telegram): preserve forward origins in debounce batches
* fix(telegram): deliver batched forward origins to agent
* refactor(telegram): keep debounce forward cleanup local
Co-authored-by: Arseniy Palagin <263096044+aspalagin@users.noreply.github.com >
---------
Co-authored-by: Arseniy Palagin <263096044+aspalagin@users.noreply.github.com >
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-16 22:47:44 -07:00
Peter Steinberger and GitHub
a1dfd47edd
refactor(sdk): collapse plan updates to typed steps ( #109660 )
...
* refactor(sdk): collapse plan updates to typed steps
Per owner decision, remove the shipped steps: string[] SDK field and its unreleased planSteps replacement early. Collapse onPlanUpdate to one typed steps field. Retain wire-level string normalization for external Codex plugin version skew.
* chore(sdk): tighten rebased surface budget
2026-07-16 22:35:29 -07:00
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
Peter Steinberger and GitHub
0a19e1ed58
refactor(channels): centralize mention and group activation decisions ( #109480 )
...
* refactor(channels): adopt shared mention-gate decision; consolidate group activation
* fix(matrix): carry effective mention decision
* test(session): pin qqbot accessor migration
2026-07-16 18:15:58 -07:00
Peter Steinberger
cfaa30a08f
fix(release): align Codex discovery and Telegram traces
2026-07-16 21:54:11 +01:00
950ec3c620
fix(telegram): stalled getChat errors retain connections ( #109007 )
...
* fix(telegram): abort stalled getChat errors
* test(telegram): satisfy promise executor lint
* fix(telegram): close getChat lookup transports
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-16 13:50:50 -07:00
Peter Steinberger and GitHub
1bdebb8c69
test(telegram): speed webhook shutdown retry proof ( #109271 )
2026-07-16 11:33:11 -07:00
fa08ab28ca
fix(telegram): preserve word boundaries in proactive sends ( #108801 )
...
* fix(telegram): preserve proactive message word boundaries
* fix(markdown): retain whitespace across rendered chunks
* fix(telegram): preserve links in plain fallbacks
* fix(channels): preserve chunk boundary semantics
* test(sms): verify lossless chunk whitespace
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-16 11:18:17 -07:00
Peter Steinberger and GitHub
c46cc1e2d4
refactor(channels): unify inbound replay protection ( #109117 )
...
* refactor(channels): unify inbound replay-guard orchestration on shared factory
* fix(plugin-sdk): bind replay-guard settlement to claim handles
* fix(plugin-sdk): claim-handle settlement (rest)
* fix(discord): align skipped queue cleanup
* style(feishu): simplify bot menu claim settlement
* refactor(plugin-sdk): extract replay dedupe contracts
2026-07-16 08:46:34 -07:00
Peter Steinberger and GitHub
44314c9451
refactor(channels): table-drive setup and control-plane helpers ( #109028 )
...
* refactor(channels): table-drive setup credentials, config schemas, doctor detectors, status issues
* refactor(channels): control-plane tables (rest)
* fix(plugin-sdk): refresh surface budgets after rebase
* style(plugin-sdk): format credential helpers
* fix(channels): preserve generic schema refinement types
* fix(channels): preserve schema input and output inference
* fix(clickclack): forward credential patch fields
* test(plugin-sdk): use redacted credential fixtures
* fix(plugin-sdk): refresh API baseline after inference fix
* fix(channels): keep multi-account envelope optional
* fix(channels): preserve policy validation invariants
* fix(extensions): remove stale awaits from file checks
* style(qqbot): format synchronous file check
* fix(config): refresh bundled channel metadata
* fix(qqbot): reject unsupported pairing policy
2026-07-16 07:17:01 -07:00
Peter Steinberger and GitHub
990e8d24b0
feat(presentation): hosted-widget launch via typed web-app actions ( #108927 )
...
* feat(presentation): support hosted widget actions
* refactor(discord): route widget launches through presentation
* chore: keep changelog release-owned
* test(interactive): type the invalid web-app boundary case explicitly
* test: type web-app action fixtures against the split union
The two-member web-app union no longer accepts a distributed
type: "url" | "web-app" literal or an empty receipt in typed
callbacks; use explicit action casts and the Discord receipt factory.
2026-07-16 04:35:31 -07:00
Peter Steinberger and GitHub
66604df9b6
refactor(channels): share retry helpers and remove dead state probes ( #108903 )
...
* refactor(channels): generalize channel retry runner and retry-after parsing; drop dead configured-state probes
* fix(channels): align retry and metadata contracts
2026-07-16 04:03:15 -07:00