Commit Graph

211 Commits

Author SHA1 Message Date
Peter Steinberger af3b86091f fix(telegram): preserve direct-message topic routing (#126207)
* fix(telegram): preserve direct message topic identity

* fix(telegram): break topic routing import cycle
2026-08-19 18:00:56 -07:00
Peter Steinberger 3378e07d50 refactor(plugin-sdk): promote shared runtime primitives (#126193)
* refactor(plugin-sdk): promote shared runtime primitives

* test(codex): keep one attempt tools owner
2026-08-19 01:10:18 -07:00
Peter Steinberger 614b503704 test(telegram): remove forum cache reset seam (#125986) 2026-08-18 17:47:19 -07:00
Peter Steinberger dbe4ce9f33 fix(telegram): prevent multi-agent cache ownership startup failures (#123029)
* fix(telegram): scope runtime caches by account owner

* test(telegram): type partial owner runtime stub

* refactor(telegram): remove obsolete default owner seam

* fix(telegram): tolerate partial durable updates

* test(telegram): request raw progress detail explicitly
2026-08-13 00:33:38 -07:00
Peter Steinberger 2e86f7cc95 fix(telegram): preserve pre-dispatch send custody (#122741) 2026-08-12 10:47:08 -07:00
Peter Steinberger b080dd1e76 refactor: consolidate coercion contracts (#122458)
* refactor: consolidate coercion contracts

Centralize exact string, record, numeric, date, Boolean, argument, and structured-error coercions while preserving call-site semantics.

Migrate canonical-name collisions and deprecated internal SDK bypasses, deleting 55 net production/tooling lines. Expand declaration ownership enforcement to 101 allowed helpers and add a narrow export-completeness audit.

* fix: preserve standalone script coercions

Keep copied Control UI tooling self-contained and retain the trusted release harness module-relative source seam when the harness runs against an old target cwd.
2026-08-11 23:26:37 -07:00
Mariano edb7a1692e fix(telegram): expose live location updates to hooks (#122185)
* fix(telegram): expose live location updates to hooks

* test(telegram): keep location coverage focused

* fix(telegram): emit stopped live locations

* test(plugin-sdk): refresh location hook contracts

* docs(changelog): note Telegram live location hooks

* fix(telegram): complete live-location observer path

---------

Co-authored-by: mbelinky <mbelinky@users.noreply.github.com>
2026-08-11 23:26:23 +02:00
Peter Steinberger 2cf725191c refactor(telegram): centralize text delivery (#117327)
Centralize Telegram text delivery: page planning and reply-target progression move into telegram-text-delivery.ts, shared by the durable send, edit, and streaming-final paths; bot/reply-threading.ts and per-path split/page logic are deleted. Formatted-to-plain recovery routes through withTelegramPlainFallback everywhere. Restores the projection-cursor invalidation contract on terminal multi-page failures (with regression). Net -321 production LOC. Live E2E on the PR: formatted entity path, plain-fallback recovery, and 2-page chaining.

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-11 14:37:54 +00:00
Ayaan Zaidi 79016b415a refactor(telegram): unify formatted-to-plain send degradation in one orchestrator (#121990)
The Telegram send-funnel parity invariant (durable and streaming funnels must degrade formatted sends identically) was prose-enforced and had drifted: draft previews and message edits only degraded on HTML-parse 400s, not empty-content 400s. One orchestrator (withTelegramPlainFallback) now owns classification, guard, logging, and plain-chunk planning for all 11 call sites; withTelegramHtmlParseFallback and buildTelegramPlainFallbackPlan are deleted. Net -29 production LOC. Behavior change: previews/edits recover empty-content 400s as plain text; degrade logs unify to `degrade=plain-fallback:<trigger>`.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-11 10:29:26 +00:00
Ayaan Zaidi 210aca6de3 fix(gateway): prevent restart replay after final delivery (#121908)
Re-lands the reverted #121507 on the current custody contracts. The reply dispatcher now owns direct-send pending-final custody: claim before provider I/O, terminal settlement for delivered/suppressed/failed outcomes, proven no-send stays replayable, ambiguous evidence fails closed — so Gateway restarts can no longer duplicate an already-accepted final reply.

Proof: ClawSweeper local review clean, exact-head ci-gate green, live Telegram E2E (one turn, one final, no duplicates).

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-11 13:09:59 +05:30
Peter Steinberger c39abcecda fix(security): report DM isolation from effective routing (#121741)
* fix(security): audit effective DM session ownership

Resolve admitted DM principals through canonical route, account, identity-link, and channel-owned session policy before reporting shared-session risk. Doctor now renders the structured channel security owner instead of duplicating the global-only default-account heuristic.\n\nCloses #121711

* chore(plugin-sdk): refresh API contract baseline

* fix(telegram): preserve direct peer SDK export

* fix(telegram): preserve direct peer resolver signature

* fix(ci): use supported DM audit grouping

* fix(protocol): refresh approval reviewer Swift models
2026-08-10 15:34:37 -07:00
Peter Steinberger 0d4e9f3ede fix(codex): report harness context window; compact context popover (#121491)
* fix(codex): report harness context window as session contextTokens

Codex app-server reports model_context_window per turn. Carry it through the projector into the run result meta so session rows show the real window instead of the catalog's standard-tier input cap (272k vs 1M for gpt-5.6 models).

* improve(ui): compact chat context popover

Inline stat rows replace boxed tiles; zero-value cost rows and the whole cost section when empty are omitted; provider/model provenance lines are removed because the footer already shows the model; and the popover is narrowed to 300px.

* refactor(codex): split attempt-result assembly out of event projector

* fix(codex): seed attempt context window from startup binding

App-server v2 turn/started omits the core model_context_window, so thread/tokenUsage/updated is the only live carrier. Seed usage-less attempts from the retained startup binding rollout/session window so session metadata cannot regress to the catalog fallback.

* fix(codex): prefer native startup context window

Persisted session contextTokens has no source provenance and may contain the catalog fallback. Keep the minimum window for the conservative rotation fuse, but seed the projector from the native rollout when it is available.

* chore(plugin-sdk): regenerate api baseline (new format)

* revert(gateway): "prevent restart replay after final delivery" (broke 5 CI jobs)
2026-08-10 05:52:19 -07:00
Ayaan Zaidi 1f75018600 fix(gateway): prevent restart replay after final delivery
Record channel delivery custody before recipient-visible sends so restart recovery cannot duplicate accepted finals.

Ambiguous legacy markers now fail closed with a visible interruption instead of blind replay.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-10 16:42:14 +05:30
Peter Steinberger 59ec48439e fix(telegram): preserve topic routing for reactions and poll answers (#121231) 2026-08-09 14:23:19 -07:00
Ayaan Gazali 5262874d64 fix(telegram): reuse saved media for quoted replies
Store resolved Telegram media references on observed messages so repeated quoted-photo turns reuse retained bytes instead of downloading them again. Preserve uncached external-reply media for the active turn and keep cache metadata out of model context.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
Co-authored-by: Ayaan Gazali <ayaangazali.work@gmail.com>
2026-08-10 02:03:01 +05:30
Peter Steinberger d7133e7df6 fix(telegram): preserve direct messages topic routing (#120916)
Replies, previews, and media in channel Direct Messages topics now remain in their originating topic. Bot-private and forum topic routing remains unchanged.
2026-08-08 22:53:35 -07:00
Ayaan Zaidi 5e477aff2a feat(status): render /status as a native rich card and declutter the plain body (#120167)
* feat(status): render /status as native rich tables on channels that support them
* feat(status): tighten rich /status layout into a titled native table card
* feat(status): trim rich /status tail to one clock-and-uptime context line
* feat(status): context meter, hot-window warning, and default-noise trim in rich card
* test(status): satisfy SessionEntry sessionId in meter fixture
* fix(telegram): gate rich table islands off legacy HTML sends and cover payload sends
* test(telegram): split outbound-adapter presentation tests to satisfy max-lines
* fix(outbound): make presentation capability resolution formatting-aware
* fix(telegram): defer presentation canonicalization on rich accounts until send
* feat(status): one fact per line in the plain status body
* feat(status): group the plain status body into blank-line sections
* feat(status): lead the rich status card with the version title

---------

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-07 20:46:52 +05:30
Peter Steinberger c636060f04 fix(telegram): preserve voice fallback text
Preserve visible text when Telegram rejects a voice note for recipient privacy.

Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-08-07 08:18:31 +05:30
Peter Steinberger b4a26783f7 refactor(test): consolidate duplicated requireRecord and provider HTTP mock helpers (#119982)
* refactor(test): consolidate duplicated test helpers

* test: remove stale record guard import

* fix(test): remove orphaned record guards

* refactor(test): keep record requirement messages exhaustively typed

* fix(test): keep packages/ai record guard package-local
2026-08-06 14:48:01 -07:00
Peter Steinberger 70f84286c9 fix(telegram): preserve inbound quote attribution
Preserve native Telegram quote attribution in agent-visible input and terminate quotes before following ordinary text.

Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-08-06 21:11:02 +05:30
Lu Wang 5a8c27ca41 fix(telegram): verify provider topic delivery
Verify Telegram accepted-message topics before follow-up sends, preserving partial-delivery evidence instead of trusting requested routing.

Co-authored-by: Lu Wang <7668944+wangwllu@users.noreply.github.com>
2026-08-06 15:06:39 +05:30
amittell d85920c03e fix(telegram): preserve truthful empty-content delivery (#88810)
* fix(telegram): skip empty rendered text deliveries
* fix(telegram): preserve empty delivery outcomes

---------

Co-authored-by: amittell <1388680+amittell@users.noreply.github.com>
2026-08-05 18:41:38 +05:30
Peter Steinberger ad37e91fbb refactor(telegram): consolidate outbound contracts and targets (#119438) 2026-08-04 20:33:45 -07:00
alfredjbclaw b6a445c393 fix(telegram): preserve later chunks after rejected sends
Prevent Telegram long replies from silently losing their tail after definite per-chunk rejections. Preserve accepted message IDs and explicit partial-delivery state across durable, rich fallback, and streamed replies.

Co-authored-by: alfredjbclaw <alfredjbclaw@users.noreply.github.com>
2026-08-04 14:06:18 +05:30
tangtaizong666 2ea3b0da98 fix(telegram): record automatic delivery message ids
Record every accepted Telegram automatic delivery in the scoped sent-message ledger, including finalized streaming previews. This restores bot-owned reaction checks and removes the per-send full-ledger expiry scan.
2026-08-04 10:45:00 +05:30
Peter Steinberger 474c4e671e fix(telegram): preserve tables across legacy message delivery (#118257)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-08-02 15:32:46 -07:00
Vincent Koc b84e14f222 fix(telegram): ignore commands for other bots (#118024) 2026-08-03 00:25:50 +08:00
Peter Steinberger ceb8a8b3a1 fix(telegram): preserve transient getFile responses when retrying media (#117798)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-08-01 22:11:26 -07:00
Peter Steinberger b8b4a11b38 refactor(telegram): unify outbound media delivery (#117102) 2026-07-31 16:46:22 -07:00
Peter Steinberger 4996474178 fix(telegram): preserve outbound media metadata and rejected photos (#116886)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 09:33:27 -07:00
Peter Steinberger de5ab5e1d4 fix(telegram): preserve inbound polls and batched text entities (#116898)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 08:52:37 -07:00
Peter Steinberger 77b3667757 fix(telegram): budget media captions by visible text (#116892)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 08:11:55 -07:00
joshavant cfa98bdf00 fix(telegram): emit sent hook for finalized previews 2026-07-29 23:31:53 -05:00
joshavant ea66298621 fix(telegram): wire topic mutation policy 2026-07-22 21:14:53 -05: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
Jason (Json) 047232bd16 fix(telegram): fall back for web apps outside DMs (#111116) 2026-07-18 19:52:19 -06:00
Peter Steinberger cfaa30a08f fix(release): align Codex discovery and Telegram traces 2026-07-16 21:54:11 +01:00
Peter Steinberger 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
Ayaan Zaidi 02a5ce6306 refactor(telegram): split rich block modules under lint budgets 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
Peter Steinberger f81f9d8570 chore: enforce max-lines suppression ratchet (#107315)
* ci: enforce max-lines suppression ratchet

* chore: prune stale max-lines suppression

* fix: close max-lines ratchet enforcement gaps

* fix: harden max-lines ratchet checks

* fix(ci): satisfy max-lines ratchet checks

* style: format max-lines declarations

* fix(ci): match oxlint suppression grammar

* test: isolate max-lines git fixtures

* chore: prune resolved max-lines debt

* test: skip newline path fixture on Windows

* fix: harden max-lines suppression ratchet

* chore: refresh max-lines baseline

* fix: close max-lines ratchet bypasses

* fix: derive ratchet base from PR merge tree

* fix: support older Git in staged ratchet

* fix: align max-lines declarations and baseline

* chore: refresh max-lines baseline for current main

* fix: exclude generated wizard locales from max-lines

* chore: prune resolved max-lines debt
2026-07-14 09:27:02 -07:00
Peter Steinberger d262cad41f refactor: burn down Matrix, Telegram, and outbound dead exports (#106153)
* refactor(matrix): remove unused internal exports

* refactor(telegram): remove unused internal exports

* refactor(matrix): remove stale thread binding imports

* refactor(outbound): remove unused internal exports

* style(outbound): format dead export cleanup
2026-07-13 04:39:58 -07:00
Peter Steinberger 61a9b49cea refactor(telegram): remove dead private exports (#106175)
* refactor(extensions): trim channel-private exports

* chore(deadcode): refresh Telegram export baseline

* fix(telegram): drop unused media import

* refactor(telegram): drop dead media re-export

* style(telegram): format media runtime imports
2026-07-13 01:46:24 -07:00
Peter Steinberger 774d5249cc test: eliminate unchecked TypeScript casts (#105804) 2026-07-12 18:08:26 -07:00
Peter Steinberger 508f6a2996 refactor(config): retire legacy flat streaming keys to doctor-owned migration (#104693)
* chore(config): regenerate bundled channel config metadata for retired flat streaming keys

* refactor(config): retire legacy flat streaming keys to doctor-owned migration

* fix(config): restore zod locale installer dropped in rebase and repin SDK surface
2026-07-11 18:15:03 -07:00
Peter Steinberger 81a201df26 feat: add portable table presentation blocks (#103583)
* feat(presentation): add portable table blocks

* chore(presentation): refresh generated contracts

* fix(slack): preserve table fallback payloads

* docs(changelog): note portable message tables

* fix(presentation): preserve cross-channel fallback delivery

* chore(plugin-sdk): refresh rebased contracts

* test(slack): align accessibility expectations

* fix(presentation): harden cross-channel fallback delivery

* chore(plugin-sdk): refresh rebased contracts

* docs(changelog): defer portable table release note

* fix(presentation): satisfy extension lint

* chore(plugin-sdk): refresh surface budgets

* fix(telegram): preserve reactions after progress replies

* fix(slack): preserve rendered preview fallback text

* fix(feishu): preserve oversized presentation fallbacks

* docs(changelog): note portable message tables

* docs(changelog): defer portable table release note

* chore(plugin-sdk): refresh rebased contracts

---------

Co-authored-by: Peter Steinberger <steipete@openai.com>
2026-07-10 22:29:13 -07:00
chenyangjun-xy b58029f4fd fix(telegram): preserve outbound prompt context projections (#102469)
* fix(telegram): preserve outbound prompt context projections

Co-authored-by: 陈杨俊0668000971 <chen.yangjun@xydigit.com>

* fix(telegram): satisfy legacy sender lint

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-10 18:25:54 -07:00
Alix-007 26aef8c48b fix(telegram): recover when media downloads stall (#103020)
* fix(telegram): add request timeout to media file downloads

* fix(telegram): bound inbound media startup

Co-authored-by: llagy009 <0668001470@xydigit.com>

Co-authored-by: Alix-007 <li.long15@xydigit.com>

* docs(changelog): note Telegram media recovery

* fix(net): normalize preflight abort errors

* test(media): accept nullable request signals

* fix(telegram): abort webhook media on shutdown

* fix(telegram): own webhook media cancellation

* fix(telegram): retry aborted media groups

* fix(telegram): cancel isolated media work

* fix(telegram): stop draining ended polling cycles

* fix(telegram): separate cycle media cancellation

* fix(telegram): preserve live polling media fallbacks

* chore: move release note to PR body

---------

Co-authored-by: llagy009 <0668001470@xydigit.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-10 14:31:16 +01:00
Peter Steinberger d133f28cfb fix: preserve selected models through hot reloads and fallbacks (#103510)
* fix(agents): keep model fallback turn-local instead of persisting over user pins

* fix(telegram): use live config snapshots per operation

Co-authored-by: Ayaan Zaidi <hi@obviy.us>

* test(telegram): fix config snapshot type coverage

---------

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-07-10 08:26:33 +01:00
Ayaan Zaidi 01f6593ea5 fix(telegram): reduce durable empty-rich guard to skip 2026-07-07 14:14:03 +05:30