Commit Graph

1194 Commits

Author SHA1 Message Date
Peter Steinberger ecc49b5a87 refactor(tts): absorb speech core package (#118513)
* refactor(tts): absorb speech core package

* fix(tts): preserve runtime SDK exports

* refactor(tts): remove private package exports

* test(tts): align canonical runtime mocks

* test(tts): complete canonical settings mocks

* chore(plugin-sdk): regenerate API baseline for #118513
2026-08-03 02:25:48 -07:00
Peter Steinberger 0cad02313a test(tool-call-repair): consolidate stream fixtures (#118563) 2026-08-03 00:50:11 -07:00
joshavant d0439b9ce0 fix: distinguish dismissed task delivery 2026-08-03 02:48:34 -05:00
joshavant 6ca16f7f3d fix: redrive retained text completions 2026-08-03 02:48:34 -05:00
joshavant d9393bd3cb fix: make subagent completion delivery durable 2026-08-03 02:48:34 -05:00
Peter Steinberger 1140e56a37 test(ai): deduplicate legacy function-call fixtures (#118445) 2026-08-02 21:24:46 -07:00
Peter Steinberger 88e588090f refactor(gateway): compact validator registry imports (#118379) 2026-08-02 19:55:52 -07:00
Peter Steinberger 357087b9c7 refactor(gateway): lifecycle-owned ambient state via factory-registered drains (#118271)
* refactor(runtime): own ambient state lifecycle cleanup

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

* fix(runtime): restore agent wait listener lifecycle

Keep agent-job data process-shared while preserving module-local event subscription ownership. Ratchet the public wildcard budget down after replacing text-runtime's wildcard singleton export with named exports.
2026-08-02 18:06:46 -07:00
Peter Steinberger c43ba8e3fc fix(cli): speed up hook status reads through the Gateway (#118288)
* perf(cli): reuse gateway hook status (#118222)

* chore(protocol): register hooks.status schema module in generated surfaces
2026-08-02 17:21:28 -07:00
Peter Steinberger 88d6a2c8d6 perf(gateway): reduce sessions.list read amplification under streaming load (#118207)
* perf(gateway): reduce sessions list read amplification

* test(gateway): stabilize title batch perf proof

* fix(gateway): satisfy sessions list CI contracts

* perf(gateway): reuse warm batch title fields

* fix(gateway): satisfy strict title cache types

* test(gateway): use transcript write scope in cache test

* fix(gateway): fence session list cache on active runs

* refactor(infra): extract agent run registry

* fix(infra): keep run-registry context types module-local
2026-08-02 16:08:07 -07:00
Peter Steinberger 30c79e4db1 fix(inference): prevent lost cancellation, stuck compaction, and runaway tools (#118146)
* fix(inference): preserve cancellations, compaction, and tool-loop safety

* fix(inference): satisfy Codex and mock-provider type checks

* fix(codex): secure tool-free recovery and restricted turns

* fix(codex): satisfy host-prompt provenance lint
2026-08-02 14:42:01 -07:00
Peter Steinberger 3f3ceb2def feat(gateway): track event-loop degradation persistence and add concurrency benchmark (#118193)
* feat(gateway): persist event loop degradation metrics

* fix(gateway): bound concurrency benchmark turn waits
2026-08-02 14:21:44 -07:00
Peter Steinberger 70876c9790 perf(gateway): remove streaming hot-path rescans (#118192) 2026-08-02 14:07:24 -07:00
Peter Steinberger b695c6589a test(memory): consolidate host process fixtures (#118160) 2026-08-02 13:19:01 -07:00
Peter Steinberger 08d0952df2 feat(cron): auto-disable repeatedly failing recurring jobs (#118113)
Refs #118089

Release note: recurring automations now auto-disable after 10 consecutive run failures, record the reason, and notify their owning agent.
2026-08-02 11:51:17 -07:00
Peter Steinberger fb380b2e87 test(ai): consolidate provider fixtures (#118078) 2026-08-02 11:08:52 -07:00
ruel225 f2b3d1588f fix(workboard): diagnose archived cards still in an active status (#116359) (#117290)
* fix(workboard): diagnose archived cards still in an active status

An archived card with an active status (ready/running/blocked/etc.) was
silently excluded from dispatch with no signal on any surface —
workboard show rendered it normally, dispatch returned count:0 with empty
startFailures, and computeCardDiagnostics returned [] for archived cards.
Operators could only find it by reading the database directly.

Add an archived_but_active diagnostic kind to WORKBOARD_DIAGNOSTIC_KINDS
and an unarchive action. In computeCardDiagnostics, when a card has
archivedAt set but status is not done, emit the warning so workboard show
and store.diagnostics report it. Done+archived cards stay silent (no
diagnostic) as before. The diagnostic is transient — refreshDiagnostics
still skips archived cards, so their stored metadata is not rewritten.

Fixes #116359

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(workboard): expose archived active cards

* ci: re-trigger after sqlite flip-proof e2e flake

Unrelated to workboard diagnostic changes; sqlite session/transcript
flip-proof e2e failed with array mismatch on an untouched path.

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: ruel225 <ruel225@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-08-02 07:30:52 -07:00
Simone 3f9b4519a9 fix: prevent fractional chunk limits from stalling text splitting (#117727)
* fix: normalize fractional text chunk limits

* fix: normalize markdown chunk limits

* fix: normalize direct newline chunk limits

* fix(matrix): reuse progress-safe text chunker

* test(matrix): align runtime API guard

* test(matrix): keep outbound shard topology stable

* fix(matrix): preserve facade chunk compatibility

* test(matrix): keep runtime export guard stable

* fix(matrix): normalize render-aware chunk limits

* test(matrix): type real-send assertions

* fix(matrix): preserve one-unit event limits

---------

Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-08-02 04:53:31 -05:00
Peter Steinberger a5b8b7052b fix(ui): preserve advanced cron delivery settings when cloning (#117909)
* refactor(ui): consolidate task and log contracts

* fix(cron): preserve advanced delivery routing

* refactor(ui): share relative-time bucketing

* fix(ui): retain narrow cron view types

* fix(ui): keep cron form field keys total

* style(ui): use narrowed task result boolean
2026-08-02 02:13:38 -07:00
Sebastien Tardif b300a0cfb3 fix(agents): cap DeepSeek DSML recovery buffer at 256 KB (#117175)
Co-authored-by: Sebastien Tardif <1413412+SebTardif@users.noreply.github.com>
2026-08-02 15:12:38 +08:00
Peter Steinberger 60f2c6faf9 test(protocol): consolidate validation fixtures (#117873) 2026-08-01 23:42:09 -07:00
Peter Steinberger 33ea3e16e9 refactor: consolidate core micro-helpers (#117825)
* refactor: centralize stable stringification

* refactor: reuse canonical record coercion

* refactor: reuse safe JSON parsing in cron storage

* refactor: centralize environment truthiness

* fix: enforce model scan and block reply timeouts

* refactor: consolidate signal-aware sleep helper

* fix: preserve plugin SDK sleep contract

* test: satisfy model scan timeout lint
2026-08-01 23:10:46 -07:00
Peter Steinberger 0ab2443692 fix(ui): eliminate core contract drift (#117817)
* fix(ui): eliminate core contract drift

* fix(ui): resolve cleanup contract checks
2026-08-01 22:10:22 -07:00
Peter Steinberger e98fdeefdf refactor(errors): consolidate message formatting (#117818) 2026-08-01 22:05:49 -07:00
Peter Steinberger d669e9eddd refactor(tui): centralize gateway chat history limits (#117773)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-08-01 20:34:49 -07:00
Peter Steinberger 7d1d721d62 fix(memory): qualify stale memory search results (#117706)
* fix(memory): qualify stale search results

* fix(memory): satisfy staleness checks

* fix(memory): normalize absent staleness
2026-08-01 17:40:14 -07:00
Peter Steinberger 5c2f935fc9 test(sdk): deduplicate client and event fixtures (#117692) 2026-08-01 16:48:50 -07:00
Omar Shahine 2b3009f718 fix(gateway): preserve node invoke dispatch provenance (#117139)
* fix(gateway): preserve node invoke dispatch provenance

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6381c461-11aa-4700-8648-4da1393e1c59

* fix(gateway): preserve timeout precedence

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6381c461-11aa-4700-8648-4da1393e1c59

* fix(gateway): mark wake-path disconnect as not dispatched

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6381c461-11aa-4700-8648-4da1393e1c59

* fix(gateway): mark plugin dispatch after send

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6381c461-11aa-4700-8648-4da1393e1c59

* build(browser): regenerate Copilot runtime

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6381c461-11aa-4700-8648-4da1393e1c59

---------

Co-authored-by: Omar Shahine <10343873+omarshahine@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6381c461-11aa-4700-8648-4da1393e1c59
2026-08-01 21:22:51 +00:00
Omar Shahine a624ba7b96 feat(gateway): advertise chat attachment limits on hello-ok (#116188)
* feat(gateway): advertise chat attachment limits on hello-ok

Clients had no way to learn the gateway attachment ceilings, so external
clients hardcoded guesses that drifted from server enforcement. Publish the
two unconditional decoded-size ceilings on hello-ok policy.attachments from
one shared resolver so advertised values cannot drift from the parser.

MIME acceptance and per-message counts stay server-side: they depend on the
entrypoint, the resolved model, and payload sniffing, so they cannot be stated
once per connection.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 17d6c355-8948-4b48-a936-e08b1c8806ef

* feat(gateway): advertise chat attachment limits on hello-ok

---------

Co-authored-by: Omar Shahine <10343873+omarshahine@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: clawsweeper <274271284+clawsweeper[bot]@users.noreply.github.com>
Copilot-Session: 17d6c355-8948-4b48-a936-e08b1c8806ef
2026-08-01 11:31:29 -07:00
Vincent Koc 263741b1f0 fix(ci): align release validation fixtures (#117494)
* fix(release): align beta 6 e2e fixtures

* fix(doctor): preserve missing state startup signal

* test(release): align beta e2e contracts

* test(agents): use canonical empty auth store

* test(agents): isolate prompt cooldown scheduling

* test(release): align main validation fixtures

* test(release): accept Code Mode plugin tool evidence

* fix(test): repair release validation checks

* test(cron): assert structured session targets
2026-08-02 00:39:36 +08:00
Vincent Koc 1130f30445 fix(diagnostics): report provider HTTP status in timelines (#117403)
* fix(diagnostics): record provider response status

* fix(diagnostics): report managed Responses status
2026-08-01 23:36:20 +08:00
zengLingbiao a172857acc fix(memory-host-sdk): decode JSON response bodies with fatal UTF-8 validation (#111279) 2026-08-01 07:08:04 -07:00
Peter Steinberger 597699401a refactor(memory): use sqlite transcript identities (#117334) 2026-08-01 04:38:40 -07:00
Yiğit ERDOĞAN afe024e8c7 fix(ai): assistant text blocks are run together on replay (#115743)
Chat Completions replay flattened every assistant text block with an empty
separator, so two distinct blocks came back as one word-joined sentence. The
same message shape survives distinctly on the Anthropic, Responses and Mistral
lanes, and the string-content flattener for strict OpenAI-compatible servers
already joins with a newline.

Two blocks arise routinely: streaming opens a new text block after a tool call,
and cross-model replay converts a thinking block into a text block.
2026-08-01 02:23:08 -07:00
Peter Steinberger b721cffa44 fix(inference): simplify lifecycle and preserve Codex tool identity (#117298) 2026-08-01 02:05:45 -07:00
Vincent Koc 05b46b48a0 merge: refresh talk lifecycle on main
* origin/main: (41 commits)
  test(ci): update memory helper routing expectation (#117295)
  fix(canvas): emit successful control results in JSON mode (#117297)
  fix(imessage): settle native inbound reply delivery (#117282)
  fix(agents): reject invalid UTF-8 LSP responses (#117271)
  fix(line): centralize card and template message alt text (#117280)
  fix(release): validate candidates before Docker publication (#117252)
  fix(media): validate provider-owned generated media downloads (#117281)
  fix(feishu): restore custom HTTPS API domains (#117278)
  fix(models): reuse prepared plugin metadata (#117131)
  fix(agents): stop fallback after delivered-but-failed attempts (#114628)
  fix(memory): reuse targeted session corpus snapshot (#117247)
  fix(matrix): reconcile durable sends after response loss
  test(release): repair full validation regressions (#116931)
  fix(linux-canvas): report socket watcher fallback (#109502)
  fix(codex): preserve authoritative turn completion (#117185)
  fix(canvas): preserve widgets across derived-name collisions (#117132)
  fix(channels): config validation rejects documented channels.<id>.configWrites on 13 channels (#117206)
  fix(msteams): prevent duplicate final replies (#116398)
  fix(doctor): session SQLite restore installs an empty session index over the valid archive (#117221)
  fix(plugins): preserve workspace plugins across CLI and control UI (#117265)
  ...
2026-08-01 16:43:54 +08:00
Harjoth Khara b97a214604 fix(canvas): preserve widgets across derived-name collisions (#117132)
Fixes #116945
2026-08-01 15:33:56 +08:00
Vincent Koc 8fdcdaba76 fix(talk): bound browser transcript ownership 2026-08-01 14:39:27 +08:00
Peter Steinberger 1f9ee89f25 fix(google): preserve canonical replay and provider error ownership (#117193)
* fix(google): preserve provider signatures and failure outcomes

* fix(google): satisfy SDK stream event and optional text types

* fix(google): preserve signed empty SDK response parts

---------

Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 22:52:45 -07:00
RileyJJY c7917cca36 fix(google-vertex): ignore blank project env (#109515) 2026-07-31 22:03:40 -07:00
Peter Steinberger 618f3298c7 fix(memory): reject malformed direct and batch embedding vectors (#117200)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 21:38:31 -07:00
Peter Steinberger cb16d739cf fix(inference): harden Codex streaming, cancellation, and live QA (#116012)
* fix(inference): harden Codex turns, streams, and live QA

* fix(inference): dispatch open CR-delimited response frames

* fix(inference): finish live goal and split streaming regressions

* fix(codex): wait for interrupted turn completion

* fix(codex): narrow terminal collector notification ownership

* fix(inference): harden completion authority and lifecycle

* fix(inference): use canonical source delivery contract

* test(inference): align lifecycle probes with current main

* style(inference): format source delivery verification

* fix(goals): prevent premature completion across staged work

* fix(qa): settle streamed goal turns before continuation

* fix(goals): require visible replies after goal completion

* test(qa): keep goal flow regressions within lint limits
2026-07-31 21:29:33 -07:00
Paco Cartones cb3cd94756 fix(net-policy): redact sig and x-* auth params in URLs and bodies (#116957)
* fix(redact): redact sig and x-* auth params (redact-sensitive-url.ts)

* test(redact): redact sig and x-* auth params (redact-sensitive-url.test.ts)

* fix(redact): redact sig and x-* auth params (redact.ts)

* test(redact): redact sig and x-* auth params (redact.test.ts)

* fix(logging): unify URL credential redaction

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-08-01 10:04:13 +08:00
Yiğit ERDOĞAN ec5fb470c2 fix(ai): Codex stream shows internal parser text on a malformed frame (#116966)
* fix(ai): Codex stream shows internal parser text on a malformed frame

The Codex SSE parse boundary rethrew JSON.parse failures with its own
message, so the three consumers that key off the shared malformed-fragment
marker by exact string equality could not recognise it and the internal
parser wording reached the operator verbatim.

Mirror the canonical transport contract instead: a SyntaxError becomes the
shared marker with the original error kept as cause, and anything else is
rethrown untouched. The WebSocket twin is left alone because two open PRs
own that block today.

* fix(ai): preserve consumer SSE errors

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-08-01 09:34:09 +08:00
Peter Steinberger 95e50d3a7f fix(terminal): measure unicode display width consistently (#117062)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 18:25:15 -07:00
Peter Steinberger d8ba00f8a2 fix(openai): clear ChatGPT SSE fallback per session (#117123)
* fix(openai): clear ChatGPT SSE fallback per session

* test(openai): prove ChatGPT fallback cleanup

* docs(openai): clarify fallback cleanup ownership
2026-07-31 18:24:46 -07:00
Peter Steinberger f8aa383698 fix(mistral): reject incomplete streamed tool terminals (#117137)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 18:22:35 -07:00
Peter Steinberger a7e0ebe8e6 fix(ai): preserve structured chat content and refusals (#117136)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 18:20:23 -07:00
Vincent Koc a1c689e375 fix(outbound): preserve fenced tool call examples (#117089) 2026-08-01 08:13:05 +08:00
Peter Steinberger e4d6e5603d refactor(ai): unify Anthropic streaming policy and usage accounting (#117086)
* refactor(ai): unify Anthropic streaming policy and usage accounting

* fix(ai): align shared cache TTL types with Anthropic SDK
2026-07-31 16:28:53 -07:00