Peter Steinberger
9ffebcadea
fix(telegram): preserve valid tg-time markup ( #112911 )
2026-07-23 07:00:00 -04:00
Peter Steinberger
0f0d9a2d74
refactor(telegram): consolidate bot test fixtures ( #112894 )
...
* test(telegram): consolidate bot fixtures
* fix(ci): allow cross-platform UI gzip variance
2026-07-23 01:03:34 -04:00
Peter Steinberger
ebec398543
refactor: move Telegram and iMessage config schemas to plugins ( #112850 )
...
* refactor: move telegram and imessage schemas to plugins
* test: allow bundled schema facade regression coverage
* refactor: remove orphaned command config helper
2026-07-22 23:01:47 -04:00
Peter Steinberger
7497147519
refactor: hoist channel doctor migration helpers ( #112782 )
2026-07-22 22:53:39 -04:00
joshavant
5681602069
fix(telegram): cache only durable stream previews
2026-07-22 21:14:53 -05:00
joshavant
c21fd54dd9
fix(telegram): keep thread binding type private
2026-07-22 21:14:53 -05:00
joshavant
160ef72525
fix(telegram): observe topic poll and sticker sends
2026-07-22 21:14:53 -05:00
joshavant
bb5e0a91a2
fix(telegram): enforce threadless mutation scope
2026-07-22 21:14:53 -05:00
joshavant
ea66298621
fix(telegram): wire topic mutation policy
2026-07-22 21:14:53 -05:00
joshavant
0a6b3ef7df
fix(telegram): bind general topic mutations
2026-07-22 21:14:53 -05:00
joshavant
334ae74428
fix(telegram): observe streamed topic replies
2026-07-22 21:14:53 -05:00
joshavant
e38810a19c
fix(telegram): bind topic message mutations
2026-07-22 21:14:53 -05:00
Jesse Merhi
4a2a600809
feat(channels): add channel-owned setup contracts ( #112176 )
...
* feat(channels): add channel-owned setup contracts
* test(channels): align legacy setup fixtures
* chore(channels): regenerate config and SDK baselines after rebase
* fix(update): run fresh doctor after current-process core changes
* fix(channels): align add pre-scan with execution precedence
* style(cli): format channels-cli test additions
* fix(channels): restore option-before-positional channel resolution via metadata arity scan
* fix(channels): keep help flags out of metadata arity escalation
* test(update): mock fresh post-update doctor in current-process suites
* style: format review fixes and correct entrypoint mock type
* fix(channels): register only modern contract options for dual-publishing plugins
* test(update): align downgrade suites with fresh-doctor child invocation
* docs(channels): record empty-contract and input-forwarding invariants
* fix(line): keep the shipped --token switch as a channel access token alias
* fix(signal): stop treating exact cross-family loopback endpoints as bind-aligned
* chore(config): regenerate docs config baselines after second rebase
* style: format rebased channels add tests
* fix(channels): enforce field-key and flag-name agreement in setup contracts
* fix(signal): detect container endpoints for bare --http-url setup
* fix(signal): ignore unconfigured accounts in transport collision checks
* fix(channels): validate negated setup flags in contract and normalizer
* fix(signal): preserve existing transport kind when setup detection is unreachable
* style(signal): use direct boolean check in collision guard
* style(signal): type test config literals
* docs(update): record two-read design of fresh-doctor validation gate
* fix(channels): satisfy post-rebase architecture gates
* docs: refresh channel setup map
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-22 19:57:42 -04:00
Peter Steinberger
0724dfda21
refactor(channels): share retry and text break helpers ( #112786 )
...
* refactor(channels): share retry and text break helpers
* fix(sdk): keep helper internals private
2026-07-22 19:05:00 -04:00
Peter Steinberger
88875ab7d9
refactor(channels): remove retired ack cleanup branches ( #112635 )
2026-07-22 03:54:28 -07:00
Peter Steinberger
6f29fc88e9
refactor(sessions): migrate pure readers to read-only session accessors ( #112568 )
...
* refactor(sessions): migrate pure readers to read-only session accessors
* test(sessions): teach mocks and declarations the read-only accessors
* test(sessions): align remaining harnesses with read-only accessors
2026-07-22 01:16:35 -07:00
Peter Steinberger
5e651d5ac7
fix(channels): restore assistant context after restart ( #112548 )
...
* fix(channels): restore transcript context after restart
Merge bounded active-branch session transcript turns at the shared prepared-turn seam so message channels retain assistant replies after restart or history eviction. Migrate Telegram's one-off merge while preserving exact projection and legacy dedupe behavior.\n\nCloses #112520 . Slack case reported by Joe Tam (@joetam) in #102594 .
* style(channels): avoid spread in transcript mapping
* refactor(telegram): drop obsolete transcript exports
2026-07-21 23:45:01 -07:00
Peter Steinberger
edecdbd05e
refactor(config): config-surface reduction tranche 3 — product consolidations (review request) ( #111527 )
...
* refactor(config): consolidate media model lists
* refactor(config): unify memory configuration
* refactor(config): consolidate TTS ownership
* refactor(config): move typing policy to agents
* refactor(config): retire product-level config surfaces
* refactor(config): share scoped tool policy type
* chore(config): refresh generated baselines
* fix(config): honor agent typing overrides
* fix(config): migrate sibling config consumers
* refactor(infra): keep base64url decoder private
* fix(config): strip invalid legacy TTS values
* chore(config): refresh rebased baseline hash
* fix(doctor): route legacy messages.tts.realtime voice to talk during tts move
* refactor(config): polish final layout names
* refactor(config): freeze retired tuning defaults
* feat(config): add fast mode default symmetry
* refactor(config): key agent entries by id
* docs(config): update final layout reference
* test(config): cover final layout migrations
* chore(config): refresh final layout baselines
* fix(config): align final layout runtime readers
* fix(config): align remaining readers
* fix(config): stabilize final layout migrations
* fix(config): finalize config projection proof
* fix(config): address final layout review
* docs(release): preserve historical config names
* fix(config): complete keyed agent migration
* fix(config): close final migration gaps
* fix(config): finish full-branch review
* fix(config): complete runtime secret detection
* fix(config): close final review findings
* fix(config): finish canonical docs and heartbeat migration
* fix(config): integrate latest main after rebase
* refactor(env): isolate test-only controls
* refactor(env): isolate build and development controls
* refactor(env): collapse process identity indirection
* refactor(env): remove duplicate config and temp aliases
* docs(env): define the operator-facing allowlist
* ci(env): ratchet production variable count
* fix(env): remove stale provider helper import
* fix(env): make ratchet sorting explicit
* test(env): keep test seam in dead-code audit
* test(env): cover ratchet growth and boundary; document surface budgets
* docs(config): document tier-eval consolidations
* docs(config): clarify speech preference ownership
* test(memory): align retired tuning fixtures
* refactor(memory): freeze engine heuristics
* refactor(config): apply tier-eval tranche
* refactor(tts): move persona shaping to providers
* refactor(compaction): move prompt policy to providers
* test(config): align hookified prompt fixtures
* chore(deadcode): classify test-only exports
* chore(github): remove unused spawn helper
* chore(deadcode): classify queue diagnostics
* chore(deadcode): remove unused lane snapshot export
* chore(plugin-sdk): ratchet consolidated surface
* fix(config): integrate latest main after rebase
2026-07-21 20:28:43 -07:00
Aaron Eden
2cd4e5a8be
fix: prevent empty Telegram sends for cron summaries ( #104111 )
...
* fix: prevent empty cron Telegram summary sends
* fix: move Telegram cron fallback normalization to adapter
* test: pin plugin SDK surface budget for cron fallback
* test: refresh plugin SDK API baseline
* fix(telegram): preserve cron fallback batch semantics
---------
Co-authored-by: Ayaan Zaidi <hi@obviy.us >
2026-07-22 03:27:06 +05:30
Peter Steinberger
e1d5d3dc16
refactor(channels): move single-account promotion keys to plugin declarations ( #112293 )
...
* refactor(channels): move single-account promotion keys to plugin declarations
* fix(channels): keep legacy promotion tier for undeclared setup adapters
* fix(channels): keep plugin discovery lazy in setup promotion helpers
* fix(channels): resolve bundled promotion surfaces from setup-only artifacts
* test(matrix): use vi.stubEnv in setup test env helper
2026-07-21 06:48:30 -07:00
Mark
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
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
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
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
7aedca21b2
test(release): align built-in timing proofs ( #111483 )
2026-07-19 09:42:16 -07:00
Peter Steinberger
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
783a5d21cf
refactor(config): purge numeric tuning knobs behind built-in defaults ( #111382 )
2026-07-19 07:35:45 -07:00
Peter Steinberger
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
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)
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
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
Momo
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
Arseniy Palagin
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)
047232bd16
fix(telegram): fall back for web apps outside DMs ( #111116 )
2026-07-18 19:52:19 -06:00
Peter Steinberger
333a3297af
refactor(plugin-sdk): consolidate persistent dedupe claim loop ( #110984 )
2026-07-18 23:36:59 +01:00
Peter Steinberger
264a7b0d12
refactor(channels): consolidate manifest descriptors ( #110985 )
2026-07-18 23:18:28 +01:00
Peter Steinberger
fc777a35bb
test(telegram): mock core turn dispatcher ( #110967 )
2026-07-18 22:35:56 +01:00
Peter Steinberger
90a6256370
test(telegram): isolate miniapp bootstrap fixtures ( #110895 )
2026-07-18 19:59:02 +01:00
Peter Steinberger
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
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
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
bee40b9e8e
fix(messaging): align lifecycle follow-ups ( #110413 )
2026-07-18 06:14:24 +01:00
Peter Steinberger
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
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
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
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
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]
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
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